@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,79 @@
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { IonCard, IonCol, IonGrid, IonIcon, IonInput, IonItem, IonItemDivider, IonLabel, IonRow, IonSelect, IonSelectOption, } from '@ionic/angular/standalone';
4
+ import * as i0 from "@angular/core";
5
+ const phoneTypes = [
6
+ { id: 'personal', title: 'Personal' },
7
+ { id: 'mobile', title: 'Mobile' },
8
+ { id: 'landline', title: 'Landline' },
9
+ { id: 'work', title: 'Work' },
10
+ { id: 'fax', title: 'Fax' },
11
+ ];
12
+ const emptyPhones = [
13
+ { type: 'personal', number: '' },
14
+ { type: 'work', number: '' },
15
+ ];
16
+ export class PhonesFormComponent {
17
+ constructor() {
18
+ this.disabled = false;
19
+ this.hideHeader = false;
20
+ this.isActiveInWizard = false;
21
+ this.types = phoneTypes;
22
+ this.phones = emptyPhones;
23
+ this.phonesChange = new EventEmitter();
24
+ }
25
+ ngOnChanges(changes) {
26
+ const phonesChange = changes['phones'];
27
+ if (phonesChange && !phonesChange.currentValue) {
28
+ this.phones = emptyPhones;
29
+ }
30
+ }
31
+ typeChanged(event, i) {
32
+ event.stopPropagation();
33
+ if (this.phones) {
34
+ this.phones[i] = {
35
+ ...this.phones[i],
36
+ type: event.detail.value,
37
+ };
38
+ }
39
+ }
40
+ numberChanged(event, i) {
41
+ event.stopPropagation();
42
+ if (this.phones) {
43
+ this.phones[i] = {
44
+ ...this.phones[i],
45
+ number: event.detail.value,
46
+ };
47
+ }
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PhonesFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
50
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: PhonesFormComponent, isStandalone: true, selector: "sneat-phones-form", inputs: { disabled: "disabled", hideHeader: "hideHeader", isActiveInWizard: "isActiveInWizard", phones: "phones" }, outputs: { phonesChange: "phonesChange" }, usesOnChanges: true, ngImport: i0, template: "<ion-card>\n @if (!hideHeader) {\n <ion-item-divider [color]=\"isActiveInWizard ? 'primary' : 'light'\">\n <ion-label>\n <ion-icon name=\"call\" class=\"ion-margin-end\" />\n Phone numbers\n </ion-label>\n </ion-item-divider>\n }\n\n <ion-grid class=\"ion-grid-layout\">\n @for (phone of phones; track phone.type + phone.number; let i = $index) {\n <ion-row>\n <ion-col size=\"auto\">\n <ion-item>\n <ion-select\n interface=\"popover\"\n [disabled]=\"true\"\n [value]=\"phone.type\"\n (ionChange)=\"typeChanged($event, i)\"\n >\n @for (t of types; track t.id) {\n <ion-select-option [value]=\"t.id\" [disabled]=\"disabled\">\n {{ t.title }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n </ion-col>\n\n <ion-col>\n <ion-item>\n <ion-input\n type=\"tel\"\n placeholder=\"phone #\"\n [disabled]=\"disabled\"\n [value]=\"phone.number\"\n (ionChange)=\"numberChanged($event, i)\"\n (ionBlur)=\"numberChanged($event, i)\"\n />\n </ion-item>\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-card>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonItemDivider, selector: "ion-item-divider", inputs: ["color", "mode", "sticky"] }, { 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: IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: IonRow, selector: "ion-row" }, { kind: "component", type: IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { 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: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PhonesFormComponent, decorators: [{
53
+ type: Component,
54
+ args: [{ selector: 'sneat-phones-form', imports: [
55
+ FormsModule,
56
+ IonCard,
57
+ IonItemDivider,
58
+ IonLabel,
59
+ IonIcon,
60
+ IonGrid,
61
+ IonRow,
62
+ IonCol,
63
+ IonItem,
64
+ IonSelect,
65
+ IonSelectOption,
66
+ IonInput,
67
+ ], template: "<ion-card>\n @if (!hideHeader) {\n <ion-item-divider [color]=\"isActiveInWizard ? 'primary' : 'light'\">\n <ion-label>\n <ion-icon name=\"call\" class=\"ion-margin-end\" />\n Phone numbers\n </ion-label>\n </ion-item-divider>\n }\n\n <ion-grid class=\"ion-grid-layout\">\n @for (phone of phones; track phone.type + phone.number; let i = $index) {\n <ion-row>\n <ion-col size=\"auto\">\n <ion-item>\n <ion-select\n interface=\"popover\"\n [disabled]=\"true\"\n [value]=\"phone.type\"\n (ionChange)=\"typeChanged($event, i)\"\n >\n @for (t of types; track t.id) {\n <ion-select-option [value]=\"t.id\" [disabled]=\"disabled\">\n {{ t.title }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n </ion-col>\n\n <ion-col>\n <ion-item>\n <ion-input\n type=\"tel\"\n placeholder=\"phone #\"\n [disabled]=\"disabled\"\n [value]=\"phone.number\"\n (ionChange)=\"numberChanged($event, i)\"\n (ionBlur)=\"numberChanged($event, i)\"\n />\n </ion-item>\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-card>\n" }]
68
+ }], propDecorators: { disabled: [{
69
+ type: Input
70
+ }], hideHeader: [{
71
+ type: Input
72
+ }], isActiveInWizard: [{
73
+ type: Input
74
+ }], phones: [{
75
+ type: Input
76
+ }], phonesChange: [{
77
+ type: Output
78
+ }] } });
79
+ //# sourceMappingURL=phones-form.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phones-form.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/phones-form/phones-form.component.ts","../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/phones-form/phones-form.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,EAEL,MAAM,GAEP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,OAAO,EACP,MAAM,EACN,OAAO,EACP,OAAO,EACP,QAAQ,EACR,OAAO,EACP,cAAc,EACd,QAAQ,EACR,MAAM,EACN,SAAS,EACT,eAAe,GAChB,MAAM,2BAA2B,CAAC;;AAKnC,MAAM,UAAU,GAAuC;IACrD,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACrC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACjC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACrC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC7B,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;CAC5B,CAAC;AAEF,MAAM,WAAW,GAAa;IAC5B,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;IAChC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;CAC7B,CAAC;AAoBF,MAAM,OAAO,mBAAmB;IAlBhC;QAmBW,aAAQ,GAAG,KAAK,CAAC;QAEjB,eAAU,GAAG,KAAK,CAAC;QACnB,qBAAgB,GAAG,KAAK,CAAC;QAEzB,UAAK,GAAG,UAAU,CAAC;QAEnB,WAAM,GAAc,WAAW,CAAC;QACtB,iBAAY,GAAG,IAAI,YAAY,EAAY,CAAC;KA4BhE;IA1BC,WAAW,CAAC,OAAsB;QAChC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAY,EAAE,CAAS;QACjC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;gBACf,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjB,IAAI,EAAG,KAAqB,CAAC,MAAM,CAAC,KAAK;aAC1C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAAY,EAAE,CAAS;QACnC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;gBACf,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjB,MAAM,EAAG,KAAqB,CAAC,MAAM,CAAC,KAAK;aAC5C,CAAC;QACJ,CAAC;IACH,CAAC;8GApCU,mBAAmB;kGAAnB,mBAAmB,iQCzDhC,o2CA8CA,2CDHI,WAAW,+BACX,OAAO,yLACP,cAAc,kGACd,QAAQ,6FACR,OAAO,2JACP,OAAO,wEACP,MAAM,oDACN,MAAM,kTACN,OAAO,0NACP,SAAS,kVACT,eAAe,6FACf,QAAQ;;2FAGC,mBAAmB;kBAlB/B,SAAS;+BACE,mBAAmB,WAEpB;wBACP,WAAW;wBACX,OAAO;wBACP,cAAc;wBACd,QAAQ;wBACR,OAAO;wBACP,OAAO;wBACP,MAAM;wBACN,MAAM;wBACN,OAAO;wBACP,SAAS;wBACT,eAAe;wBACf,QAAQ;qBACT;;sBAGA,KAAK;;sBAEL,KAAK;;sBACL,KAAK;;sBAIL,KAAK;;sBACL,MAAM","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n IonCard,\n IonCol,\n IonGrid,\n IonIcon,\n IonInput,\n IonItem,\n IonItemDivider,\n IonLabel,\n IonRow,\n IonSelect,\n IonSelectOption,\n} from '@ionic/angular/standalone';\nimport { IPhone } from '@sneat/contactus-core';\n\ntype PhoneType = 'personal' | 'mobile' | 'work' | 'fax' | 'landline';\n\nconst phoneTypes: { id: PhoneType; title: string }[] = [\n { id: 'personal', title: 'Personal' },\n { id: 'mobile', title: 'Mobile' },\n { id: 'landline', title: 'Landline' },\n { id: 'work', title: 'Work' },\n { id: 'fax', title: 'Fax' },\n];\n\nconst emptyPhones: IPhone[] = [\n { type: 'personal', number: '' },\n { type: 'work', number: '' },\n];\n\n@Component({\n selector: 'sneat-phones-form',\n templateUrl: './phones-form.component.html',\n imports: [\n FormsModule,\n IonCard,\n IonItemDivider,\n IonLabel,\n IonIcon,\n IonGrid,\n IonRow,\n IonCol,\n IonItem,\n IonSelect,\n IonSelectOption,\n IonInput,\n ],\n})\nexport class PhonesFormComponent implements OnChanges {\n @Input() disabled = false;\n\n @Input() hideHeader = false;\n @Input() isActiveInWizard = false;\n\n readonly types = phoneTypes;\n\n @Input() phones?: IPhone[] = emptyPhones;\n @Output() readonly phonesChange = new EventEmitter<IPhone[]>();\n\n ngOnChanges(changes: SimpleChanges): void {\n const phonesChange = changes['phones'];\n if (phonesChange && !phonesChange.currentValue) {\n this.phones = emptyPhones;\n }\n }\n\n typeChanged(event: Event, i: number): void {\n event.stopPropagation();\n if (this.phones) {\n this.phones[i] = {\n ...this.phones[i],\n type: (event as CustomEvent).detail.value,\n };\n }\n }\n\n numberChanged(event: Event, i: number): void {\n event.stopPropagation();\n if (this.phones) {\n this.phones[i] = {\n ...this.phones[i],\n number: (event as CustomEvent).detail.value,\n };\n }\n }\n}\n","<ion-card>\n @if (!hideHeader) {\n <ion-item-divider [color]=\"isActiveInWizard ? 'primary' : 'light'\">\n <ion-label>\n <ion-icon name=\"call\" class=\"ion-margin-end\" />\n Phone numbers\n </ion-label>\n </ion-item-divider>\n }\n\n <ion-grid class=\"ion-grid-layout\">\n @for (phone of phones; track phone.type + phone.number; let i = $index) {\n <ion-row>\n <ion-col size=\"auto\">\n <ion-item>\n <ion-select\n interface=\"popover\"\n [disabled]=\"true\"\n [value]=\"phone.type\"\n (ionChange)=\"typeChanged($event, i)\"\n >\n @for (t of types; track t.id) {\n <ion-select-option [value]=\"t.id\" [disabled]=\"disabled\">\n {{ t.title }}\n </ion-select-option>\n }\n </ion-select>\n </ion-item>\n </ion-col>\n\n <ion-col>\n <ion-item>\n <ion-input\n type=\"tel\"\n placeholder=\"phone #\"\n [disabled]=\"disabled\"\n [value]=\"phone.number\"\n (ionChange)=\"numberChanged($event, i)\"\n (ionBlur)=\"numberChanged($event, i)\"\n />\n </ion-item>\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-card>\n"]}
@@ -0,0 +1,125 @@
1
+ import { Component, computed, EventEmitter, inject, Input, input, Output, signal, } from '@angular/core';
2
+ import { FamilyMemberRelation, MemberRelationshipOther, MemberRelationshipUndisclosed, relationshipTitle, } from '@sneat/contactus-core';
3
+ import { WithSpaceInput } from '@sneat/space-services';
4
+ import { SpaceService } from '@sneat/space-services';
5
+ import { ClassName } from '@sneat/ui';
6
+ import { RelationshipFormComponent } from './relationship-form.component';
7
+ import * as i0 from "@angular/core";
8
+ const getRelOptions = (r) => [
9
+ ...r.map((id) => ({ id, title: relationshipTitle(id) })),
10
+ { id: MemberRelationshipOther, title: 'Other' },
11
+ { id: MemberRelationshipUndisclosed, title: 'Undisclosed' },
12
+ ];
13
+ export class ContactRelationshipFormComponent extends WithSpaceInput {
14
+ constructor() {
15
+ super();
16
+ this.$contactID = input.required(...(ngDevMode ? [{ debugName: "$contactID" }] : []));
17
+ this.$itemRef = computed(() => {
18
+ const spaceID = this.$spaceID();
19
+ const itemID = this.$contactID();
20
+ return spaceID && itemID
21
+ ? {
22
+ spaceID,
23
+ module: 'contactus',
24
+ collection: 'contacts',
25
+ itemID,
26
+ }
27
+ : undefined;
28
+ }, ...(ngDevMode ? [{ debugName: "$itemRef" }] : []));
29
+ this.$ageGroup = input.required(...(ngDevMode ? [{ debugName: "$ageGroup" }] : []));
30
+ this.$relatedTo = input.required(...(ngDevMode ? [{ debugName: "$relatedTo" }] : []));
31
+ this.$isProcessing = signal(false, ...(ngDevMode ? [{ debugName: "$isProcessing" }] : []));
32
+ this.$userSpaceContactID = input.required(...(ngDevMode ? [{ debugName: "$userSpaceContactID" }] : []));
33
+ this.isActive = false;
34
+ this.disabled = false;
35
+ this.relatedAsChange = new EventEmitter();
36
+ this.spaceService = inject(SpaceService);
37
+ this.$relationshipOptions = computed(() => {
38
+ switch (this.$spaceType()) {
39
+ case 'family': {
40
+ return getRelOptions(this.$ageGroup() === 'child'
41
+ ? [
42
+ FamilyMemberRelation.child,
43
+ FamilyMemberRelation.sibling,
44
+ FamilyMemberRelation.cousin,
45
+ ]
46
+ : [
47
+ FamilyMemberRelation.spouse,
48
+ FamilyMemberRelation.partner,
49
+ FamilyMemberRelation.child,
50
+ FamilyMemberRelation.sibling,
51
+ FamilyMemberRelation.cousin,
52
+ FamilyMemberRelation.parent,
53
+ FamilyMemberRelation.parentInLaw,
54
+ FamilyMemberRelation.grandparent,
55
+ FamilyMemberRelation.grandparentInLaw,
56
+ ]);
57
+ }
58
+ default:
59
+ return [];
60
+ }
61
+ }, ...(ngDevMode ? [{ debugName: "$relationshipOptions" }] : []));
62
+ }
63
+ onRelatedAsChanged(relatedChange) {
64
+ const contactID = this.$contactID();
65
+ const spaceID = this.$spaceID();
66
+ if (!contactID) {
67
+ const relRoles = {};
68
+ relatedChange.remove?.rolesToItem?.forEach((role) => delete relRoles[role]);
69
+ relatedChange.add?.rolesToItem?.forEach((role) => (relRoles[role] = { created: { at: '', by: '' } }));
70
+ this.relatedAsChange.emit(relRoles);
71
+ return;
72
+ }
73
+ if (!spaceID) {
74
+ throw new Error('onRelatedAsChanged() - spaceID is not set');
75
+ }
76
+ const userContactID = this.$userSpaceContactID();
77
+ if (!userContactID) {
78
+ throw new Error('onRelatedAsChanged() - userContactID is not set');
79
+ }
80
+ const request = {
81
+ spaceID,
82
+ moduleID: 'contactus',
83
+ collection: 'contacts',
84
+ id: contactID,
85
+ related: [
86
+ {
87
+ itemRef: {
88
+ spaceID: this.$spaceID() || '',
89
+ module: 'contactus',
90
+ collection: 'contacts',
91
+ itemID: userContactID,
92
+ },
93
+ ...relatedChange,
94
+ },
95
+ ],
96
+ };
97
+ this.$isProcessing.set(true);
98
+ this.spaceService.updateRelated(request).subscribe({
99
+ next: () => {
100
+ this.$isProcessing.set(false);
101
+ },
102
+ error: (err) => {
103
+ this.errorLogger.logError(err, 'Failed to update contact');
104
+ setTimeout(() => this.$isProcessing.set(false), 500);
105
+ },
106
+ });
107
+ }
108
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactRelationshipFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
109
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: ContactRelationshipFormComponent, isStandalone: true, selector: "sneat-contact-relationship-form", inputs: { $contactID: { classPropertyName: "$contactID", publicName: "$contactID", isSignal: true, isRequired: true, transformFunction: null }, $ageGroup: { classPropertyName: "$ageGroup", publicName: "$ageGroup", isSignal: true, isRequired: true, transformFunction: null }, $relatedTo: { classPropertyName: "$relatedTo", publicName: "$relatedTo", isSignal: true, isRequired: true, transformFunction: null }, $userSpaceContactID: { classPropertyName: "$userSpaceContactID", publicName: "$userSpaceContactID", isSignal: true, isRequired: true, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { relatedAsChange: "relatedAsChange" }, providers: [
110
+ { provide: ClassName, useValue: 'ContactRelationshipFormComponent' },
111
+ ], usesInheritance: true, ngImport: i0, template: "<sneat-relationship-form\n [disabled]=\"disabled\"\n [isActive]=\"isActive\"\n [$space]=\"$space()\"\n [$itemRef]=\"$itemRef()\"\n [$relatedTo]=\"$relatedTo()\"\n [$relationshipOptions]=\"$relationshipOptions()\"\n [$isProcessing]=\"$isProcessing()\"\n (relatedAsChange)=\"onRelatedAsChanged($event)\"\n/>\n", dependencies: [{ kind: "component", type: RelationshipFormComponent, selector: "sneat-relationship-form", inputs: ["$itemRef", "$relatedTo", "$relationshipOptions", "$isProcessing", "isActive", "disabled", "maxNumberOfRelationships"], outputs: ["relatedAsChange"] }] }); }
112
+ }
113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactRelationshipFormComponent, decorators: [{
114
+ type: Component,
115
+ args: [{ selector: 'sneat-contact-relationship-form', imports: [RelationshipFormComponent], providers: [
116
+ { provide: ClassName, useValue: 'ContactRelationshipFormComponent' },
117
+ ], template: "<sneat-relationship-form\n [disabled]=\"disabled\"\n [isActive]=\"isActive\"\n [$space]=\"$space()\"\n [$itemRef]=\"$itemRef()\"\n [$relatedTo]=\"$relatedTo()\"\n [$relationshipOptions]=\"$relationshipOptions()\"\n [$isProcessing]=\"$isProcessing()\"\n (relatedAsChange)=\"onRelatedAsChanged($event)\"\n/>\n" }]
118
+ }], ctorParameters: () => [], propDecorators: { $contactID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contactID", required: true }] }], $ageGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "$ageGroup", required: true }] }], $relatedTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "$relatedTo", required: true }] }], $userSpaceContactID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$userSpaceContactID", required: true }] }], isActive: [{
119
+ type: Input
120
+ }], disabled: [{
121
+ type: Input
122
+ }], relatedAsChange: [{
123
+ type: Output
124
+ }] } });
125
+ //# sourceMappingURL=contact-relationship-form.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-relationship-form.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/relationship-form/contact-relationship-form.component.ts","../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/relationship-form/contact-relationship-form.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 {\n FamilyMemberRelation,\n MemberRelationshipOther,\n MemberRelationshipUndisclosed,\n relationshipTitle,\n} from '@sneat/contactus-core';\nimport { AgeGroupID } from '@sneat/core';\nimport { WithSpaceInput } from '@sneat/space-services';\nimport { IRelatedChange, IUpdateRelatedRequest } from '@sneat/space-models';\nimport { SpaceService } from '@sneat/space-services';\nimport { ClassName, ISelectItem } from '@sneat/ui';\nimport { RelationshipFormComponent } from './relationship-form.component';\nimport {\n IRelatedTo,\n IRelationshipRoles,\n ISpaceModuleItemRef,\n WritableRelationshipRoles,\n} from '@sneat/dto';\n\nconst getRelOptions = (r: FamilyMemberRelation[]): ISelectItem[] => [\n ...r.map((id) => ({ id, title: relationshipTitle(id) })),\n { id: MemberRelationshipOther, title: 'Other' },\n { id: MemberRelationshipUndisclosed, title: 'Undisclosed' },\n];\n\n@Component({\n selector: 'sneat-contact-relationship-form',\n templateUrl: './contact-relationship-form.component.html',\n imports: [RelationshipFormComponent],\n providers: [\n { provide: ClassName, useValue: 'ContactRelationshipFormComponent' },\n ],\n})\nexport class ContactRelationshipFormComponent extends WithSpaceInput {\n public readonly $contactID = input.required<string | undefined>();\n\n protected readonly $itemRef = computed<ISpaceModuleItemRef | undefined>(\n () => {\n const spaceID = this.$spaceID();\n const itemID = this.$contactID();\n return spaceID && itemID\n ? {\n spaceID,\n module: 'contactus',\n collection: 'contacts',\n itemID,\n }\n : undefined;\n },\n );\n\n public readonly $ageGroup = input.required<AgeGroupID | undefined>();\n\n public readonly $relatedTo = input.required<IRelatedTo | undefined>();\n public readonly $isProcessing = signal(false);\n\n public readonly $userSpaceContactID = input.required<\n string | null | undefined\n >();\n\n @Input() public isActive = false;\n @Input() public disabled = false;\n\n @Output() readonly relatedAsChange = new EventEmitter<IRelationshipRoles>();\n\n private readonly spaceService = inject(SpaceService);\n\n public constructor() {\n super();\n }\n\n protected onRelatedAsChanged(relatedChange: IRelatedChange): void {\n const contactID = this.$contactID();\n const spaceID = this.$spaceID();\n if (!contactID) {\n const relRoles: WritableRelationshipRoles = {};\n relatedChange.remove?.rolesToItem?.forEach(\n (role: string) => delete relRoles[role],\n );\n relatedChange.add?.rolesToItem?.forEach(\n (role: string) => (relRoles[role] = { created: { at: '', by: '' } }),\n );\n this.relatedAsChange.emit(relRoles);\n return;\n }\n if (!spaceID) {\n throw new Error('onRelatedAsChanged() - spaceID is not set');\n }\n const userContactID = this.$userSpaceContactID();\n if (!userContactID) {\n throw new Error('onRelatedAsChanged() - userContactID is not set');\n }\n\n const request: IUpdateRelatedRequest = {\n spaceID,\n moduleID: 'contactus',\n collection: 'contacts',\n id: contactID,\n related: [\n {\n itemRef: {\n spaceID: this.$spaceID() || '',\n module: 'contactus',\n collection: 'contacts',\n itemID: userContactID,\n },\n ...relatedChange,\n },\n ],\n };\n this.$isProcessing.set(true);\n this.spaceService.updateRelated(request).subscribe({\n next: () => {\n this.$isProcessing.set(false);\n },\n error: (err) => {\n this.errorLogger.logError(err, 'Failed to update contact');\n setTimeout(() => this.$isProcessing.set(false), 500);\n },\n });\n }\n\n protected $relationshipOptions = computed(() => {\n switch (this.$spaceType()) {\n case 'family': {\n return getRelOptions(\n this.$ageGroup() === 'child'\n ? ([\n FamilyMemberRelation.child,\n FamilyMemberRelation.sibling,\n FamilyMemberRelation.cousin,\n ] as FamilyMemberRelation[])\n : ([\n FamilyMemberRelation.spouse,\n FamilyMemberRelation.partner,\n FamilyMemberRelation.child,\n FamilyMemberRelation.sibling,\n FamilyMemberRelation.cousin,\n FamilyMemberRelation.parent,\n FamilyMemberRelation.parentInLaw,\n FamilyMemberRelation.grandparent,\n FamilyMemberRelation.grandparentInLaw,\n ] as FamilyMemberRelation[]),\n );\n }\n default:\n return [];\n }\n });\n}\n","<sneat-relationship-form\n [disabled]=\"disabled\"\n [isActive]=\"isActive\"\n [$space]=\"$space()\"\n [$itemRef]=\"$itemRef()\"\n [$relatedTo]=\"$relatedTo()\"\n [$relationshipOptions]=\"$relationshipOptions()\"\n [$isProcessing]=\"$isProcessing()\"\n (relatedAsChange)=\"onRelatedAsChanged($event)\"\n/>\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './relationship-form.component';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/relationship-form/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './relationship-form.component';\n"]}
@@ -0,0 +1,136 @@
1
+ import { ChangeDetectionStrategy, Component, computed, EventEmitter, inject, input, Input, Output, } from '@angular/core';
2
+ import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { IonButton, IonButtons, IonCard, IonIcon, IonItem, IonItemDivider, IonLabel, IonSpinner, } from '@ionic/angular/standalone';
4
+ import { SneatUserService } from '@sneat/auth-core';
5
+ import { formNexInAnimation } from '@sneat/core';
6
+ import { getRelatedItemByKey, } from '@sneat/dto';
7
+ import { SpaceService } from '@sneat/space-services';
8
+ import { ClassName, SelectFromListComponent } from '@sneat/ui';
9
+ import { SpaceRelatedFormComponent } from '../space-related-form.component';
10
+ import * as i0 from "@angular/core";
11
+ export class RelationshipFormComponent extends SpaceRelatedFormComponent {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.userService = inject(SneatUserService);
15
+ this.$itemRef = input.required(...(ngDevMode ? [{ debugName: "$itemRef" }] : []));
16
+ this.$relatedTo = input.required(...(ngDevMode ? [{ debugName: "$relatedTo" }] : []));
17
+ this.$relationshipOptions = input.required(...(ngDevMode ? [{ debugName: "$relationshipOptions" }] : []));
18
+ this.$isProcessing = input(...(ngDevMode ? [undefined, { debugName: "$isProcessing" }] : []));
19
+ this.$rolesOfItemRelatedToTarget = computed(() => {
20
+ const relatedTo = this.$relatedTo();
21
+ if (!relatedTo?.related) {
22
+ return undefined;
23
+ }
24
+ const relatedItem = getRelatedItemByKey(relatedTo.related, relatedTo.key);
25
+ // console.log('$rolesOfItemRelatedToTarget', relatedTo, relatedItem);
26
+ if (!relatedItem) {
27
+ return []; // if we return undefined, the "loading..." spinner will be shown
28
+ }
29
+ const rolesToItem = [];
30
+ Object.entries(relatedItem.rolesToItem || {}).forEach(([id, rel]) => {
31
+ const roleOfItem = {
32
+ id,
33
+ ...rel,
34
+ };
35
+ rolesToItem.push(roleOfItem);
36
+ });
37
+ return rolesToItem;
38
+ }, ...(ngDevMode ? [{ debugName: "$rolesOfItemRelatedToTarget" }] : []));
39
+ this.$relationshipsCount = computed(() => this.$rolesOfItemRelatedToTarget()?.length || 0, ...(ngDevMode ? [{ debugName: "$relationshipsCount" }] : []));
40
+ this.$hasRelationships = computed(() => !!this.$relationshipsCount(), ...(ngDevMode ? [{ debugName: "$hasRelationships" }] : []));
41
+ this.$useSelect = computed(() => {
42
+ const n = this.$rolesOfItemRelatedToTarget()?.length;
43
+ return n === 0 || n === 1;
44
+ }, ...(ngDevMode ? [{ debugName: "$useSelect" }] : []));
45
+ this.relatedAsChange = new EventEmitter();
46
+ this.isActive = false;
47
+ this.disabled = false;
48
+ this.relatedAsSingle = new FormControl('');
49
+ this.spaceService = inject(SpaceService);
50
+ // Defined here as it is used in the template twice
51
+ this.label = 'Related to me as';
52
+ this.maxNumberOfRelationships = 2;
53
+ }
54
+ onRelationshipChanged(value) {
55
+ // console.log('onRelationshipChanged()', value);
56
+ // this.relatedAsRelationships = [value];
57
+ this.relatedAsChange.emit({ add: { rolesToItem: [value] } });
58
+ }
59
+ openAddRelationship(event) {
60
+ event.preventDefault();
61
+ event.stopPropagation();
62
+ alert('Not implemented yet');
63
+ }
64
+ removeRelationship(event, id) {
65
+ event.preventDefault();
66
+ event.stopPropagation();
67
+ // console.log('removeRelationship()', event);
68
+ const itemRef = this.$itemRef();
69
+ if (!itemRef) {
70
+ throw new Error('itemRef is not set');
71
+ }
72
+ const relatedToKey = this.$relatedTo()?.key;
73
+ if (!relatedToKey) {
74
+ throw new Error('relatedToKey is not set');
75
+ }
76
+ const request = {
77
+ spaceID: itemRef.spaceID,
78
+ moduleID: itemRef.module,
79
+ collection: itemRef?.collection,
80
+ id: itemRef.itemID,
81
+ related: [
82
+ {
83
+ itemRef: relatedToKey,
84
+ remove: {
85
+ rolesToItem: [id],
86
+ },
87
+ },
88
+ ],
89
+ };
90
+ this.spaceService.updateRelated(request).subscribe({
91
+ next: () => {
92
+ this.relatedAsChange.emit({ remove: { rolesToItem: [id] } });
93
+ },
94
+ error: (err) => {
95
+ console.error('Error removing relationship', err);
96
+ },
97
+ });
98
+ }
99
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RelationshipFormComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
100
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: RelationshipFormComponent, isStandalone: true, selector: "sneat-relationship-form", inputs: { $itemRef: { classPropertyName: "$itemRef", publicName: "$itemRef", isSignal: true, isRequired: true, transformFunction: null }, $relatedTo: { classPropertyName: "$relatedTo", publicName: "$relatedTo", isSignal: true, isRequired: true, transformFunction: null }, $relationshipOptions: { classPropertyName: "$relationshipOptions", publicName: "$relationshipOptions", isSignal: true, isRequired: true, transformFunction: null }, $isProcessing: { classPropertyName: "$isProcessing", publicName: "$isProcessing", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, maxNumberOfRelationships: { classPropertyName: "maxNumberOfRelationships", publicName: "maxNumberOfRelationships", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { relatedAsChange: "relatedAsChange" }, providers: [
101
+ {
102
+ provide: ClassName,
103
+ useValue: 'RelationshipFormComponent',
104
+ },
105
+ ], usesInheritance: true, ngImport: i0, template: "<ion-card @formNextIn>\n <!--\t<p>$relatedTo: {{ $relatedTo() | json }}</p>-->\n <!--\t<p>$spaceType: {{ $spaceType() }}</p>-->\n <!--\t<p>$rolesOfItemRelatedToTarget(): {{ $rolesOfItemRelatedToTarget() | json }}</p>-->\n <!--\t<p>$relationshipOptions: {{ $relationshipOptions()|json }}</p>-->\n\n <ion-item-divider\n [color]=\"isActive ? 'primary' : 'light'\"\n class=\"sneat-tiny-end-padding\"\n >\n <ion-label>\n <b>{{ label }}</b>\n </ion-label>\n @if (\n $hasRelationships() && $relationshipsCount() < maxNumberOfRelationships\n ) {\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"openAddRelationship($event)\" color=\"medium\">\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n }\n </ion-item-divider>\n\n <!-- we do not use select even if a single role selected as it requires a \"replace\" implementation that is quite complex without big benefits to UX -->\n\n @if ($rolesOfItemRelatedToTarget(); as rolesOfItemRelatedToTarget) {\n @for (rel of rolesOfItemRelatedToTarget; track rel.id) {\n <ion-item class=\"sneat-tiny-end-padding\">\n <ion-label>{{ rel.id }}</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"medium\"\n title=\"Remove relationship\"\n (click)=\"removeRelationship($event, rel.id)\"\n >\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-item>\n } @empty {\n <!-- we do use select from list when no roles selected for great UX -->\n <sneat-select-from-list\n [items]=\"$relationshipOptions()\"\n [label]=\"label\"\n [$isProcessing]=\"$isProcessing()\"\n (valueChange)=\"onRelationshipChanged($event)\"\n />\n }\n } @else {\n <ion-item>\n <ion-label color=\"medium\">Loading...</ion-label>\n <ion-spinner name=\"lines-small\" slot=\"end\" />\n </ion-item>\n }\n</ion-card>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { 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: IonItemDivider, selector: "ion-item-divider", inputs: ["color", "mode", "sticky"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: SelectFromListComponent, selector: "sneat-select-from-list", inputs: ["value", "filterLabel", "label", "listLabel", "listLabelColor", "isFilterable", "isLoading", "items", "items$", "lastItemLines", "labelPlacement", "justify", "other", "canAdd", "filterItem", "selectMode", "isReadonly", "$isProcessing", "sortBy"], outputs: ["valueChange", "filterChanged"] }, { 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: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }], animations: [formNexInAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
106
+ }
107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RelationshipFormComponent, decorators: [{
108
+ type: Component,
109
+ args: [{ animations: [formNexInAnimation], imports: [
110
+ FormsModule,
111
+ ReactiveFormsModule,
112
+ IonCard,
113
+ IonItem,
114
+ IonItemDivider,
115
+ IonLabel,
116
+ SelectFromListComponent,
117
+ IonButtons,
118
+ IonButton,
119
+ IonIcon,
120
+ IonSpinner,
121
+ ], providers: [
122
+ {
123
+ provide: ClassName,
124
+ useValue: 'RelationshipFormComponent',
125
+ },
126
+ ], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-relationship-form', template: "<ion-card @formNextIn>\n <!--\t<p>$relatedTo: {{ $relatedTo() | json }}</p>-->\n <!--\t<p>$spaceType: {{ $spaceType() }}</p>-->\n <!--\t<p>$rolesOfItemRelatedToTarget(): {{ $rolesOfItemRelatedToTarget() | json }}</p>-->\n <!--\t<p>$relationshipOptions: {{ $relationshipOptions()|json }}</p>-->\n\n <ion-item-divider\n [color]=\"isActive ? 'primary' : 'light'\"\n class=\"sneat-tiny-end-padding\"\n >\n <ion-label>\n <b>{{ label }}</b>\n </ion-label>\n @if (\n $hasRelationships() && $relationshipsCount() < maxNumberOfRelationships\n ) {\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"openAddRelationship($event)\" color=\"medium\">\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n }\n </ion-item-divider>\n\n <!-- we do not use select even if a single role selected as it requires a \"replace\" implementation that is quite complex without big benefits to UX -->\n\n @if ($rolesOfItemRelatedToTarget(); as rolesOfItemRelatedToTarget) {\n @for (rel of rolesOfItemRelatedToTarget; track rel.id) {\n <ion-item class=\"sneat-tiny-end-padding\">\n <ion-label>{{ rel.id }}</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"medium\"\n title=\"Remove relationship\"\n (click)=\"removeRelationship($event, rel.id)\"\n >\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-item>\n } @empty {\n <!-- we do use select from list when no roles selected for great UX -->\n <sneat-select-from-list\n [items]=\"$relationshipOptions()\"\n [label]=\"label\"\n [$isProcessing]=\"$isProcessing()\"\n (valueChange)=\"onRelationshipChanged($event)\"\n />\n }\n } @else {\n <ion-item>\n <ion-label color=\"medium\">Loading...</ion-label>\n <ion-spinner name=\"lines-small\" slot=\"end\" />\n </ion-item>\n }\n</ion-card>\n" }]
127
+ }], propDecorators: { $itemRef: [{ type: i0.Input, args: [{ isSignal: true, alias: "$itemRef", required: true }] }], $relatedTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "$relatedTo", required: true }] }], $relationshipOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "$relationshipOptions", required: true }] }], $isProcessing: [{ type: i0.Input, args: [{ isSignal: true, alias: "$isProcessing", required: false }] }], relatedAsChange: [{
128
+ type: Output
129
+ }], isActive: [{
130
+ type: Input
131
+ }], disabled: [{
132
+ type: Input
133
+ }], maxNumberOfRelationships: [{
134
+ type: Input
135
+ }] } });
136
+ //# sourceMappingURL=relationship-form.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-form.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/relationship-form/relationship-form.component.ts","../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/relationship-form/relationship-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n EventEmitter,\n inject,\n input,\n Input,\n Output,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n IonButton,\n IonButtons,\n IonCard,\n IonIcon,\n IonItem,\n IonItemDivider,\n IonLabel,\n IonSpinner,\n} from '@ionic/angular/standalone';\nimport { SneatUserService } from '@sneat/auth-core';\nimport { formNexInAnimation } from '@sneat/core';\nimport {\n getRelatedItemByKey,\n IRelatedTo,\n IRelationshipRole,\n ISpaceModuleItemRef,\n} from '@sneat/dto';\nimport { IRelatedChange, IUpdateRelatedRequest } from '@sneat/space-models';\nimport { SpaceService } from '@sneat/space-services';\nimport { ClassName, ISelectItem, SelectFromListComponent } from '@sneat/ui';\nimport { SpaceRelatedFormComponent } from '../space-related-form.component';\n\ninterface IRelationshipWithID extends IRelationshipRole {\n readonly id: string;\n}\n\n@Component({\n animations: [formNexInAnimation],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n IonCard,\n IonItem,\n IonItemDivider,\n IonLabel,\n SelectFromListComponent,\n IonButtons,\n IonButton,\n IonIcon,\n IonSpinner,\n ],\n providers: [\n {\n provide: ClassName,\n useValue: 'RelationshipFormComponent',\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-relationship-form',\n templateUrl: 'relationship-form.component.html',\n})\nexport class RelationshipFormComponent extends SpaceRelatedFormComponent {\n private readonly userService = inject(SneatUserService);\n\n public readonly $itemRef = input.required<ISpaceModuleItemRef | undefined>();\n\n public readonly $relatedTo = input.required<IRelatedTo | undefined>();\n\n public readonly $relationshipOptions = input.required<\n readonly ISelectItem[] | undefined\n >();\n\n public readonly $isProcessing = input<boolean>();\n\n protected readonly $rolesOfItemRelatedToTarget = computed<\n readonly IRelationshipWithID[] | undefined\n >(() => {\n const relatedTo = this.$relatedTo();\n if (!relatedTo?.related) {\n return undefined;\n }\n const relatedItem = getRelatedItemByKey(relatedTo.related, relatedTo.key);\n // console.log('$rolesOfItemRelatedToTarget', relatedTo, relatedItem);\n if (!relatedItem) {\n return []; // if we return undefined, the \"loading...\" spinner will be shown\n }\n const rolesToItem: IRelationshipWithID[] = [];\n Object.entries(relatedItem.rolesToItem || {}).forEach(([id, rel]) => {\n const roleOfItem: IRelationshipWithID = {\n id,\n ...rel,\n };\n rolesToItem.push(roleOfItem);\n });\n return rolesToItem;\n });\n\n protected readonly $relationshipsCount = computed(\n () => this.$rolesOfItemRelatedToTarget()?.length || 0,\n );\n\n protected readonly $hasRelationships = computed(\n () => !!this.$relationshipsCount(),\n );\n\n protected readonly $useSelect = computed(() => {\n const n = this.$rolesOfItemRelatedToTarget()?.length;\n return n === 0 || n === 1;\n });\n\n @Output() readonly relatedAsChange = new EventEmitter<IRelatedChange>();\n\n @Input() public isActive = false;\n @Input() public disabled = false;\n\n protected readonly relatedAsSingle = new FormControl<string>('');\n\n private readonly spaceService = inject(SpaceService);\n\n // Defined here as it is used in the template twice\n protected readonly label = 'Related to me as';\n\n protected onRelationshipChanged(value: string): void {\n // console.log('onRelationshipChanged()', value);\n // this.relatedAsRelationships = [value];\n this.relatedAsChange.emit({ add: { rolesToItem: [value] } });\n }\n\n @Input() maxNumberOfRelationships = 2;\n\n protected openAddRelationship(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n alert('Not implemented yet');\n }\n\n protected removeRelationship(event: Event, id: string): void {\n event.preventDefault();\n event.stopPropagation();\n // console.log('removeRelationship()', event);\n const itemRef = this.$itemRef();\n if (!itemRef) {\n throw new Error('itemRef is not set');\n }\n const relatedToKey = this.$relatedTo()?.key;\n if (!relatedToKey) {\n throw new Error('relatedToKey is not set');\n }\n const request: IUpdateRelatedRequest = {\n spaceID: itemRef.spaceID,\n moduleID: itemRef.module,\n collection: itemRef?.collection,\n id: itemRef.itemID,\n related: [\n {\n itemRef: relatedToKey,\n remove: {\n rolesToItem: [id],\n },\n },\n ],\n };\n this.spaceService.updateRelated(request).subscribe({\n next: () => {\n this.relatedAsChange.emit({ remove: { rolesToItem: [id] } });\n },\n error: (err) => {\n console.error('Error removing relationship', err);\n },\n });\n }\n}\n","<ion-card @formNextIn>\n <!--\t<p>$relatedTo: {{ $relatedTo() | json }}</p>-->\n <!--\t<p>$spaceType: {{ $spaceType() }}</p>-->\n <!--\t<p>$rolesOfItemRelatedToTarget(): {{ $rolesOfItemRelatedToTarget() | json }}</p>-->\n <!--\t<p>$relationshipOptions: {{ $relationshipOptions()|json }}</p>-->\n\n <ion-item-divider\n [color]=\"isActive ? 'primary' : 'light'\"\n class=\"sneat-tiny-end-padding\"\n >\n <ion-label>\n <b>{{ label }}</b>\n </ion-label>\n @if (\n $hasRelationships() && $relationshipsCount() < maxNumberOfRelationships\n ) {\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"openAddRelationship($event)\" color=\"medium\">\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n }\n </ion-item-divider>\n\n <!-- we do not use select even if a single role selected as it requires a \"replace\" implementation that is quite complex without big benefits to UX -->\n\n @if ($rolesOfItemRelatedToTarget(); as rolesOfItemRelatedToTarget) {\n @for (rel of rolesOfItemRelatedToTarget; track rel.id) {\n <ion-item class=\"sneat-tiny-end-padding\">\n <ion-label>{{ rel.id }}</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"medium\"\n title=\"Remove relationship\"\n (click)=\"removeRelationship($event, rel.id)\"\n >\n <ion-icon name=\"close-outline\" />\n </ion-button>\n </ion-buttons>\n </ion-item>\n } @empty {\n <!-- we do use select from list when no roles selected for great UX -->\n <sneat-select-from-list\n [items]=\"$relationshipOptions()\"\n [label]=\"label\"\n [$isProcessing]=\"$isProcessing()\"\n (valueChange)=\"onRelationshipChanged($event)\"\n />\n }\n } @else {\n <ion-item>\n <ion-label color=\"medium\">Loading...</ion-label>\n <ion-spinner name=\"lines-small\" slot=\"end\" />\n </ion-item>\n }\n</ion-card>\n"]}
@@ -0,0 +1,98 @@
1
+ import { ChangeDetectionStrategy, Component, computed, EventEmitter, input, Output, signal, inject, } from '@angular/core';
2
+ import { IonCard, IonItemDivider, IonLabel } from '@ionic/angular/standalone';
3
+ import { ClassName, SelectFromListComponent } from '@sneat/ui';
4
+ import { ContactGroupService } from '@sneat/contactus-services';
5
+ import { SneatBaseComponent } from '@sneat/ui';
6
+ import * as i0 from "@angular/core";
7
+ export class ContactRoleFormComponent extends SneatBaseComponent {
8
+ constructor() {
9
+ super();
10
+ this.$contactGroupID = input.required(...(ngDevMode ? [{ debugName: "$contactGroupID" }] : []));
11
+ this.$contactGroup = computed(() => {
12
+ const id = this.$contactGroupID();
13
+ const groups = this.$groups();
14
+ const group = groups?.find((g) => g.id === id);
15
+ this.contactGroupChange.emit(group);
16
+ return group;
17
+ }, ...(ngDevMode ? [{ debugName: "$contactGroup" }] : []));
18
+ this.contactGroupIDChange = new EventEmitter();
19
+ this.contactGroupChange = new EventEmitter();
20
+ this.$contactRoleID = input.required(...(ngDevMode ? [{ debugName: "$contactRoleID" }] : []));
21
+ this.contactRoleIDChange = new EventEmitter();
22
+ this.contactRoleChange = new EventEmitter();
23
+ this.$groups = signal(undefined, ...(ngDevMode ? [{ debugName: "$groups" }] : []));
24
+ this.$groupItems = computed(() => {
25
+ const groups = this.$groups();
26
+ return (groups?.map((g) => ({
27
+ id: g.id,
28
+ title: g.dbo.title,
29
+ emoji: g.dbo.emoji,
30
+ })) || []);
31
+ }, ...(ngDevMode ? [{ debugName: "$groupItems" }] : []));
32
+ this.$roleItems = computed(() => {
33
+ const group = this.$contactGroup();
34
+ if (!group) {
35
+ return [];
36
+ }
37
+ return group.dbo?.roles
38
+ ?.filter((r) => r.id !== 'pet')
39
+ ?.map((r) => ({
40
+ id: r.id,
41
+ title: r.brief.title,
42
+ emoji: r.brief.emoji,
43
+ }));
44
+ }, ...(ngDevMode ? [{ debugName: "$roleItems" }] : []));
45
+ this.roleBriefID = (o) => o.id;
46
+ this.groupID = (_, o) => o.id;
47
+ const contactGroupService = inject(ContactGroupService);
48
+ contactGroupService
49
+ .getContactGroups()
50
+ .pipe(this.takeUntilDestroyed())
51
+ .subscribe({
52
+ next: (groups) => {
53
+ this.$groups.set(groups);
54
+ },
55
+ });
56
+ }
57
+ onContactGroupIDChanged(contactGroupID) {
58
+ // event.stopPropagation();
59
+ this.contactGroupIDChange.emit(contactGroupID);
60
+ const group = this.$groups()?.find((g) => g.id === contactGroupID);
61
+ this.contactGroupChange.emit(group);
62
+ this.clearContactType();
63
+ }
64
+ onContactRoleIDChanged(contactRoleID) {
65
+ this.contactRoleIDChange.emit(contactRoleID);
66
+ const group = this.$contactGroup();
67
+ const role = group?.dbo?.roles?.find((r) => r.id == contactRoleID);
68
+ this.contactRoleChange.emit(role);
69
+ }
70
+ clearContactType() {
71
+ this.contactRoleIDChange.emit(undefined);
72
+ }
73
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactRoleFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
74
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ContactRoleFormComponent, isStandalone: true, selector: "sneat-contact-role-form", inputs: { $contactGroupID: { classPropertyName: "$contactGroupID", publicName: "$contactGroupID", isSignal: true, isRequired: true, transformFunction: null }, $contactRoleID: { classPropertyName: "$contactRoleID", publicName: "$contactRoleID", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { contactGroupIDChange: "contactGroupIDChange", contactGroupChange: "contactGroupChange", contactRoleIDChange: "contactRoleIDChange", contactRoleChange: "contactRoleChange" }, providers: [
75
+ {
76
+ provide: ClassName,
77
+ useValue: 'ContactRoleFormComponent',
78
+ },
79
+ ], usesInheritance: true, ngImport: i0, template: "<ion-card>\n @if (!$contactGroupID()) {\n <ion-item-divider color=\"primary\">\n <ion-label>Please select contact group</ion-label>\n </ion-item-divider>\n }\n <sneat-select-from-list\n label=\"Contact group\"\n [items]=\"$groupItems()\"\n [value]=\"$contactGroupID() || ''\"\n (valueChange)=\"onContactGroupIDChanged($event)\"\n />\n @if ($contactGroupID()) {\n @if (!$contactRoleID()) {\n <ion-item-divider color=\"primary\">\n Please select contact role\n </ion-item-divider>\n }\n <sneat-select-from-list\n label=\"Contact role\"\n sortBy=\"title\"\n [items]=\"$roleItems()\"\n [value]=\"$contactRoleID() || ''\"\n (valueChange)=\"onContactRoleIDChanged($event)\"\n />\n }\n</ion-card>\n", dependencies: [{ kind: "component", type: SelectFromListComponent, selector: "sneat-select-from-list", inputs: ["value", "filterLabel", "label", "listLabel", "listLabelColor", "isFilterable", "isLoading", "items", "items$", "lastItemLines", "labelPlacement", "justify", "other", "canAdd", "filterItem", "selectMode", "isReadonly", "$isProcessing", "sortBy"], outputs: ["valueChange", "filterChanged"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonItemDivider, selector: "ion-item-divider", inputs: ["color", "mode", "sticky"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
80
+ }
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactRoleFormComponent, decorators: [{
82
+ type: Component,
83
+ args: [{ selector: 'sneat-contact-role-form', imports: [SelectFromListComponent, IonCard, IonItemDivider, IonLabel], providers: [
84
+ {
85
+ provide: ClassName,
86
+ useValue: 'ContactRoleFormComponent',
87
+ },
88
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-card>\n @if (!$contactGroupID()) {\n <ion-item-divider color=\"primary\">\n <ion-label>Please select contact group</ion-label>\n </ion-item-divider>\n }\n <sneat-select-from-list\n label=\"Contact group\"\n [items]=\"$groupItems()\"\n [value]=\"$contactGroupID() || ''\"\n (valueChange)=\"onContactGroupIDChanged($event)\"\n />\n @if ($contactGroupID()) {\n @if (!$contactRoleID()) {\n <ion-item-divider color=\"primary\">\n Please select contact role\n </ion-item-divider>\n }\n <sneat-select-from-list\n label=\"Contact role\"\n sortBy=\"title\"\n [items]=\"$roleItems()\"\n [value]=\"$contactRoleID() || ''\"\n (valueChange)=\"onContactRoleIDChanged($event)\"\n />\n }\n</ion-card>\n" }]
89
+ }], ctorParameters: () => [], propDecorators: { $contactGroupID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contactGroupID", required: true }] }], contactGroupIDChange: [{
90
+ type: Output
91
+ }], contactGroupChange: [{
92
+ type: Output
93
+ }], $contactRoleID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contactRoleID", required: true }] }], contactRoleIDChange: [{
94
+ type: Output
95
+ }], contactRoleChange: [{
96
+ type: Output
97
+ }] } });
98
+ //# sourceMappingURL=contact-role-form.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-role-form.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/role-form/contact-role-form.component.ts","../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/role-form/contact-role-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n EventEmitter,\n input,\n Output,\n signal,\n inject,\n} from '@angular/core';\nimport { IonCard, IonItemDivider, IonLabel } from '@ionic/angular/standalone';\nimport { ClassName, SelectFromListComponent } from '@sneat/ui';\nimport { ContactGroupService } from '@sneat/contactus-services';\nimport { IIdAndDbo } from '@sneat/core';\nimport {\n ContactRole,\n IContactGroupDbo,\n IContactRoleWithIdAndBrief,\n} from '@sneat/contactus-core';\nimport { SneatBaseComponent } from '@sneat/ui';\n\n@Component({\n selector: 'sneat-contact-role-form',\n templateUrl: './contact-role-form.component.html',\n imports: [SelectFromListComponent, IonCard, IonItemDivider, IonLabel],\n providers: [\n {\n provide: ClassName,\n useValue: 'ContactRoleFormComponent',\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContactRoleFormComponent extends SneatBaseComponent {\n public $contactGroupID = input.required<string | undefined>();\n\n protected $contactGroup = computed(() => {\n const id = this.$contactGroupID();\n const groups = this.$groups();\n const group = groups?.find((g) => g.id === id);\n this.contactGroupChange.emit(group);\n return group;\n });\n\n @Output() readonly contactGroupIDChange = new EventEmitter<\n string | undefined\n >();\n\n @Output() readonly contactGroupChange = new EventEmitter<\n IIdAndDbo<IContactGroupDbo> | undefined\n >();\n\n public readonly $contactRoleID = input.required<ContactRole | undefined>();\n\n @Output() readonly contactRoleIDChange = new EventEmitter<\n ContactRole | undefined\n >();\n\n @Output() readonly contactRoleChange = new EventEmitter<\n IContactRoleWithIdAndBrief | undefined\n >();\n\n protected readonly $groups = signal<\n readonly IIdAndDbo<IContactGroupDbo>[] | undefined\n >(undefined);\n\n protected readonly $groupItems = computed(() => {\n const groups = this.$groups();\n return (\n groups?.map((g) => ({\n id: g.id,\n title: g.dbo.title,\n emoji: g.dbo.emoji,\n })) || []\n );\n });\n\n protected readonly $roleItems = computed(() => {\n const group = this.$contactGroup();\n if (!group) {\n return [];\n }\n return group.dbo?.roles\n ?.filter((r) => r.id !== 'pet')\n ?.map((r) => ({\n id: r.id,\n title: r.brief.title,\n emoji: r.brief.emoji,\n }));\n });\n\n protected readonly roleBriefID = (o: IContactRoleWithIdAndBrief) => o.id;\n protected readonly groupID = (_: number, o: IIdAndDbo<IContactGroupDbo>) =>\n o.id;\n\n constructor() {\n super();\n const contactGroupService = inject(ContactGroupService);\n contactGroupService\n .getContactGroups()\n .pipe(this.takeUntilDestroyed())\n .subscribe({\n next: (groups) => {\n this.$groups.set(groups);\n },\n });\n }\n\n protected onContactGroupIDChanged(contactGroupID: string): void {\n // event.stopPropagation();\n this.contactGroupIDChange.emit(contactGroupID);\n const group = this.$groups()?.find((g) => g.id === contactGroupID);\n this.contactGroupChange.emit(group);\n this.clearContactType();\n }\n\n protected onContactRoleIDChanged(contactRoleID: string): void {\n this.contactRoleIDChange.emit(contactRoleID as ContactRole);\n const group = this.$contactGroup();\n const role = group?.dbo?.roles?.find((r) => r.id == contactRoleID);\n this.contactRoleChange.emit(role);\n }\n\n protected clearContactType(): void {\n this.contactRoleIDChange.emit(undefined);\n }\n}\n","<ion-card>\n @if (!$contactGroupID()) {\n <ion-item-divider color=\"primary\">\n <ion-label>Please select contact group</ion-label>\n </ion-item-divider>\n }\n <sneat-select-from-list\n label=\"Contact group\"\n [items]=\"$groupItems()\"\n [value]=\"$contactGroupID() || ''\"\n (valueChange)=\"onContactGroupIDChanged($event)\"\n />\n @if ($contactGroupID()) {\n @if (!$contactRoleID()) {\n <ion-item-divider color=\"primary\">\n Please select contact role\n </ion-item-divider>\n }\n <sneat-select-from-list\n label=\"Contact role\"\n sortBy=\"title\"\n [items]=\"$roleItems()\"\n [value]=\"$contactRoleID() || ''\"\n (valueChange)=\"onContactRoleIDChanged($event)\"\n />\n }\n</ion-card>\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './contact-role-form.component';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/role-form/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './contact-role-form.component';\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './roles-form.component';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../libs/contactus/shared/src/lib/components/contact-forms/roles-form/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC","sourcesContent":["export * from './roles-form.component';\n"]}