@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,200 @@
1
+ import { ChangeDetectionStrategy, Component, computed, EventEmitter, inject, Input, input, Output, signal, } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { IonBadge, IonCard, IonCol, IonGrid, IonIcon, IonItem, IonItemSliding, IonLabel, IonList, IonRow, IonSegment, IonSegmentButton, } from '@ionic/angular/standalone';
4
+ import { FilterItemComponent } from '@sneat/components';
5
+ import { addSpace, filterContactsByTextAndRole, } from '@sneat/contactus-core';
6
+ import { defaultFamilyContactGroups } from '@sneat/contactus-services';
7
+ import { listItemAnimations } from '@sneat/core';
8
+ import { SpaceNavService } from '@sneat/space-services';
9
+ import { ClassName, SneatBaseComponent } from '@sneat/ui';
10
+ import { Observable } from 'rxjs';
11
+ import { ContactsByTypeComponent } from '../contacts-by-type';
12
+ import { ContactsListItemComponent } from '../contacts-list-item/contacts-list-item.component';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/forms";
15
+ export class ContactsComponent extends SneatBaseComponent {
16
+ onFilterChanged(filter) {
17
+ this.$filter.set(filter);
18
+ }
19
+ constructor() {
20
+ super();
21
+ this.$space = input.required(...(ngDevMode ? [{ debugName: "$space" }] : []));
22
+ this.$roleID = input(...(ngDevMode ? [undefined, { debugName: "$roleID" }] : []));
23
+ this.$role = signal(undefined, ...(ngDevMode ? [{ debugName: "$role" }] : []));
24
+ this.roleChange = new EventEmitter();
25
+ this.contactsChange = new EventEmitter();
26
+ this.goToNewContactPage = true;
27
+ this.addContactEvent = new EventEmitter();
28
+ this.$showTabs = computed(() => !this.$roleID() && this.$space().type === 'family', ...(ngDevMode ? [{ debugName: "$showTabs" }] : []));
29
+ this.$filter = signal('', ...(ngDevMode ? [{ debugName: "$filter" }] : []));
30
+ this.spaceNavService = inject(SpaceNavService);
31
+ this.$allContacts = input.required(...(ngDevMode ? [{ debugName: "$allContacts" }] : []));
32
+ this.$contactsWithSpace = computed(() => {
33
+ const contacts = this.$contacts();
34
+ if (!contacts) {
35
+ return undefined;
36
+ }
37
+ const space = this.$space();
38
+ return contacts?.map(addSpace(space));
39
+ }, ...(ngDevMode ? [{ debugName: "$contactsWithSpace" }] : []));
40
+ this.familyGroupDefinitions = defaultFamilyContactGroups;
41
+ this.segment = 'groups';
42
+ this.groups = [];
43
+ this.$contactsByRole = computed(() => {
44
+ const contacts = this.$allContacts() || [];
45
+ const contactsByRole = {
46
+ '': [],
47
+ };
48
+ const space = this.$space();
49
+ contacts.forEach((c) => {
50
+ const contact = { ...c, space };
51
+ contactsByRole[''].push(contact);
52
+ c.brief?.roles?.forEach((role) => {
53
+ const roleContacts = contactsByRole[role];
54
+ if (roleContacts) {
55
+ roleContacts.push(contact);
56
+ }
57
+ else {
58
+ contactsByRole[role] = [contact];
59
+ }
60
+ });
61
+ });
62
+ return contactsByRole;
63
+ }, ...(ngDevMode ? [{ debugName: "$contactsByRole" }] : []));
64
+ this.roles = [
65
+ { id: '', title: 'All', iconName: 'people-outline' },
66
+ { id: 'freight_agent', title: 'Agents', iconName: 'body-outline' },
67
+ { id: 'buyer', title: 'Buyers', iconName: 'cash-outline' },
68
+ { id: 'dispatcher', title: 'Dispatchers', iconName: 'business-outline' },
69
+ { id: 'trucker', title: 'Truckers', iconName: 'bus-outline' },
70
+ { id: 'shipping_line', title: 'Shipping lines', iconName: 'boat-outline' },
71
+ ];
72
+ this.$canAdd = computed(() => {
73
+ const role = this.$roleID();
74
+ return role !== 'tenant' && role !== 'landlord';
75
+ }, ...(ngDevMode ? [{ debugName: "$canAdd" }] : []));
76
+ this.$contacts = computed(() => {
77
+ const allContacts = this.$allContacts();
78
+ if (!allContacts) {
79
+ return undefined;
80
+ }
81
+ const role = this.$roleID(), filter = this.$filter().trim().toLowerCase();
82
+ const space = this.$space();
83
+ return filterContactsByTextAndRole(allContacts, filter, role)?.map(addSpace(space));
84
+ }, ...(ngDevMode ? [{ debugName: "$contacts" }] : []));
85
+ this.contactClicked = (event, contact) => {
86
+ this.console.log(`ContactsComponent.contactClicked(contact{id=${contact.id})`);
87
+ event.stopPropagation();
88
+ event.preventDefault();
89
+ const space = this.$space();
90
+ this.spaceNavService
91
+ .navigateForwardToSpacePage(space, `contact/${contact.id}`, {
92
+ state: { contact },
93
+ })
94
+ .catch(this.errorLogger.logErrorHandler('failed to navigate to contact page'));
95
+ };
96
+ this.addContactClick = new EventEmitter();
97
+ this.addNewContact = async (event) => {
98
+ event.stopPropagation();
99
+ event.preventDefault();
100
+ if (!this.goToNewContactPage) {
101
+ const role = this.$role();
102
+ this.addContactClick.emit({
103
+ event,
104
+ role,
105
+ });
106
+ }
107
+ const space = this.$space();
108
+ if (!space.id && !space.type) {
109
+ return;
110
+ }
111
+ try {
112
+ await this.spaceNavService.navigateForwardToSpacePage(space, 'new-contact', { queryParams: this.$roleID() ? { role: this.$roleID() } : undefined });
113
+ }
114
+ catch (err) {
115
+ this.errorLogger.logError(err, 'failed to navigate to new contact page');
116
+ }
117
+ };
118
+ }
119
+ ngOnInit() {
120
+ this.command?.pipe(this.takeUntilDestroyed()).subscribe((command) => {
121
+ switch (command.name) {
122
+ case 'new_contact':
123
+ this.addNewContact(command.event).catch(this.errorLogger.logErrorHandler('failed to navigate to new contact page'));
124
+ break;
125
+ case 'reset_selected':
126
+ this.contactsChange.emit(this.$allContacts()?.map((c) => Object.assign(c, { isChecked: false })));
127
+ break;
128
+ case 'select_all':
129
+ break;
130
+ }
131
+ });
132
+ }
133
+ contactsNumber(role) {
134
+ const contactsByRole = this.$contactsByRole();
135
+ const roleContacts = (contactsByRole && contactsByRole[role]) ?? [];
136
+ return roleContacts?.length ?? 0;
137
+ }
138
+ contactSelectionChanged(args) {
139
+ this.contactsChange.emit(this.$allContacts()?.map((c) => Object.assign(c, {
140
+ isChecked: c.id === args.id ? args.checked : c.isChecked,
141
+ })));
142
+ }
143
+ goGroup(group) {
144
+ const space = this.$space();
145
+ this.spaceNavService
146
+ .navigateForwardToSpacePage(space, `group/${group.id}`, {
147
+ state: {
148
+ group: group,
149
+ },
150
+ })
151
+ .catch(this.errorLogger.logErrorHandler('failed to navigate to contact creation page'));
152
+ }
153
+ onRoleChanged(event) {
154
+ event.stopPropagation();
155
+ this.roleChange.emit(event.detail.value);
156
+ }
157
+ addGroup(event) {
158
+ event.stopPropagation();
159
+ event.preventDefault();
160
+ alert('Not implemented yet');
161
+ }
162
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
163
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ContactsComponent, isStandalone: true, selector: "sneat-contacts", inputs: { $space: { classPropertyName: "$space", publicName: "$space", isSignal: true, isRequired: true, transformFunction: null }, $roleID: { classPropertyName: "$roleID", publicName: "$roleID", isSignal: true, isRequired: false, transformFunction: null }, command: { classPropertyName: "command", publicName: "command", isSignal: false, isRequired: false, transformFunction: null }, goToNewContactPage: { classPropertyName: "goToNewContactPage", publicName: "goToNewContactPage", isSignal: false, isRequired: false, transformFunction: null }, $allContacts: { classPropertyName: "$allContacts", publicName: "$allContacts", isSignal: true, isRequired: true, transformFunction: null }, contactClicked: { classPropertyName: "contactClicked", publicName: "contactClicked", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { roleChange: "roleChange", contactsChange: "contactsChange", addContactEvent: "addContactEvent", addContactClick: "addContactClick" }, providers: [{ provide: ClassName, useValue: 'ContactsComponent' }], usesInheritance: true, ngImport: i0, template: "@let space = $space();\n@let role = $roleID();\n\n@if (space.type === \"company\") {\n <ion-segment [value]=\"role\" (ionChange)=\"onRoleChanged($event)\">\n <!--\t\t<ion-segment-button>All</ion-segment-button>-->\n @for (r of roles; track r.id) {\n <ion-segment-button [value]=\"r.id\">\n @if (r.iconName) {\n <ion-icon [name]=\"r.iconName\" />\n }\n <ion-label style=\"font-size: smaller\"\n >{{ r.title }}\n <ion-badge color=\"light\">\n <ion-label\n color=\"medium\"\n style=\"font-size: smaller; font-weight: normal\"\n >{{ contactsNumber(r.id) }}\n </ion-label>\n </ion-badge>\n </ion-label>\n </ion-segment-button>\n }\n </ion-segment>\n}\n\n<ion-card>\n <ion-grid class=\"ion-grid-layout\">\n <ion-row>\n <ion-col size=\"12\" size-sm=\"5\">\n <sneat-filter-item\n [$filter]=\"$filter()\"\n (changed)=\"onFilterChanged($event)\"\n />\n </ion-col>\n @if ($showTabs()) {\n <ion-col size=\"12\" size-sm=\"7\">\n <ion-item lines=\"none\" class=\"ion-no-padding-ion-no-margin\">\n <ion-segment [(ngModel)]=\"segment\">\n <ion-segment-button value=\"list\">\n <ion-label>List</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"groups\">\n <ion-label>By type</ion-label>\n </ion-segment-button>\n </ion-segment>\n <!--\t\t\t\t\t\tMake it to work in a modal - too narrow at the moment.-->\n <!--\t\t\t\t\t\t@if (segment === \"groups\") {-->\n <!--\t\t\t\t\t\t\t<ion-buttons slot=\"end\">-->\n <!--\t\t\t\t\t\t\t\t<ion-button color=\"tertiary\" (click)=\"addGroup($event)\">-->\n <!--\t\t\t\t\t\t\t\t\t<ion-icon name=\"add-outline\" slot=\"start\" />-->\n <!--\t\t\t\t\t\t\t\t\t<ion-label>Add group</ion-label>-->\n <!--\t\t\t\t\t\t\t\t</ion-button>-->\n <!--\t\t\t\t\t\t\t</ion-buttons>-->\n <!--\t\t\t\t\t\t}-->\n </ion-item>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n @if (segment === \"list\" || space.type !== \"family\") {\n <ion-list>\n @for (contact of $contacts(); track contact.id) {\n <ion-item-sliding @listItem>\n <sneat-contacts-list-item\n [$space]=\"$space()\"\n [$contact]=\"contact\"\n [contactClicked]=\"contactClicked\"\n [excludeRole]=\"$roleID()\"\n />\n </ion-item-sliding>\n }\n @if ($canAdd()) {\n <ion-item button (click)=\"addNewContact($event)\">\n <ion-icon name=\"add\" color=\"primary\" />\n <ion-label color=\"primary\">Add contact</ion-label>\n </ion-item>\n }\n </ion-list>\n }\n\n @if (segment === \"groups\") {\n <ion-list>\n @if (space.type === \"family\") {\n <sneat-contacts-by-type\n [$contacts]=\"$contactsWithSpace()\"\n [$contactGroupDefinitions]=\"familyGroupDefinitions\"\n [$space]=\"space\"\n [$filter]=\"$filter()\"\n [contactClicked]=\"contactClicked\"\n [command]=\"command\"\n [goToNewContactPage]=\"goToNewContactPage\"\n (contactSelectionChange)=\"contactSelectionChanged($event)\"\n (addContactClick)=\"addContactClick.emit($event)\"\n />\n }\n @if (groups) {\n @for (group of groups; track group.id) {\n <ion-item (click)=\"goGroup(group)\" tappable>\n <ion-label>\n {{ group.brief?.title }}\n </ion-label>\n @if (group.dbo?.numberOf?.members) {\n <ion-badge color=\"light\">\n {{ group.dbo?.numberOf?.members }}\n </ion-badge>\n }\n </ion-item>\n }\n }\n </ion-list>\n }\n</ion-card>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ContactsByTypeComponent, selector: "sneat-contacts-by-type", inputs: ["$space", "$contactGroupDefinitions", "$contacts", "$filter", "contactClicked", "command", "goToNewContactPage"], outputs: ["contactsChange", "contactSelectionChange", "addContactClick"] }, { kind: "component", type: ContactsListItemComponent, selector: "sneat-contacts-list-item", inputs: ["$contact", "$space", "hideCheckbox", "excludeRole", "showAddress", "showBorder", "hideRoles", "relatedTo", "showRelatedAs", "showRelatedItems", "contactClicked"], outputs: ["checkChange"] }, { kind: "component", type: FilterItemComponent, selector: "sneat-filter-item", inputs: ["$filter"], outputs: ["changed", "blured"] }, { kind: "component", type: IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: IonSegmentButton, selector: "ion-segment-button", inputs: ["contentId", "disabled", "layout", "mode", "type", "value"] }, { 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: IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { 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: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItemSliding, selector: "ion-item-sliding", inputs: ["disabled"] }], animations: [listItemAnimations], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
164
+ }
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsComponent, decorators: [{
166
+ type: Component,
167
+ args: [{ selector: 'sneat-contacts', imports: [
168
+ FormsModule,
169
+ ContactsByTypeComponent,
170
+ ContactsListItemComponent,
171
+ FilterItemComponent,
172
+ IonSegment,
173
+ IonSegmentButton,
174
+ IonIcon,
175
+ IonLabel,
176
+ IonBadge,
177
+ IonCard,
178
+ IonGrid,
179
+ IonRow,
180
+ IonCol,
181
+ IonItem,
182
+ IonList,
183
+ IonItemSliding,
184
+ ], providers: [{ provide: ClassName, useValue: 'ContactsComponent' }], changeDetection: ChangeDetectionStrategy.OnPush, animations: [listItemAnimations], template: "@let space = $space();\n@let role = $roleID();\n\n@if (space.type === \"company\") {\n <ion-segment [value]=\"role\" (ionChange)=\"onRoleChanged($event)\">\n <!--\t\t<ion-segment-button>All</ion-segment-button>-->\n @for (r of roles; track r.id) {\n <ion-segment-button [value]=\"r.id\">\n @if (r.iconName) {\n <ion-icon [name]=\"r.iconName\" />\n }\n <ion-label style=\"font-size: smaller\"\n >{{ r.title }}\n <ion-badge color=\"light\">\n <ion-label\n color=\"medium\"\n style=\"font-size: smaller; font-weight: normal\"\n >{{ contactsNumber(r.id) }}\n </ion-label>\n </ion-badge>\n </ion-label>\n </ion-segment-button>\n }\n </ion-segment>\n}\n\n<ion-card>\n <ion-grid class=\"ion-grid-layout\">\n <ion-row>\n <ion-col size=\"12\" size-sm=\"5\">\n <sneat-filter-item\n [$filter]=\"$filter()\"\n (changed)=\"onFilterChanged($event)\"\n />\n </ion-col>\n @if ($showTabs()) {\n <ion-col size=\"12\" size-sm=\"7\">\n <ion-item lines=\"none\" class=\"ion-no-padding-ion-no-margin\">\n <ion-segment [(ngModel)]=\"segment\">\n <ion-segment-button value=\"list\">\n <ion-label>List</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"groups\">\n <ion-label>By type</ion-label>\n </ion-segment-button>\n </ion-segment>\n <!--\t\t\t\t\t\tMake it to work in a modal - too narrow at the moment.-->\n <!--\t\t\t\t\t\t@if (segment === \"groups\") {-->\n <!--\t\t\t\t\t\t\t<ion-buttons slot=\"end\">-->\n <!--\t\t\t\t\t\t\t\t<ion-button color=\"tertiary\" (click)=\"addGroup($event)\">-->\n <!--\t\t\t\t\t\t\t\t\t<ion-icon name=\"add-outline\" slot=\"start\" />-->\n <!--\t\t\t\t\t\t\t\t\t<ion-label>Add group</ion-label>-->\n <!--\t\t\t\t\t\t\t\t</ion-button>-->\n <!--\t\t\t\t\t\t\t</ion-buttons>-->\n <!--\t\t\t\t\t\t}-->\n </ion-item>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n @if (segment === \"list\" || space.type !== \"family\") {\n <ion-list>\n @for (contact of $contacts(); track contact.id) {\n <ion-item-sliding @listItem>\n <sneat-contacts-list-item\n [$space]=\"$space()\"\n [$contact]=\"contact\"\n [contactClicked]=\"contactClicked\"\n [excludeRole]=\"$roleID()\"\n />\n </ion-item-sliding>\n }\n @if ($canAdd()) {\n <ion-item button (click)=\"addNewContact($event)\">\n <ion-icon name=\"add\" color=\"primary\" />\n <ion-label color=\"primary\">Add contact</ion-label>\n </ion-item>\n }\n </ion-list>\n }\n\n @if (segment === \"groups\") {\n <ion-list>\n @if (space.type === \"family\") {\n <sneat-contacts-by-type\n [$contacts]=\"$contactsWithSpace()\"\n [$contactGroupDefinitions]=\"familyGroupDefinitions\"\n [$space]=\"space\"\n [$filter]=\"$filter()\"\n [contactClicked]=\"contactClicked\"\n [command]=\"command\"\n [goToNewContactPage]=\"goToNewContactPage\"\n (contactSelectionChange)=\"contactSelectionChanged($event)\"\n (addContactClick)=\"addContactClick.emit($event)\"\n />\n }\n @if (groups) {\n @for (group of groups; track group.id) {\n <ion-item (click)=\"goGroup(group)\" tappable>\n <ion-label>\n {{ group.brief?.title }}\n </ion-label>\n @if (group.dbo?.numberOf?.members) {\n <ion-badge color=\"light\">\n {{ group.dbo?.numberOf?.members }}\n </ion-badge>\n }\n </ion-item>\n }\n }\n </ion-list>\n }\n</ion-card>\n" }]
185
+ }], ctorParameters: () => [], propDecorators: { $space: [{ type: i0.Input, args: [{ isSignal: true, alias: "$space", required: true }] }], $roleID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$roleID", required: false }] }], command: [{
186
+ type: Input
187
+ }], roleChange: [{
188
+ type: Output
189
+ }], contactsChange: [{
190
+ type: Output
191
+ }], goToNewContactPage: [{
192
+ type: Input
193
+ }], addContactEvent: [{
194
+ type: Output
195
+ }], $allContacts: [{ type: i0.Input, args: [{ isSignal: true, alias: "$allContacts", required: true }] }], contactClicked: [{
196
+ type: Input
197
+ }], addContactClick: [{
198
+ type: Output
199
+ }] } });
200
+ //# sourceMappingURL=contacts.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/contacts-component/contacts.component.ts","../../../../../../../../libs/contactus/shared/src/lib/components/contacts-component/contacts.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 OnInit,\n Output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n IonBadge,\n IonCard,\n IonCol,\n IonGrid,\n IonIcon,\n IonItem,\n IonItemSliding,\n IonLabel,\n IonList,\n IonRow,\n IonSegment,\n IonSegmentButton,\n} from '@ionic/angular/standalone';\nimport { FilterItemComponent } from '@sneat/components';\nimport {\n addSpace,\n ContactRole,\n filterContactsByTextAndRole,\n IContactWithBrief,\n IContactWithCheck,\n IContactWithBriefAndSpace,\n IMemberGroupContext,\n} from '@sneat/contactus-core';\nimport { defaultFamilyContactGroups } from '@sneat/contactus-services';\nimport { listItemAnimations } from '@sneat/core';\nimport { ISpaceContext } from '@sneat/space-models';\nimport { SpaceNavService } from '@sneat/space-services';\nimport { ClassName, ISelectItem, SneatBaseComponent } from '@sneat/ui';\nimport { Observable } from 'rxjs';\nimport { IContactAddEventArgs } from '../contact-events';\nimport { ContactsByTypeComponent } from '../contacts-by-type';\nimport { ICheckChangedArgs } from '../contacts-checklist';\nimport { ContactsComponentCommand } from '../contacts-component.commands';\nimport { ContactsListItemComponent } from '../contacts-list-item/contacts-list-item.component';\nimport { OptionalContactRoleIdAndBrief } from '../contact-forms/new-contact';\n\n@Component({\n selector: 'sneat-contacts',\n templateUrl: './contacts.component.html',\n imports: [\n FormsModule,\n ContactsByTypeComponent,\n ContactsListItemComponent,\n FilterItemComponent,\n IonSegment,\n IonSegmentButton,\n IonIcon,\n IonLabel,\n IonBadge,\n IonCard,\n IonGrid,\n IonRow,\n IonCol,\n IonItem,\n IonList,\n IonItemSliding,\n ],\n providers: [{ provide: ClassName, useValue: 'ContactsComponent' }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [listItemAnimations],\n})\nexport class ContactsComponent extends SneatBaseComponent implements OnInit {\n public readonly $space = input.required<ISpaceContext>();\n\n public readonly $roleID = input<ContactRole | undefined>();\n protected readonly $role = signal<OptionalContactRoleIdAndBrief>(undefined);\n\n @Input() command?: Observable<ContactsComponentCommand>;\n\n @Output() readonly roleChange = new EventEmitter<undefined | ContactRole>();\n\n @Output() public readonly contactsChange = new EventEmitter<\n readonly IContactWithCheck[]\n >();\n\n @Input() goToNewContactPage = true;\n @Output() readonly addContactEvent = new EventEmitter<IContactAddEventArgs>();\n\n protected readonly $showTabs = computed(\n () => !this.$roleID() && this.$space().type === 'family',\n );\n\n protected readonly $filter = signal<string>('');\n\n protected onFilterChanged(filter: string): void {\n this.$filter.set(filter);\n }\n\n private readonly spaceNavService = inject(SpaceNavService);\n\n public readonly $allContacts = input.required<\n readonly IContactWithCheck[] | undefined\n >();\n\n protected readonly $contactsWithSpace = computed<\n readonly IContactWithBriefAndSpace[] | undefined\n >(() => {\n const contacts = this.$contacts();\n if (!contacts) {\n return undefined;\n }\n const space = this.$space();\n return contacts?.map(addSpace(space));\n });\n\n public constructor() {\n super();\n }\n\n protected readonly familyGroupDefinitions = defaultFamilyContactGroups;\n\n public segment: 'list' | 'groups' = 'groups';\n\n public groups: readonly IMemberGroupContext[] = [];\n\n public ngOnInit() {\n this.command?.pipe(this.takeUntilDestroyed()).subscribe((command) => {\n switch (command.name) {\n case 'new_contact':\n this.addNewContact(command.event).catch(\n this.errorLogger.logErrorHandler(\n 'failed to navigate to new contact page',\n ),\n );\n break;\n case 'reset_selected':\n this.contactsChange.emit(\n this.$allContacts()?.map((c) =>\n Object.assign(c, { isChecked: false }),\n ),\n );\n break;\n case 'select_all':\n break;\n }\n });\n }\n\n private $contactsByRole = computed<\n Record<string, readonly IContactWithCheck[]>\n >(() => {\n const contacts = this.$allContacts() || [];\n const contactsByRole: Record<string, IContactWithBriefAndSpace[]> = {\n '': [],\n };\n const space = this.$space();\n contacts.forEach((c) => {\n const contact = { ...c, space };\n contactsByRole[''].push(contact);\n c.brief?.roles?.forEach((role) => {\n const roleContacts = contactsByRole[role as ContactRole];\n if (roleContacts) {\n roleContacts.push(contact);\n } else {\n contactsByRole[role] = [contact];\n }\n });\n });\n return contactsByRole;\n });\n\n readonly roles: readonly ISelectItem[] = [\n { id: '', title: 'All', iconName: 'people-outline' },\n { id: 'freight_agent', title: 'Agents', iconName: 'body-outline' },\n { id: 'buyer', title: 'Buyers', iconName: 'cash-outline' },\n { id: 'dispatcher', title: 'Dispatchers', iconName: 'business-outline' },\n { id: 'trucker', title: 'Truckers', iconName: 'bus-outline' },\n { id: 'shipping_line', title: 'Shipping lines', iconName: 'boat-outline' },\n ];\n\n protected $canAdd = computed<boolean>(() => {\n const role = this.$roleID();\n return role !== 'tenant' && role !== 'landlord';\n });\n\n public contactsNumber(role: string): number {\n const contactsByRole = this.$contactsByRole();\n const roleContacts = (contactsByRole && contactsByRole[role]) ?? [];\n return roleContacts?.length ?? 0;\n }\n\n protected $contacts = computed(() => {\n const allContacts = this.$allContacts();\n if (!allContacts) {\n return undefined;\n }\n const role = this.$roleID(),\n filter = this.$filter().trim().toLowerCase();\n\n const space = this.$space();\n\n return filterContactsByTextAndRole(allContacts, filter, role)?.map(\n addSpace(space),\n );\n });\n\n @Input() public contactClicked = (\n event: Event,\n contact: IContactWithBrief,\n ): void => {\n this.console.log(\n `ContactsComponent.contactClicked(contact{id=${contact.id})`,\n );\n event.stopPropagation();\n event.preventDefault();\n const space = this.$space();\n this.spaceNavService\n .navigateForwardToSpacePage(space, `contact/${contact.id}`, {\n state: { contact },\n })\n .catch(\n this.errorLogger.logErrorHandler('failed to navigate to contact page'),\n );\n };\n\n @Output() readonly addContactClick = new EventEmitter<IContactAddEventArgs>();\n\n protected readonly addNewContact = async (event: Event): Promise<void> => {\n event.stopPropagation();\n event.preventDefault();\n if (!this.goToNewContactPage) {\n const role = this.$role();\n this.addContactClick.emit({\n event,\n role,\n });\n }\n const space = this.$space();\n if (!space.id && !space.type) {\n return;\n }\n try {\n await this.spaceNavService.navigateForwardToSpacePage(\n space,\n 'new-contact',\n { queryParams: this.$roleID() ? { role: this.$roleID() } : undefined },\n );\n } catch (err) {\n this.errorLogger.logError(err, 'failed to navigate to new contact page');\n }\n };\n\n protected contactSelectionChanged(args: ICheckChangedArgs) {\n this.contactsChange.emit(\n this.$allContacts()?.map((c) =>\n Object.assign(c, {\n isChecked: c.id === args.id ? args.checked : c.isChecked,\n }),\n ),\n );\n }\n\n protected goGroup(group: IMemberGroupContext): void {\n const space = this.$space();\n this.spaceNavService\n .navigateForwardToSpacePage(space, `group/${group.id}`, {\n state: {\n group: group,\n },\n })\n .catch(\n this.errorLogger.logErrorHandler(\n 'failed to navigate to contact creation page',\n ),\n );\n }\n\n protected onRoleChanged(event: CustomEvent): void {\n event.stopPropagation();\n this.roleChange.emit(event.detail.value);\n }\n\n protected addGroup(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n alert('Not implemented yet');\n }\n}\n","@let space = $space();\n@let role = $roleID();\n\n@if (space.type === \"company\") {\n <ion-segment [value]=\"role\" (ionChange)=\"onRoleChanged($event)\">\n <!--\t\t<ion-segment-button>All</ion-segment-button>-->\n @for (r of roles; track r.id) {\n <ion-segment-button [value]=\"r.id\">\n @if (r.iconName) {\n <ion-icon [name]=\"r.iconName\" />\n }\n <ion-label style=\"font-size: smaller\"\n >{{ r.title }}\n <ion-badge color=\"light\">\n <ion-label\n color=\"medium\"\n style=\"font-size: smaller; font-weight: normal\"\n >{{ contactsNumber(r.id) }}\n </ion-label>\n </ion-badge>\n </ion-label>\n </ion-segment-button>\n }\n </ion-segment>\n}\n\n<ion-card>\n <ion-grid class=\"ion-grid-layout\">\n <ion-row>\n <ion-col size=\"12\" size-sm=\"5\">\n <sneat-filter-item\n [$filter]=\"$filter()\"\n (changed)=\"onFilterChanged($event)\"\n />\n </ion-col>\n @if ($showTabs()) {\n <ion-col size=\"12\" size-sm=\"7\">\n <ion-item lines=\"none\" class=\"ion-no-padding-ion-no-margin\">\n <ion-segment [(ngModel)]=\"segment\">\n <ion-segment-button value=\"list\">\n <ion-label>List</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"groups\">\n <ion-label>By type</ion-label>\n </ion-segment-button>\n </ion-segment>\n <!--\t\t\t\t\t\tMake it to work in a modal - too narrow at the moment.-->\n <!--\t\t\t\t\t\t@if (segment === \"groups\") {-->\n <!--\t\t\t\t\t\t\t<ion-buttons slot=\"end\">-->\n <!--\t\t\t\t\t\t\t\t<ion-button color=\"tertiary\" (click)=\"addGroup($event)\">-->\n <!--\t\t\t\t\t\t\t\t\t<ion-icon name=\"add-outline\" slot=\"start\" />-->\n <!--\t\t\t\t\t\t\t\t\t<ion-label>Add group</ion-label>-->\n <!--\t\t\t\t\t\t\t\t</ion-button>-->\n <!--\t\t\t\t\t\t\t</ion-buttons>-->\n <!--\t\t\t\t\t\t}-->\n </ion-item>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n @if (segment === \"list\" || space.type !== \"family\") {\n <ion-list>\n @for (contact of $contacts(); track contact.id) {\n <ion-item-sliding @listItem>\n <sneat-contacts-list-item\n [$space]=\"$space()\"\n [$contact]=\"contact\"\n [contactClicked]=\"contactClicked\"\n [excludeRole]=\"$roleID()\"\n />\n </ion-item-sliding>\n }\n @if ($canAdd()) {\n <ion-item button (click)=\"addNewContact($event)\">\n <ion-icon name=\"add\" color=\"primary\" />\n <ion-label color=\"primary\">Add contact</ion-label>\n </ion-item>\n }\n </ion-list>\n }\n\n @if (segment === \"groups\") {\n <ion-list>\n @if (space.type === \"family\") {\n <sneat-contacts-by-type\n [$contacts]=\"$contactsWithSpace()\"\n [$contactGroupDefinitions]=\"familyGroupDefinitions\"\n [$space]=\"space\"\n [$filter]=\"$filter()\"\n [contactClicked]=\"contactClicked\"\n [command]=\"command\"\n [goToNewContactPage]=\"goToNewContactPage\"\n (contactSelectionChange)=\"contactSelectionChanged($event)\"\n (addContactClick)=\"addContactClick.emit($event)\"\n />\n }\n @if (groups) {\n @for (group of groups; track group.id) {\n <ion-item (click)=\"goGroup(group)\" tappable>\n <ion-label>\n {{ group.brief?.title }}\n </ion-label>\n @if (group.dbo?.numberOf?.members) {\n <ion-badge color=\"light\">\n {{ group.dbo?.numberOf?.members }}\n </ion-badge>\n }\n </ion-item>\n }\n }\n </ion-list>\n }\n</ion-card>\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contacts-component.commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-component.commands.js","sourceRoot":"","sources":["../../../../../../../libs/contactus/shared/src/lib/components/contacts-component.commands.ts"],"names":[],"mappings":"","sourcesContent":["export type ContactsComponentCommandName =\n | 'new_contact'\n | 'reset_selected'\n | 'select_all';\n\nexport interface ContactsComponentCommand {\n readonly name: ContactsComponentCommandName;\n readonly event: Event;\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import { Component, computed, Input, input } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import { IonItem, IonItemSliding, IonLabel } from '@ionic/angular/standalone';
4
+ import { addSpace } from '@sneat/contactus-core';
5
+ import { ContactsListItemComponent } from '../contacts-list-item/contacts-list-item.component';
6
+ import * as i0 from "@angular/core";
7
+ export class ContactsListComponent {
8
+ constructor() {
9
+ this.emptyText = 'No contacts';
10
+ this.$space = input.required(...(ngDevMode ? [{ debugName: "$space" }] : []));
11
+ this.$contacts = input.required(...(ngDevMode ? [{ debugName: "$contacts" }] : []));
12
+ this.$contactsWithSpace = computed(() => {
13
+ const space = this.$space();
14
+ return this.$contacts()?.map(addSpace(space)) || [];
15
+ }, ...(ngDevMode ? [{ debugName: "$contactsWithSpace" }] : []));
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ContactsListComponent, isStandalone: true, selector: "sneat-contacts-list", inputs: { emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: false, isRequired: false, transformFunction: null }, $space: { classPropertyName: "$space", publicName: "$space", isSignal: true, isRequired: true, transformFunction: null }, $contacts: { classPropertyName: "$contacts", publicName: "$contacts", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@for (contact of $contactsWithSpace(); track contact.id) {\n <ion-item-sliding>\n <sneat-contacts-list-item [$space]=\"$space()\" [$contact]=\"contact\" />\n </ion-item-sliding>\n} @empty {\n <ion-item lines=\"none\">\n <ion-label color=\"medium\">{{ emptyText }}</ion-label>\n </ion-item>\n}\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "component", type: ContactsListItemComponent, selector: "sneat-contacts-list-item", inputs: ["$contact", "$space", "hideCheckbox", "excludeRole", "showAddress", "showBorder", "hideRoles", "relatedTo", "showRelatedAs", "showRelatedItems", "contactClicked"], outputs: ["checkChange"] }, { kind: "component", type: IonItemSliding, selector: "ion-item-sliding", inputs: ["disabled"] }, { 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: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsListComponent, decorators: [{
21
+ type: Component,
22
+ args: [{ selector: 'sneat-contacts-list', imports: [
23
+ RouterModule,
24
+ ContactsListItemComponent,
25
+ IonItemSliding,
26
+ IonItem,
27
+ IonLabel,
28
+ ], template: "@for (contact of $contactsWithSpace(); track contact.id) {\n <ion-item-sliding>\n <sneat-contacts-list-item [$space]=\"$space()\" [$contact]=\"contact\" />\n </ion-item-sliding>\n} @empty {\n <ion-item lines=\"none\">\n <ion-label color=\"medium\">{{ emptyText }}</ion-label>\n </ion-item>\n}\n" }]
29
+ }], propDecorators: { emptyText: [{
30
+ type: Input
31
+ }], $space: [{ type: i0.Input, args: [{ isSignal: true, alias: "$space", required: true }] }], $contacts: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contacts", required: true }] }] } });
32
+ //# sourceMappingURL=contacts-list.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-list.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/contacts-list/contacts-list.component.ts","../../../../../../../../libs/contactus/shared/src/lib/components/contacts-list/contacts-list.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oDAAoD,CAAC;;AAa/F,MAAM,OAAO,qBAAqB;IAXlC;QAYkB,cAAS,GAAG,aAAa,CAAC;QAC1B,WAAM,GAAG,KAAK,CAAC,QAAQ,iDAAiB,CAAC;QACzC,cAAS,GAAG,KAAK,CAAC,QAAQ,oDAEvC,CAAC;QAEe,uBAAkB,GAAG,QAAQ,CAAC,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,CAAC,8DAAC,CAAC;KACJ;8GAXY,qBAAqB;kGAArB,qBAAqB,6dClBlC,kTASA,2CDEI,YAAY,+BACZ,yBAAyB,4QACzB,cAAc,mFACd,OAAO,0NACP,QAAQ;;2FAGC,qBAAqB;kBAXjC,SAAS;+BACE,qBAAqB,WAEtB;wBACP,YAAY;wBACZ,yBAAyB;wBACzB,cAAc;wBACd,OAAO;wBACP,QAAQ;qBACT;;sBAGA,KAAK","sourcesContent":["import { Component, computed, Input, input } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { IonItem, IonItemSliding, IonLabel } from '@ionic/angular/standalone';\nimport { addSpace, IContactWithCheck } from '@sneat/contactus-core';\nimport { ISpaceContext } from '@sneat/space-models';\nimport { ContactsListItemComponent } from '../contacts-list-item/contacts-list-item.component';\n\n@Component({\n selector: 'sneat-contacts-list',\n templateUrl: './contacts-list.component.html',\n imports: [\n RouterModule,\n ContactsListItemComponent,\n IonItemSliding,\n IonItem,\n IonLabel,\n ],\n})\nexport class ContactsListComponent {\n @Input() public emptyText = 'No contacts';\n public readonly $space = input.required<ISpaceContext>();\n public readonly $contacts = input.required<\n undefined | readonly IContactWithCheck[]\n >();\n\n protected readonly $contactsWithSpace = computed(() => {\n const space = this.$space();\n return this.$contacts()?.map(addSpace(space)) || [];\n });\n}\n","@for (contact of $contactsWithSpace(); track contact.id) {\n <ion-item-sliding>\n <sneat-contacts-list-item [$space]=\"$space()\" [$contact]=\"contact\" />\n </ion-item-sliding>\n} @empty {\n <ion-item lines=\"none\">\n <ion-label color=\"medium\">{{ emptyText }}</ion-label>\n </ion-item>\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export * from './contacts-list.component';
2
+ export * from '../contacts-list-item/contacts-list-item.component';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/contacts-list/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oDAAoD,CAAC","sourcesContent":["export * from './contacts-list.component';\nexport * from '../contacts-list-item/contacts-list-item.component';\n"]}
@@ -0,0 +1,138 @@
1
+ import { TitleCasePipe } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, computed, EventEmitter, input, Input, Output, inject, } from '@angular/core';
3
+ import { IonBadge, IonButton, IonButtons, IonCheckbox, IonIcon, IonItem, IonItemOption, IonItemOptions, IonLabel, IonText, IonTextarea, } from '@ionic/angular/standalone';
4
+ import { CountryFlagPipe, CountryTitle, GenderColorPipe, GenderIconNamePipe, } from '@sneat/components';
5
+ import { ContactService } from '@sneat/contactus-services';
6
+ import { SpaceNavService } from '@sneat/space-services';
7
+ import { ClassName, SneatBaseComponent } from '@sneat/ui';
8
+ import { PersonTitle } from '../../pipes';
9
+ import { RelatedAsComponent } from './related-as.component';
10
+ import * as i0 from "@angular/core";
11
+ export class ContactsListItemComponent extends SneatBaseComponent {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.spaceNavService = inject(SpaceNavService);
15
+ this.contactService = inject(ContactService);
16
+ this.$contact = input.required(...(ngDevMode ? [{ debugName: "$contact" }] : []));
17
+ this.$contactID = computed(() => this.$contact().id, ...(ngDevMode ? [{ debugName: "$contactID" }] : []));
18
+ this.$space = input.required(...(ngDevMode ? [{ debugName: "$space" }] : []));
19
+ this.hideCheckbox = false;
20
+ this.showAddress = false;
21
+ this.showBorder = undefined;
22
+ this.hideRoles = [
23
+ '--',
24
+ 'creator',
25
+ 'contributor',
26
+ 'owner',
27
+ 'space_member',
28
+ ];
29
+ this.showRelatedAs = true;
30
+ // protected get relatedContacts(): readonly IIdAndBrief<IRelatedItem>[] {
31
+ // return []; // zipMapBriefsWithIDs(this.contact?.dto?.related);
32
+ // }
33
+ this.checkChange = new EventEmitter();
34
+ // @Input() clicked: (contactID: string, event: Event) => void = () => void 0;
35
+ this.contactClicked = (event, contact) => {
36
+ this.console.log(`ContactsListItemComponent.contactClicked(contact{id=${contact.id})`);
37
+ event.stopPropagation();
38
+ event.preventDefault();
39
+ this.spaceNavService
40
+ .navigateForwardToSpacePage(this.$space(), `contact/${contact.id}`, {
41
+ state: { contact },
42
+ })
43
+ .catch(this.errorLogger.logErrorHandler('failed to navigate to contact page'));
44
+ };
45
+ }
46
+ checkboxChanged(event) {
47
+ event.stopPropagation();
48
+ event.preventDefault();
49
+ const args = {
50
+ event,
51
+ id: this.$contact().id,
52
+ checked: !!event.detail.checked,
53
+ resolve: () => void 0,
54
+ reject: () => void 0,
55
+ };
56
+ this.checkChange.emit(args);
57
+ }
58
+ hideRole(role) {
59
+ return this.hideRoles.includes(role) || role == this.excludeRole;
60
+ }
61
+ archiveContact() {
62
+ const space = this.$space();
63
+ if (!space.id) {
64
+ return;
65
+ }
66
+ const contact = this.$contact();
67
+ if (contact?.id) {
68
+ this.contactService
69
+ .setContactsStatus({
70
+ status: 'archived',
71
+ spaceID: space.id,
72
+ contactIDs: [contact.id],
73
+ })
74
+ .subscribe({
75
+ next: () => {
76
+ // Success - no action needed
77
+ },
78
+ error: this.errorLogger.logError,
79
+ });
80
+ }
81
+ }
82
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsListItemComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
83
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ContactsListItemComponent, isStandalone: true, selector: "sneat-contacts-list-item", inputs: { $contact: { classPropertyName: "$contact", publicName: "$contact", isSignal: true, isRequired: true, transformFunction: null }, $space: { classPropertyName: "$space", publicName: "$space", isSignal: true, isRequired: true, transformFunction: null }, hideCheckbox: { classPropertyName: "hideCheckbox", publicName: "hideCheckbox", isSignal: false, isRequired: false, transformFunction: null }, excludeRole: { classPropertyName: "excludeRole", publicName: "excludeRole", isSignal: false, isRequired: false, transformFunction: null }, showAddress: { classPropertyName: "showAddress", publicName: "showAddress", isSignal: false, isRequired: false, transformFunction: null }, showBorder: { classPropertyName: "showBorder", publicName: "showBorder", isSignal: false, isRequired: false, transformFunction: null }, hideRoles: { classPropertyName: "hideRoles", publicName: "hideRoles", isSignal: false, isRequired: false, transformFunction: null }, relatedTo: { classPropertyName: "relatedTo", publicName: "relatedTo", isSignal: false, isRequired: false, transformFunction: null }, showRelatedAs: { classPropertyName: "showRelatedAs", publicName: "showRelatedAs", isSignal: false, isRequired: false, transformFunction: null }, showRelatedItems: { classPropertyName: "showRelatedItems", publicName: "showRelatedItems", isSignal: false, isRequired: false, transformFunction: null }, contactClicked: { classPropertyName: "contactClicked", publicName: "contactClicked", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { checkChange: "checkChange" }, providers: [
84
+ {
85
+ provide: ClassName,
86
+ useValue: 'ContactsListItemComponent',
87
+ },
88
+ ], usesInheritance: true, ngImport: i0, template: "@let contact = $contact();\n\n<ion-item\n tappable\n class=\"with-buttons\"\n [lines]=\"showBorder\"\n (click)=\"contactClicked($event, contact)\"\n>\n <ion-icon\n slot=\"start\"\n [name]=\"contact.brief.gender | genderIconName\"\n [color]=\"contact.brief.gender | genderColor\"\n />\n\n <ion-label class=\"sneat-badges\">\n {{ contact | personTitle }}\n @if (contact.brief.roles?.length) {\n @for (role of contact.brief.roles || []; track role) {\n @if (!hideRole(role)) {\n <ion-badge color=\"light\">\n <ion-text color=\"medium\">{{ role | titlecase }}</ion-text>\n </ion-badge>\n }\n }\n }\n\n @if (showRelatedAs && relatedTo) {\n <sneat-related-as\n [$moduleID]=\"'contactus'\"\n [$collectionID]=\"'contacts'\"\n [$spaceRef]=\"$space()\"\n [$itemID]=\"$contactID()\"\n [$relatedTo]=\"relatedTo\"\n />\n }\n @if (showRelatedItems) {\n <!--\t\t@for (relatedContact of relatedContacts; track relatedContact.id) {-->\n <!--\t\t\t@if (firstRelated(relatedContact.brief.rolesOfItem)) {-->\n <!--\t\t\t\t<ion-badge>-->\n <!--\t\t\t\t\t<a [href]=\"relatedContact.id\" (click)=\"clicked(relatedContact.id, $event)\">-->\n <!--\t\t\t\t\t\t{{ relatedContact.id }} (TODO: lookup contact by ID);-->\n <!--\t\t\t\t\t</a>-->\n <!--\t\t\t\t</ion-badge>-->\n <!--\t\t\t}-->\n <!--\t\t}-->\n }\n\n @if (contact.brief.countryID && contact.brief.countryID !== \"--\") {\n <span\n style=\"margin: 0 1em\"\n title=\"{{ contact.brief.countryID | countryTitle }}\"\n >\n {{ contact.brief.countryID | countryFlag }}\n </span>\n }\n </ion-label>\n\n <ion-buttons slot=\"end\">\n @if (contact.dbo?.email) {\n <ion-button\n href=\"mailto:{{ contact.dbo?.email }}\"\n color=\"primary\"\n [title]=\"contact.dbo?.email\"\n (click)=\"$event.stopPropagation()\"\n >&#64;\n </ion-button>\n }\n\n @if (contact.dbo?.phone) {\n <ion-button\n href=\"tel:{{ contact.dbo?.phone }}\"\n color=\"primary\"\n [title]=\"contact.dbo?.phone\"\n (click)=\"$event.stopPropagation()\"\n >\n <ion-icon name=\"call\" />\n </ion-button>\n }\n @if (!contact.dbo?.email) {\n <ion-button color=\"light\">&#64;</ion-button>\n }\n @if (!contact.dbo?.phone) {\n <ion-button color=\"light\">\n <ion-icon name=\"call\" />\n </ion-button>\n }\n </ion-buttons>\n @if (!hideCheckbox) {\n <ion-checkbox\n slot=\"end\"\n [checked]=\"$contact().isChecked\"\n (ionChange)=\"checkboxChanged($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n</ion-item>\n\n@if (showAddress && contact.dbo?.address) {\n <ion-item>\n <ion-label>Address</ion-label>\n <ion-textarea readonly=\"readonly\" [value]=\"contact.dbo?.address\" />\n </ion-item>\n}\n\n<ion-item-options slot=\"end\">\n <ion-item-option color=\"warning\" (click)=\"archiveContact()\"\n >Archive\n </ion-item-option>\n</ion-item-options>\n", styles: ["ion-badge.light{font-weight:400;margin-left:4px}\n"], dependencies: [{ kind: "component", type: RelatedAsComponent, selector: "sneat-related-as", inputs: ["$spaceRef", "$itemID", "$moduleID", "$collectionID", "$relatedTo"] }, { 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: 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: IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { 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: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { 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: CountryTitle, name: "countryTitle" }, { kind: "pipe", type: CountryFlagPipe, name: "countryFlag" }, { kind: "pipe", type: GenderIconNamePipe, name: "genderIconName" }, { kind: "pipe", type: PersonTitle, name: "personTitle" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: GenderColorPipe, name: "genderColor" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
89
+ }
90
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsListItemComponent, decorators: [{
91
+ type: Component,
92
+ args: [{ selector: 'sneat-contacts-list-item', imports: [
93
+ CountryTitle,
94
+ CountryFlagPipe,
95
+ GenderIconNamePipe,
96
+ PersonTitle,
97
+ TitleCasePipe,
98
+ GenderColorPipe,
99
+ RelatedAsComponent,
100
+ IonItem,
101
+ IonIcon,
102
+ IonLabel,
103
+ IonBadge,
104
+ IonText,
105
+ IonButtons,
106
+ IonButton,
107
+ IonCheckbox,
108
+ IonTextarea,
109
+ IonItemOptions,
110
+ IonItemOption,
111
+ ], providers: [
112
+ {
113
+ provide: ClassName,
114
+ useValue: 'ContactsListItemComponent',
115
+ },
116
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let contact = $contact();\n\n<ion-item\n tappable\n class=\"with-buttons\"\n [lines]=\"showBorder\"\n (click)=\"contactClicked($event, contact)\"\n>\n <ion-icon\n slot=\"start\"\n [name]=\"contact.brief.gender | genderIconName\"\n [color]=\"contact.brief.gender | genderColor\"\n />\n\n <ion-label class=\"sneat-badges\">\n {{ contact | personTitle }}\n @if (contact.brief.roles?.length) {\n @for (role of contact.brief.roles || []; track role) {\n @if (!hideRole(role)) {\n <ion-badge color=\"light\">\n <ion-text color=\"medium\">{{ role | titlecase }}</ion-text>\n </ion-badge>\n }\n }\n }\n\n @if (showRelatedAs && relatedTo) {\n <sneat-related-as\n [$moduleID]=\"'contactus'\"\n [$collectionID]=\"'contacts'\"\n [$spaceRef]=\"$space()\"\n [$itemID]=\"$contactID()\"\n [$relatedTo]=\"relatedTo\"\n />\n }\n @if (showRelatedItems) {\n <!--\t\t@for (relatedContact of relatedContacts; track relatedContact.id) {-->\n <!--\t\t\t@if (firstRelated(relatedContact.brief.rolesOfItem)) {-->\n <!--\t\t\t\t<ion-badge>-->\n <!--\t\t\t\t\t<a [href]=\"relatedContact.id\" (click)=\"clicked(relatedContact.id, $event)\">-->\n <!--\t\t\t\t\t\t{{ relatedContact.id }} (TODO: lookup contact by ID);-->\n <!--\t\t\t\t\t</a>-->\n <!--\t\t\t\t</ion-badge>-->\n <!--\t\t\t}-->\n <!--\t\t}-->\n }\n\n @if (contact.brief.countryID && contact.brief.countryID !== \"--\") {\n <span\n style=\"margin: 0 1em\"\n title=\"{{ contact.brief.countryID | countryTitle }}\"\n >\n {{ contact.brief.countryID | countryFlag }}\n </span>\n }\n </ion-label>\n\n <ion-buttons slot=\"end\">\n @if (contact.dbo?.email) {\n <ion-button\n href=\"mailto:{{ contact.dbo?.email }}\"\n color=\"primary\"\n [title]=\"contact.dbo?.email\"\n (click)=\"$event.stopPropagation()\"\n >&#64;\n </ion-button>\n }\n\n @if (contact.dbo?.phone) {\n <ion-button\n href=\"tel:{{ contact.dbo?.phone }}\"\n color=\"primary\"\n [title]=\"contact.dbo?.phone\"\n (click)=\"$event.stopPropagation()\"\n >\n <ion-icon name=\"call\" />\n </ion-button>\n }\n @if (!contact.dbo?.email) {\n <ion-button color=\"light\">&#64;</ion-button>\n }\n @if (!contact.dbo?.phone) {\n <ion-button color=\"light\">\n <ion-icon name=\"call\" />\n </ion-button>\n }\n </ion-buttons>\n @if (!hideCheckbox) {\n <ion-checkbox\n slot=\"end\"\n [checked]=\"$contact().isChecked\"\n (ionChange)=\"checkboxChanged($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n</ion-item>\n\n@if (showAddress && contact.dbo?.address) {\n <ion-item>\n <ion-label>Address</ion-label>\n <ion-textarea readonly=\"readonly\" [value]=\"contact.dbo?.address\" />\n </ion-item>\n}\n\n<ion-item-options slot=\"end\">\n <ion-item-option color=\"warning\" (click)=\"archiveContact()\"\n >Archive\n </ion-item-option>\n</ion-item-options>\n", styles: ["ion-badge.light{font-weight:400;margin-left:4px}\n"] }]
117
+ }], propDecorators: { $contact: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contact", required: true }] }], $space: [{ type: i0.Input, args: [{ isSignal: true, alias: "$space", required: true }] }], hideCheckbox: [{
118
+ type: Input
119
+ }], excludeRole: [{
120
+ type: Input
121
+ }], showAddress: [{
122
+ type: Input
123
+ }], showBorder: [{
124
+ type: Input
125
+ }], hideRoles: [{
126
+ type: Input
127
+ }], relatedTo: [{
128
+ type: Input
129
+ }], showRelatedAs: [{
130
+ type: Input
131
+ }], showRelatedItems: [{
132
+ type: Input
133
+ }], checkChange: [{
134
+ type: Output
135
+ }], contactClicked: [{
136
+ type: Input
137
+ }] } });
138
+ //# sourceMappingURL=contacts-list-item.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-list-item.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/contacts-list-item/contacts-list-item.component.ts","../../../../../../../../libs/contactus/shared/src/lib/components/contacts-list-item/contacts-list-item.component.html"],"names":[],"mappings":"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","sourcesContent":["import { TitleCasePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n EventEmitter,\n input,\n Input,\n Output,\n inject,\n} from '@angular/core';\nimport {\n IonBadge,\n IonButton,\n IonButtons,\n IonCheckbox,\n IonIcon,\n IonItem,\n IonItemOption,\n IonItemOptions,\n IonLabel,\n IonText,\n IonTextarea,\n} from '@ionic/angular/standalone';\nimport {\n CountryFlagPipe,\n CountryTitle,\n GenderColorPipe,\n GenderIconNamePipe,\n} from '@sneat/components';\nimport {\n ContactRole,\n IContactWithBrief,\n IContactWithCheck,\n} from '@sneat/contactus-core';\nimport { ContactService } from '@sneat/contactus-services';\nimport { IRelatedTo } from '@sneat/dto';\nimport { ISpaceContext } from '@sneat/space-models';\nimport { SpaceNavService } from '@sneat/space-services';\nimport { ClassName, SneatBaseComponent } from '@sneat/ui';\nimport { PersonTitle } from '../../pipes';\nimport { ICheckChangedArgs } from '../contacts-checklist';\nimport { RelatedAsComponent } from './related-as.component';\n\n@Component({\n selector: 'sneat-contacts-list-item',\n templateUrl: './contacts-list-item.component.html',\n styleUrls: ['./contacts-list-item.component.scss'],\n imports: [\n CountryTitle,\n CountryFlagPipe,\n GenderIconNamePipe,\n PersonTitle,\n TitleCasePipe,\n GenderColorPipe,\n RelatedAsComponent,\n IonItem,\n IonIcon,\n IonLabel,\n IonBadge,\n IonText,\n IonButtons,\n IonButton,\n IonCheckbox,\n IonTextarea,\n IonItemOptions,\n IonItemOption,\n ],\n providers: [\n {\n provide: ClassName,\n useValue: 'ContactsListItemComponent',\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContactsListItemComponent extends SneatBaseComponent {\n private readonly spaceNavService = inject(SpaceNavService);\n private readonly contactService = inject(ContactService);\n\n public readonly $contact = input.required<IContactWithCheck>();\n public readonly $contactID = computed(() => this.$contact().id);\n public readonly $space = input.required<ISpaceContext>();\n\n @Input() hideCheckbox = false;\n @Input() excludeRole?: ContactRole;\n @Input() showAddress = false;\n @Input() showBorder: undefined | 'full' | 'inset' | 'none' = undefined;\n @Input() hideRoles: string[] = [\n '--',\n 'creator',\n 'contributor',\n 'owner',\n 'space_member',\n ];\n\n // The `relatedTo` input is not used at the moment\n // as in related contacts we set showRelatedAs=false\n // as we are already grouping by related.\n // TODO: We need to use this in the `/space/contacts` page to show relationship to the current user.\n @Input() relatedTo?: IRelatedTo;\n @Input() showRelatedAs = true;\n\n @Input() showRelatedItems?: boolean;\n // protected get relatedContacts(): readonly IIdAndBrief<IRelatedItem>[] {\n // \treturn []; // zipMapBriefsWithIDs(this.contact?.dto?.related);\n // }\n\n @Output() public readonly checkChange = new EventEmitter<ICheckChangedArgs>();\n\n protected checkboxChanged(event: CustomEvent): void {\n event.stopPropagation();\n event.preventDefault();\n const args: ICheckChangedArgs = {\n event,\n id: this.$contact().id,\n checked: !!event.detail.checked,\n resolve: () => void 0,\n reject: () => void 0,\n };\n this.checkChange.emit(args);\n }\n\n hideRole(role: string): boolean {\n return this.hideRoles.includes(role) || role == this.excludeRole;\n }\n\n // @Input() clicked: (contactID: string, event: Event) => void = () => void 0;\n\n @Input() contactClicked = (\n event: Event,\n contact: IContactWithBrief,\n ): void => {\n this.console.log(\n `ContactsListItemComponent.contactClicked(contact{id=${contact.id})`,\n );\n event.stopPropagation();\n event.preventDefault();\n this.spaceNavService\n .navigateForwardToSpacePage(this.$space(), `contact/${contact.id}`, {\n state: { contact },\n })\n .catch(\n this.errorLogger.logErrorHandler('failed to navigate to contact page'),\n );\n };\n\n archiveContact(): void {\n const space = this.$space();\n if (!space.id) {\n return;\n }\n const contact = this.$contact();\n if (contact?.id) {\n this.contactService\n .setContactsStatus({\n status: 'archived',\n spaceID: space.id,\n contactIDs: [contact.id],\n })\n .subscribe({\n next: () => {\n // Success - no action needed\n },\n error: this.errorLogger.logError,\n });\n }\n }\n}\n","@let contact = $contact();\n\n<ion-item\n tappable\n class=\"with-buttons\"\n [lines]=\"showBorder\"\n (click)=\"contactClicked($event, contact)\"\n>\n <ion-icon\n slot=\"start\"\n [name]=\"contact.brief.gender | genderIconName\"\n [color]=\"contact.brief.gender | genderColor\"\n />\n\n <ion-label class=\"sneat-badges\">\n {{ contact | personTitle }}\n @if (contact.brief.roles?.length) {\n @for (role of contact.brief.roles || []; track role) {\n @if (!hideRole(role)) {\n <ion-badge color=\"light\">\n <ion-text color=\"medium\">{{ role | titlecase }}</ion-text>\n </ion-badge>\n }\n }\n }\n\n @if (showRelatedAs && relatedTo) {\n <sneat-related-as\n [$moduleID]=\"'contactus'\"\n [$collectionID]=\"'contacts'\"\n [$spaceRef]=\"$space()\"\n [$itemID]=\"$contactID()\"\n [$relatedTo]=\"relatedTo\"\n />\n }\n @if (showRelatedItems) {\n <!--\t\t@for (relatedContact of relatedContacts; track relatedContact.id) {-->\n <!--\t\t\t@if (firstRelated(relatedContact.brief.rolesOfItem)) {-->\n <!--\t\t\t\t<ion-badge>-->\n <!--\t\t\t\t\t<a [href]=\"relatedContact.id\" (click)=\"clicked(relatedContact.id, $event)\">-->\n <!--\t\t\t\t\t\t{{ relatedContact.id }} (TODO: lookup contact by ID);-->\n <!--\t\t\t\t\t</a>-->\n <!--\t\t\t\t</ion-badge>-->\n <!--\t\t\t}-->\n <!--\t\t}-->\n }\n\n @if (contact.brief.countryID && contact.brief.countryID !== \"--\") {\n <span\n style=\"margin: 0 1em\"\n title=\"{{ contact.brief.countryID | countryTitle }}\"\n >\n {{ contact.brief.countryID | countryFlag }}\n </span>\n }\n </ion-label>\n\n <ion-buttons slot=\"end\">\n @if (contact.dbo?.email) {\n <ion-button\n href=\"mailto:{{ contact.dbo?.email }}\"\n color=\"primary\"\n [title]=\"contact.dbo?.email\"\n (click)=\"$event.stopPropagation()\"\n >&#64;\n </ion-button>\n }\n\n @if (contact.dbo?.phone) {\n <ion-button\n href=\"tel:{{ contact.dbo?.phone }}\"\n color=\"primary\"\n [title]=\"contact.dbo?.phone\"\n (click)=\"$event.stopPropagation()\"\n >\n <ion-icon name=\"call\" />\n </ion-button>\n }\n @if (!contact.dbo?.email) {\n <ion-button color=\"light\">&#64;</ion-button>\n }\n @if (!contact.dbo?.phone) {\n <ion-button color=\"light\">\n <ion-icon name=\"call\" />\n </ion-button>\n }\n </ion-buttons>\n @if (!hideCheckbox) {\n <ion-checkbox\n slot=\"end\"\n [checked]=\"$contact().isChecked\"\n (ionChange)=\"checkboxChanged($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n</ion-item>\n\n@if (showAddress && contact.dbo?.address) {\n <ion-item>\n <ion-label>Address</ion-label>\n <ion-textarea readonly=\"readonly\" [value]=\"contact.dbo?.address\" />\n </ion-item>\n}\n\n<ion-item-options slot=\"end\">\n <ion-item-option color=\"warning\" (click)=\"archiveContact()\"\n >Archive\n </ion-item-option>\n</ion-item-options>\n"]}
@@ -0,0 +1,34 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, } from '@angular/core';
2
+ import { IonText } from '@ionic/angular/standalone';
3
+ import { getRelatedItemByKey } from '@sneat/dto';
4
+ import * as i0 from "@angular/core";
5
+ export class RelatedAsComponent {
6
+ constructor() {
7
+ this.$spaceRef = input.required(...(ngDevMode ? [{ debugName: "$spaceRef" }] : []));
8
+ this.$spaceID = computed(() => this.$spaceRef().id, ...(ngDevMode ? [{ debugName: "$spaceID" }] : []));
9
+ this.$itemID = input.required(...(ngDevMode ? [{ debugName: "$itemID" }] : []));
10
+ this.$moduleID = input.required(...(ngDevMode ? [{ debugName: "$moduleID" }] : []));
11
+ this.$collectionID = input.required(...(ngDevMode ? [{ debugName: "$collectionID" }] : []));
12
+ this.$relatedTo = input.required(...(ngDevMode ? [{ debugName: "$relatedTo" }] : []));
13
+ this.$relatedTitle = computed(() => this.$relatedTo().title, ...(ngDevMode ? [{ debugName: "$relatedTitle" }] : []));
14
+ this.$relatedItemsOfRelatedItem = computed(() => this.$relatedTo().related, ...(ngDevMode ? [{ debugName: "$relatedItemsOfRelatedItem" }] : []));
15
+ this.$relatedAsRoles = computed(() => {
16
+ const relatedItem = getRelatedItemByKey(this.$relatedItemsOfRelatedItem(), {
17
+ module: this.$moduleID(),
18
+ collection: this.$collectionID(),
19
+ spaceID: this.$spaceID(),
20
+ itemID: this.$itemID(),
21
+ });
22
+ return relatedItem?.rolesOfItem
23
+ ? Object.keys(relatedItem.rolesOfItem)
24
+ : undefined;
25
+ }, ...(ngDevMode ? [{ debugName: "$relatedAsRoles" }] : []));
26
+ }
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RelatedAsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: RelatedAsComponent, isStandalone: true, selector: "sneat-related-as", inputs: { $spaceRef: { classPropertyName: "$spaceRef", publicName: "$spaceRef", isSignal: true, isRequired: true, transformFunction: null }, $itemID: { classPropertyName: "$itemID", publicName: "$itemID", isSignal: true, isRequired: true, transformFunction: null }, $moduleID: { classPropertyName: "$moduleID", publicName: "$moduleID", isSignal: true, isRequired: true, transformFunction: null }, $collectionID: { classPropertyName: "$collectionID", publicName: "$collectionID", isSignal: true, isRequired: true, transformFunction: null }, $relatedTo: { classPropertyName: "$relatedTo", publicName: "$relatedTo", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@let relatedAsRoles = $relatedAsRoles();\n@if (relatedAsRoles?.length) {\n <ion-text color=\"medium\" class=\"ion-padding-start\">\n &mdash;\n @for (\n role of relatedAsRoles;\n track role;\n let last = $last;\n let first = $first\n ) {\n @if (last && !first) {\n and\n }\n {{ role }}\n }\n @if ($relatedTitle(); as relatedTitle) {\n of {{ relatedTitle }}\n }\n </ion-text>\n}\n", dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RelatedAsComponent, decorators: [{
31
+ type: Component,
32
+ args: [{ selector: 'sneat-related-as', changeDetection: ChangeDetectionStrategy.OnPush, imports: [IonText], template: "@let relatedAsRoles = $relatedAsRoles();\n@if (relatedAsRoles?.length) {\n <ion-text color=\"medium\" class=\"ion-padding-start\">\n &mdash;\n @for (\n role of relatedAsRoles;\n track role;\n let last = $last;\n let first = $first\n ) {\n @if (last && !first) {\n and\n }\n {{ role }}\n }\n @if ($relatedTitle(); as relatedTitle) {\n of {{ relatedTitle }}\n }\n </ion-text>\n}\n" }]
33
+ }], propDecorators: { $spaceRef: [{ type: i0.Input, args: [{ isSignal: true, alias: "$spaceRef", required: true }] }], $itemID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$itemID", required: true }] }], $moduleID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$moduleID", required: true }] }], $collectionID: [{ type: i0.Input, args: [{ isSignal: true, alias: "$collectionID", required: true }] }], $relatedTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "$relatedTo", required: true }] }] } });
34
+ //# sourceMappingURL=related-as.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"related-as.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/contacts-list-item/related-as.component.ts","../../../../../../../../libs/contactus/shared/src/lib/components/contacts-list-item/related-as.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,QAAQ,EACR,KAAK,GACN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAc,MAAM,YAAY,CAAC;;AAQ7D,MAAM,OAAO,kBAAkB;IAN/B;QAOS,cAAS,GAAG,KAAK,CAAC,QAAQ,oDAAa,CAAC;QACrC,aAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,oDAAC,CAAC;QAClD,YAAO,GAAG,KAAK,CAAC,QAAQ,kDAAU,CAAC;QACnC,cAAS,GAAG,KAAK,CAAC,QAAQ,oDAAU,CAAC;QACrC,kBAAa,GAAG,KAAK,CAAC,QAAQ,wDAAU,CAAC;QAEhC,eAAU,GAAG,KAAK,CAAC,QAAQ,qDAAc,CAAC;QAEnD,kBAAa,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,yDAAC,CAAC;QACxD,+BAA0B,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,sEAAC,CAAC;QAE3D,oBAAe,GAAG,QAAQ,CAAC,GAAG,EAAE;YACjD,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE;gBACzE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;gBACxB,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;gBAChC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACxB,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE;aACvB,CAAC,CAAC;YACH,OAAO,WAAW,EAAE,WAAW;gBAC7B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;gBACtC,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC,2DAAC,CAAC;KACJ;8GAvBY,kBAAkB;kGAAlB,kBAAkB,gvBChB/B,+bAoBA,4CDNY,OAAO;;2FAEN,kBAAkB;kBAN9B,SAAS;+BACE,kBAAkB,mBAEX,uBAAuB,CAAC,MAAM,WACtC,CAAC,OAAO,CAAC","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { IonText } from '@ionic/angular/standalone';\nimport { ISpaceRef } from '@sneat/core';\nimport { getRelatedItemByKey, IRelatedTo } from '@sneat/dto';\n\n@Component({\n selector: 'sneat-related-as',\n templateUrl: 'related-as.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IonText],\n})\nexport class RelatedAsComponent {\n public $spaceRef = input.required<ISpaceRef>();\n protected $spaceID = computed(() => this.$spaceRef().id);\n public $itemID = input.required<string>();\n public $moduleID = input.required<string>();\n public $collectionID = input.required<string>();\n\n public readonly $relatedTo = input.required<IRelatedTo>();\n\n public $relatedTitle = computed(() => this.$relatedTo().title);\n public $relatedItemsOfRelatedItem = computed(() => this.$relatedTo().related);\n\n protected readonly $relatedAsRoles = computed(() => {\n const relatedItem = getRelatedItemByKey(this.$relatedItemsOfRelatedItem(), {\n module: this.$moduleID(),\n collection: this.$collectionID(),\n spaceID: this.$spaceID(),\n itemID: this.$itemID(),\n });\n return relatedItem?.rolesOfItem\n ? Object.keys(relatedItem.rolesOfItem)\n : undefined;\n });\n}\n","@let relatedAsRoles = $relatedAsRoles();\n@if (relatedAsRoles?.length) {\n <ion-text color=\"medium\" class=\"ion-padding-start\">\n &mdash;\n @for (\n role of relatedAsRoles;\n track role;\n let last = $last;\n let first = $first\n ) {\n @if (last && !first) {\n and\n }\n {{ role }}\n }\n @if ($relatedTitle(); as relatedTitle) {\n of {{ relatedTitle }}\n }\n </ion-text>\n}\n"]}