@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.
- package/esm2022/index.js +4 -0
- package/esm2022/index.js.map +1 -0
- package/esm2022/lib/components/address-form/address-form.component.js +182 -0
- package/esm2022/lib/components/address-form/address-form.component.js.map +1 -0
- package/esm2022/lib/components/address-form/index.js +2 -0
- package/esm2022/lib/components/address-form/index.js.map +1 -0
- package/esm2022/lib/components/basic-contact-form/basic-contact-form.component.js +71 -0
- package/esm2022/lib/components/basic-contact-form/basic-contact-form.component.js.map +1 -0
- package/esm2022/lib/components/basic-contact-form/index.js +2 -0
- package/esm2022/lib/components/basic-contact-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-comm-channels/comm-channel-form.component.js +90 -0
- package/esm2022/lib/components/contact-comm-channels/comm-channel-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-comm-channels/comm-channel-item.component.js +128 -0
- package/esm2022/lib/components/contact-comm-channels/comm-channel-item.component.js.map +1 -0
- package/esm2022/lib/components/contact-comm-channels/comm-channels-list.component.js +30 -0
- package/esm2022/lib/components/contact-comm-channels/comm-channels-list.component.js.map +1 -0
- package/esm2022/lib/components/contact-comm-channels/contact-comm-channels.component.js +16 -0
- package/esm2022/lib/components/contact-comm-channels/contact-comm-channels.component.js.map +1 -0
- package/esm2022/lib/components/contact-comm-channels/contact-emails.component.js +30 -0
- package/esm2022/lib/components/contact-comm-channels/contact-emails.component.js.map +1 -0
- package/esm2022/lib/components/contact-comm-channels/contact-phones.component.js +30 -0
- package/esm2022/lib/components/contact-comm-channels/contact-phones.component.js.map +1 -0
- package/esm2022/lib/components/contact-comm-channels/index.js +2 -0
- package/esm2022/lib/components/contact-comm-channels/index.js.map +1 -0
- package/esm2022/lib/components/contact-details/contact-details.component.js +235 -0
- package/esm2022/lib/components/contact-details/contact-details.component.js.map +1 -0
- package/esm2022/lib/components/contact-details/index.js +2 -0
- package/esm2022/lib/components/contact-details/index.js.map +1 -0
- package/esm2022/lib/components/contact-details/related-contacts.component.js +116 -0
- package/esm2022/lib/components/contact-details/related-contacts.component.js.map +1 -0
- package/esm2022/lib/components/contact-dob/contact-dob.component.js +57 -0
- package/esm2022/lib/components/contact-dob/contact-dob.component.js.map +1 -0
- package/esm2022/lib/components/contact-dob/index.js +2 -0
- package/esm2022/lib/components/contact-dob/index.js.map +1 -0
- package/esm2022/lib/components/contact-events.js +2 -0
- package/esm2022/lib/components/contact-events.js.map +1 -0
- package/esm2022/lib/components/contact-forms/contact-form-base.component.js +30 -0
- package/esm2022/lib/components/contact-forms/contact-form-base.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/emails-form/emails-form.component.js +76 -0
- package/esm2022/lib/components/contact-forms/emails-form/emails-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/emails-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/emails-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/index.js +11 -0
- package/esm2022/lib/components/contact-forms/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/location-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/location-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/location-form/location-form.component.js +194 -0
- package/esm2022/lib/components/contact-forms/location-form/location-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/new-contact/index.js +5 -0
- package/esm2022/lib/components/contact-forms/new-contact/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-company-form.component.js +115 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-company-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-contact-form-base.component.js +34 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-contact-form-base.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-contact-form.component.js +82 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-contact-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-person-form.component.js +282 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-person-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-pet-form.component.js +25 -0
- package/esm2022/lib/components/contact-forms/new-contact/new-pet-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/person-forms/age-group/age-group-form.component.js +64 -0
- package/esm2022/lib/components/contact-forms/person-forms/age-group/age-group-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/person-forms/age-group/index.js +2 -0
- package/esm2022/lib/components/contact-forms/person-forms/age-group/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/person-forms/gender-form/gender-form.component.js +118 -0
- package/esm2022/lib/components/contact-forms/person-forms/gender-form/gender-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/person-forms/gender-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/person-forms/gender-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/person-forms/names-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/person-forms/names-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/person-forms/names-form/names-form.component.js +296 -0
- package/esm2022/lib/components/contact-forms/person-forms/names-form/names-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/pesson-wizard/index.js +2 -0
- package/esm2022/lib/components/contact-forms/pesson-wizard/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/pesson-wizard/person-wizard.component.js +369 -0
- package/esm2022/lib/components/contact-forms/pesson-wizard/person-wizard.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/pet-kind-and-breed-form.component.js +66 -0
- package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/pet-kind-and-breed-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/phones-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/phones-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/phones-form/phones-form.component.js +79 -0
- package/esm2022/lib/components/contact-forms/phones-form/phones-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/relationship-form/contact-relationship-form.component.js +125 -0
- package/esm2022/lib/components/contact-forms/relationship-form/contact-relationship-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/relationship-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/relationship-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/relationship-form/relationship-form.component.js +136 -0
- package/esm2022/lib/components/contact-forms/relationship-form/relationship-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/role-form/contact-role-form.component.js +98 -0
- package/esm2022/lib/components/contact-forms/role-form/contact-role-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/role-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/role-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/roles-form/index.js +2 -0
- package/esm2022/lib/components/contact-forms/roles-form/index.js.map +1 -0
- package/esm2022/lib/components/contact-forms/roles-form/roles-form.component.js +59 -0
- package/esm2022/lib/components/contact-forms/roles-form/roles-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-forms/space-related-form.component.js +32 -0
- package/esm2022/lib/components/contact-forms/space-related-form.component.js.map +1 -0
- package/esm2022/lib/components/contact-input/contact-input.component.js +151 -0
- package/esm2022/lib/components/contact-input/contact-input.component.js.map +1 -0
- package/esm2022/lib/components/contact-input/index.js +2 -0
- package/esm2022/lib/components/contact-input/index.js.map +1 -0
- package/esm2022/lib/components/contact-locations/contact-locations.component.js +52 -0
- package/esm2022/lib/components/contact-locations/contact-locations.component.js.map +1 -0
- package/esm2022/lib/components/contact-locations/index.js +2 -0
- package/esm2022/lib/components/contact-locations/index.js.map +1 -0
- package/esm2022/lib/components/contact-modules-menu/contact-modules-menu.component.js +29 -0
- package/esm2022/lib/components/contact-modules-menu/contact-modules-menu.component.js.map +1 -0
- package/esm2022/lib/components/contact-modules-menu/index.js +2 -0
- package/esm2022/lib/components/contact-modules-menu/index.js.map +1 -0
- package/esm2022/lib/components/contact-role-badges/contact-role-badges.component.js +44 -0
- package/esm2022/lib/components/contact-role-badges/contact-role-badges.component.js.map +1 -0
- package/esm2022/lib/components/contact-roles-input/contact-roles-input.component.js +37 -0
- package/esm2022/lib/components/contact-roles-input/contact-roles-input.component.js.map +1 -0
- package/esm2022/lib/components/contact-roles-input/index.js +2 -0
- package/esm2022/lib/components/contact-roles-input/index.js.map +1 -0
- package/esm2022/lib/components/contacts-by-type/contacts-by-type.component.js +200 -0
- package/esm2022/lib/components/contacts-by-type/contacts-by-type.component.js.map +1 -0
- package/esm2022/lib/components/contacts-by-type/index.js +2 -0
- package/esm2022/lib/components/contacts-by-type/index.js.map +1 -0
- package/esm2022/lib/components/contacts-checklist/contacts-checklist-item.component.js +32 -0
- package/esm2022/lib/components/contacts-checklist/contacts-checklist-item.component.js.map +1 -0
- package/esm2022/lib/components/contacts-checklist/contacts-checklist.component.js +140 -0
- package/esm2022/lib/components/contacts-checklist/contacts-checklist.component.js.map +1 -0
- package/esm2022/lib/components/contacts-checklist/index.js +2 -0
- package/esm2022/lib/components/contacts-checklist/index.js.map +1 -0
- package/esm2022/lib/components/contacts-component/contacts.component.js +200 -0
- package/esm2022/lib/components/contacts-component/contacts.component.js.map +1 -0
- package/esm2022/lib/components/contacts-component.commands.js +2 -0
- package/esm2022/lib/components/contacts-component.commands.js.map +1 -0
- package/esm2022/lib/components/contacts-list/contacts-list.component.js +32 -0
- package/esm2022/lib/components/contacts-list/contacts-list.component.js.map +1 -0
- package/esm2022/lib/components/contacts-list/index.js +3 -0
- package/esm2022/lib/components/contacts-list/index.js.map +1 -0
- package/esm2022/lib/components/contacts-list-item/contacts-list-item.component.js +138 -0
- package/esm2022/lib/components/contacts-list-item/contacts-list-item.component.js.map +1 -0
- package/esm2022/lib/components/contacts-list-item/related-as.component.js +34 -0
- package/esm2022/lib/components/contacts-list-item/related-as.component.js.map +1 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector-input.component.js +91 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector-input.component.js.map +1 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.component.js +415 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.component.js.map +1 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.interfaces.js +2 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.interfaces.js.map +1 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.module.js +28 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.module.js.map +1 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.service.js +18 -0
- package/esm2022/lib/components/contacts-selector/contacts-selector.service.js.map +1 -0
- package/esm2022/lib/components/contacts-selector/lib-exports.js +6 -0
- package/esm2022/lib/components/contacts-selector/lib-exports.js.map +1 -0
- package/esm2022/lib/components/contactus-module.base.component.js +4 -0
- package/esm2022/lib/components/contactus-module.base.component.js.map +1 -0
- package/esm2022/lib/components/inlist-options/inlist-age-group.component.js +53 -0
- package/esm2022/lib/components/inlist-options/inlist-age-group.component.js.map +1 -0
- package/esm2022/lib/components/inlist-options/inlist-options.component.js +27 -0
- package/esm2022/lib/components/inlist-options/inlist-options.component.js.map +1 -0
- package/esm2022/lib/components/invite-links/invite-links.component.js +87 -0
- package/esm2022/lib/components/invite-links/invite-links.component.js.map +1 -0
- package/esm2022/lib/components/lib-exports.js +29 -0
- package/esm2022/lib/components/lib-exports.js.map +1 -0
- package/esm2022/lib/components/members-as-badges/contacts-as-badges.component.js +39 -0
- package/esm2022/lib/components/members-as-badges/contacts-as-badges.component.js.map +1 -0
- package/esm2022/lib/components/members-as-badges/index.js +2 -0
- package/esm2022/lib/components/members-as-badges/index.js.map +1 -0
- package/esm2022/lib/components/members-by-role/family-members.component.js +180 -0
- package/esm2022/lib/components/members-by-role/family-members.component.js.map +1 -0
- package/esm2022/lib/components/members-by-role/index.js +4 -0
- package/esm2022/lib/components/members-by-role/index.js.map +1 -0
- package/esm2022/lib/components/members-by-role/member-group.js +2 -0
- package/esm2022/lib/components/members-by-role/member-group.js.map +1 -0
- package/esm2022/lib/components/members-by-role/members-by-role.component.js +34 -0
- package/esm2022/lib/components/members-by-role/members-by-role.component.js.map +1 -0
- package/esm2022/lib/components/members-card-header/members-card-header.component.js +33 -0
- package/esm2022/lib/components/members-card-header/members-card-header.component.js.map +1 -0
- package/esm2022/lib/components/members-list/index.js +2 -0
- package/esm2022/lib/components/members-list/index.js.map +1 -0
- package/esm2022/lib/components/members-list/members-list.component.js +164 -0
- package/esm2022/lib/components/members-list/members-list.component.js.map +1 -0
- package/esm2022/lib/components/members-short-list-card/members-short-list-card.component.js +60 -0
- package/esm2022/lib/components/members-short-list-card/members-short-list-card.component.js.map +1 -0
- package/esm2022/lib/components/shared-with/index.js +2 -0
- package/esm2022/lib/components/shared-with/index.js.map +1 -0
- package/esm2022/lib/components/shared-with/shared-with.component.js +25 -0
- package/esm2022/lib/components/shared-with/shared-with.component.js.map +1 -0
- package/esm2022/lib/components/with-new-contact-input.js +18 -0
- package/esm2022/lib/components/with-new-contact-input.js.map +1 -0
- package/esm2022/lib/constants.js +2 -0
- package/esm2022/lib/constants.js.map +1 -0
- package/esm2022/lib/index.js +3 -0
- package/esm2022/lib/index.js.map +1 -0
- package/esm2022/lib/modals/contact-names-modal/contact-names-modal.component.js +88 -0
- package/esm2022/lib/modals/contact-names-modal/contact-names-modal.component.js.map +1 -0
- package/esm2022/lib/modals/invite-modal/index.js +2 -0
- package/esm2022/lib/modals/invite-modal/index.js.map +1 -0
- package/esm2022/lib/modals/invite-modal/invite-modal.component.js +255 -0
- package/esm2022/lib/modals/invite-modal/invite-modal.component.js.map +1 -0
- package/esm2022/lib/pipes/contact-title.pipe.js +25 -0
- package/esm2022/lib/pipes/contact-title.pipe.js.map +1 -0
- package/esm2022/lib/pipes/index.js +4 -0
- package/esm2022/lib/pipes/index.js.map +1 -0
- package/esm2022/lib/pipes/person-title.pipe.js +21 -0
- package/esm2022/lib/pipes/person-title.pipe.js.map +1 -0
- package/esm2022/lib/pipes/selected-contacts.pipe.js +22 -0
- package/esm2022/lib/pipes/selected-contacts.pipe.js.map +1 -0
- package/esm2022/lib/providers/user-space-brief.provider.js +30 -0
- package/esm2022/lib/providers/user-space-brief.provider.js.map +1 -0
- package/esm2022/lib/ui-types.js +2 -0
- package/esm2022/lib/ui-types.js.map +1 -0
- package/esm2022/sneat-contactus-shared.js +5 -0
- package/esm2022/sneat-contactus-shared.js.map +1 -0
- package/index.d.ts +3 -0
- package/lib/components/address-form/address-form.component.d.ts +51 -0
- package/lib/components/address-form/index.d.ts +1 -0
- package/lib/components/basic-contact-form/basic-contact-form.component.d.ts +20 -0
- package/lib/components/basic-contact-form/index.d.ts +1 -0
- package/lib/components/contact-comm-channels/comm-channel-form.component.d.ts +20 -0
- package/lib/components/contact-comm-channels/comm-channel-item.component.d.ts +24 -0
- package/lib/components/contact-comm-channels/comm-channels-list.component.d.ts +15 -0
- package/lib/components/contact-comm-channels/contact-comm-channels.component.d.ts +7 -0
- package/lib/components/contact-comm-channels/contact-emails.component.d.ts +9 -0
- package/lib/components/contact-comm-channels/contact-phones.component.d.ts +9 -0
- package/lib/components/contact-comm-channels/index.d.ts +1 -0
- package/lib/components/contact-details/contact-details.component.d.ts +32 -0
- package/lib/components/contact-details/index.d.ts +1 -0
- package/lib/components/contact-details/related-contacts.component.d.ts +24 -0
- package/lib/components/contact-dob/contact-dob.component.d.ts +13 -0
- package/lib/components/contact-dob/index.d.ts +1 -0
- package/lib/components/contact-events.d.ts +6 -0
- package/lib/components/contact-forms/contact-form-base.component.d.ts +15 -0
- package/lib/components/contact-forms/emails-form/emails-form.component.d.ts +27 -0
- package/lib/components/contact-forms/emails-form/index.d.ts +1 -0
- package/lib/components/contact-forms/index.d.ts +10 -0
- package/lib/components/contact-forms/location-form/index.d.ts +1 -0
- package/lib/components/contact-forms/location-form/location-form.component.d.ts +39 -0
- package/lib/components/contact-forms/new-contact/index.d.ts +4 -0
- package/lib/components/contact-forms/new-contact/new-company-form.component.d.ts +26 -0
- package/lib/components/contact-forms/new-contact/new-contact-form-base.component.d.ts +15 -0
- package/lib/components/contact-forms/new-contact/new-contact-form.component.d.ts +20 -0
- package/lib/components/contact-forms/new-contact/new-person-form.component.d.ts +51 -0
- package/lib/components/contact-forms/new-contact/new-pet-form.component.d.ts +8 -0
- package/lib/components/contact-forms/person-forms/age-group/age-group-form.component.d.ts +17 -0
- package/lib/components/contact-forms/person-forms/age-group/index.d.ts +1 -0
- package/lib/components/contact-forms/person-forms/gender-form/gender-form.component.d.ts +22 -0
- package/lib/components/contact-forms/person-forms/gender-form/index.d.ts +1 -0
- package/lib/components/contact-forms/person-forms/names-form/index.d.ts +1 -0
- package/lib/components/contact-forms/person-forms/names-form/names-form.component.d.ts +63 -0
- package/lib/components/contact-forms/pesson-wizard/index.d.ts +1 -0
- package/lib/components/contact-forms/pesson-wizard/person-wizard.component.d.ts +63 -0
- package/lib/components/contact-forms/pet-kind-and-breed-form/index.d.ts +1 -0
- package/lib/components/contact-forms/pet-kind-and-breed-form/pet-kind-and-breed-form.component.d.ts +14 -0
- package/lib/components/contact-forms/phones-form/index.d.ts +1 -0
- package/lib/components/contact-forms/phones-form/phones-form.component.d.ts +21 -0
- package/lib/components/contact-forms/relationship-form/contact-relationship-form.component.d.ts +24 -0
- package/lib/components/contact-forms/relationship-form/index.d.ts +1 -0
- package/lib/components/contact-forms/relationship-form/relationship-form.component.d.ts +34 -0
- package/lib/components/contact-forms/role-form/contact-role-form.component.d.ts +33 -0
- package/lib/components/contact-forms/role-form/index.d.ts +1 -0
- package/lib/components/contact-forms/roles-form/index.d.ts +1 -0
- package/lib/components/contact-forms/roles-form/roles-form.component.d.ts +21 -0
- package/lib/components/contact-forms/space-related-form.component.d.ts +11 -0
- package/lib/components/contact-input/contact-input.component.d.ts +36 -0
- package/lib/components/contact-input/index.d.ts +1 -0
- package/lib/components/contact-locations/contact-locations.component.d.ts +14 -0
- package/lib/components/contact-locations/index.d.ts +1 -0
- package/lib/components/contact-modules-menu/contact-modules-menu.component.d.ts +12 -0
- package/lib/components/contact-modules-menu/index.d.ts +1 -0
- package/lib/components/contact-role-badges/contact-role-badges.component.d.ts +12 -0
- package/lib/components/contact-roles-input/contact-roles-input.component.d.ts +18 -0
- package/lib/components/contact-roles-input/index.d.ts +1 -0
- package/lib/components/contacts-by-type/contacts-by-type.component.d.ts +38 -0
- package/lib/components/contacts-by-type/index.d.ts +1 -0
- package/lib/components/contacts-checklist/contacts-checklist-item.component.d.ts +21 -0
- package/lib/components/contacts-checklist/contacts-checklist.component.d.ts +40 -0
- package/lib/components/contacts-checklist/index.d.ts +1 -0
- package/lib/components/contacts-component/contacts.component.d.ts +45 -0
- package/lib/components/contacts-component.commands.d.ts +5 -0
- package/lib/components/contacts-list/contacts-list.component.d.ts +11 -0
- package/lib/components/contacts-list/index.d.ts +2 -0
- package/lib/components/contacts-list-item/contacts-list-item.component.d.ts +29 -0
- package/lib/components/contacts-list-item/related-as.component.d.ts +16 -0
- package/lib/components/contacts-selector/contacts-selector-input.component.d.ts +24 -0
- package/lib/components/contacts-selector/contacts-selector.component.d.ts +80 -0
- package/lib/components/contacts-selector/contacts-selector.interfaces.d.ts +22 -0
- package/lib/components/contacts-selector/contacts-selector.module.d.ts +6 -0
- package/lib/components/contacts-selector/contacts-selector.service.d.ts +10 -0
- package/lib/components/contacts-selector/lib-exports.d.ts +5 -0
- package/lib/components/contactus-module.base.component.d.ts +4 -0
- package/lib/components/inlist-options/inlist-age-group.component.d.ts +12 -0
- package/lib/components/inlist-options/inlist-options.component.d.ts +18 -0
- package/lib/components/invite-links/invite-links.component.d.ts +28 -0
- package/lib/components/lib-exports.d.ts +27 -0
- package/lib/components/members-as-badges/contacts-as-badges.component.d.ts +18 -0
- package/lib/components/members-as-badges/index.d.ts +1 -0
- package/lib/components/members-by-role/family-members.component.d.ts +21 -0
- package/lib/components/members-by-role/index.d.ts +3 -0
- package/lib/components/members-by-role/member-group.d.ts +9 -0
- package/lib/components/members-by-role/members-by-role.component.d.ts +12 -0
- package/lib/components/members-card-header/members-card-header.component.d.ts +13 -0
- package/lib/components/members-list/index.d.ts +1 -0
- package/lib/components/members-list/members-list.component.d.ts +32 -0
- package/lib/components/members-short-list-card/members-short-list-card.component.d.ts +12 -0
- package/lib/components/shared-with/index.d.ts +1 -0
- package/lib/components/shared-with/shared-with.component.d.ts +6 -0
- package/lib/components/with-new-contact-input.d.ts +10 -0
- package/lib/constants.d.ts +13 -0
- package/lib/index.d.ts +2 -0
- package/lib/modals/contact-names-modal/contact-names-modal.component.d.ts +15 -0
- package/lib/modals/invite-modal/index.d.ts +1 -0
- package/lib/modals/invite-modal/invite-modal.component.d.ts +49 -0
- package/lib/pipes/contact-title.pipe.d.ts +10 -0
- package/lib/pipes/index.d.ts +3 -0
- package/lib/pipes/person-title.pipe.d.ts +9 -0
- package/lib/pipes/selected-contacts.pipe.d.ts +8 -0
- package/lib/providers/user-space-brief.provider.d.ts +12 -0
- package/lib/ui-types.d.ts +9 -0
- package/package.json +27 -0
- package/sneat-contactus-shared.d.ts +5 -0
- 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":"AAAA,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,KAAK,EACL,KAAK,EAEL,MAAM,EACN,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,cAAc,EACd,QAAQ,EACR,OAAO,EACP,MAAM,EACN,UAAU,EACV,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,QAAQ,EAER,2BAA2B,GAK5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAe,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oDAAoD,CAAC;;;AA4B/F,MAAM,OAAO,iBAAkB,SAAQ,kBAAkB;IAuB7C,eAAe,CAAC,MAAc;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAmBD;QACE,KAAK,EAAE,CAAC;QA5CM,WAAM,GAAG,KAAK,CAAC,QAAQ,iDAAiB,CAAC;QAEzC,YAAO,GAAG,KAAK,6DAA2B,CAAC;QACxC,UAAK,GAAG,MAAM,CAAgC,SAAS,iDAAC,CAAC;QAIzD,eAAU,GAAG,IAAI,YAAY,EAA2B,CAAC;QAElD,mBAAc,GAAG,IAAI,YAAY,EAExD,CAAC;QAEK,uBAAkB,GAAG,IAAI,CAAC;QAChB,oBAAe,GAAG,IAAI,YAAY,EAAwB,CAAC;QAE3D,cAAS,GAAG,QAAQ,CACrC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,QAAQ,qDACzD,CAAC;QAEiB,YAAO,GAAG,MAAM,CAAS,EAAE,mDAAC,CAAC;QAM/B,oBAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAE3C,iBAAY,GAAG,KAAK,CAAC,QAAQ,uDAE1C,CAAC;QAEe,uBAAkB,GAAG,QAAQ,CAE9C,GAAG,EAAE;YACL,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC,8DAAC,CAAC;QAMgB,2BAAsB,GAAG,0BAA0B,CAAC;QAEhE,YAAO,GAAsB,QAAQ,CAAC;QAEtC,WAAM,GAAmC,EAAE,CAAC;QAyB3C,oBAAe,GAAG,QAAQ,CAEhC,GAAG,EAAE;YACL,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;YAC3C,MAAM,cAAc,GAAgD;gBAClE,EAAE,EAAE,EAAE;aACP,CAAC;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrB,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;gBAChC,cAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC/B,MAAM,YAAY,GAAG,cAAc,CAAC,IAAmB,CAAC,CAAC;oBACzD,IAAI,YAAY,EAAE,CAAC;wBACjB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC7B,CAAC;yBAAM,CAAC;wBACN,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,cAAc,CAAC;QACxB,CAAC,2DAAC,CAAC;QAEM,UAAK,GAA2B;YACvC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YACpD,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE;YAClE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE;YAC1D,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,EAAE;YACxE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE;YAC7D,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE;SAC3E,CAAC;QAEQ,YAAO,GAAG,QAAQ,CAAU,GAAG,EAAE;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,CAAC;QAClD,CAAC,mDAAC,CAAC;QAQO,cAAS,GAAG,QAAQ,CAAC,GAAG,EAAE;YAClC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EACzB,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE/C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAE5B,OAAO,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,CAChE,QAAQ,CAAC,KAAK,CAAC,CAChB,CAAC;QACJ,CAAC,qDAAC,CAAC;QAEa,mBAAc,GAAG,CAC/B,KAAY,EACZ,OAA0B,EACpB,EAAE;YACR,IAAI,CAAC,OAAO,CAAC,GAAG,CACd,+CAA+C,OAAO,CAAC,EAAE,GAAG,CAC7D,CAAC;YACF,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,eAAe;iBACjB,0BAA0B,CAAC,KAAK,EAAE,WAAW,OAAO,CAAC,EAAE,EAAE,EAAE;gBAC1D,KAAK,EAAE,EAAE,OAAO,EAAE;aACnB,CAAC;iBACD,KAAK,CACJ,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,oCAAoC,CAAC,CACvE,CAAC;QACN,CAAC,CAAC;QAEiB,oBAAe,GAAG,IAAI,YAAY,EAAwB,CAAC;QAE3D,kBAAa,GAAG,KAAK,EAAE,KAAY,EAAiB,EAAE;YACvE,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;oBACxB,KAAK;oBACL,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,eAAe,CAAC,0BAA0B,CACnD,KAAK,EACL,aAAa,EACb,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CACvE,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC,CAAC;IArIF,CAAC;IAQM,QAAQ;QACb,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YAClE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,aAAa;oBAChB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CACrC,IAAI,CAAC,WAAW,CAAC,eAAe,CAC9B,wCAAwC,CACzC,CACF,CAAC;oBACF,MAAM;gBACR,KAAK,gBAAgB;oBACnB,IAAI,CAAC,cAAc,CAAC,IAAI,CACtB,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CACvC,CACF,CAAC;oBACF,MAAM;gBACR,KAAK,YAAY;oBACf,MAAM;YACV,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAuCM,cAAc,CAAC,IAAY;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,OAAO,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC;IACnC,CAAC;IA+DS,uBAAuB,CAAC,IAAuB;QACvD,IAAI,CAAC,cAAc,CAAC,IAAI,CACtB,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;YACf,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SACzD,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAES,OAAO,CAAC,KAA0B;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe;aACjB,0BAA0B,CAAC,KAAK,EAAE,SAAS,KAAK,CAAC,EAAE,EAAE,EAAE;YACtD,KAAK,EAAE;gBACL,KAAK,EAAE,KAAK;aACb;SACF,CAAC;aACD,KAAK,CACJ,IAAI,CAAC,WAAW,CAAC,eAAe,CAC9B,6CAA6C,CAC9C,CACF,CAAC;IACN,CAAC;IAES,aAAa,CAAC,KAAkB;QACxC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAES,QAAQ,CAAC,KAAY;QAC7B,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC/B,CAAC;8GAvNU,iBAAiB;kGAAjB,iBAAiB,ihCAJjB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,iDCvEpE,u5HAkHA,2CD5DI,WAAW,+VACX,uBAAuB,wQACvB,yBAAyB,4QACzB,mBAAmB,mHACnB,UAAU,uJACV,gBAAgB,qIAChB,OAAO,2JACP,QAAQ,6FACR,QAAQ,iFACR,OAAO,yLACP,OAAO,wEACP,MAAM,oDACN,MAAM,kTACN,OAAO,0NACP,OAAO,yFACP,cAAc,qEAIJ,CAAC,kBAAkB,CAAC;;2FAErB,iBAAiB;kBAzB7B,SAAS;+BACE,gBAAgB,WAEjB;wBACP,WAAW;wBACX,uBAAuB;wBACvB,yBAAyB;wBACzB,mBAAmB;wBACnB,UAAU;wBACV,gBAAgB;wBAChB,OAAO;wBACP,QAAQ;wBACR,QAAQ;wBACR,OAAO;wBACP,OAAO;wBACP,MAAM;wBACN,MAAM;wBACN,OAAO;wBACP,OAAO;wBACP,cAAc;qBACf,aACU,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,mBACjD,uBAAuB,CAAC,MAAM,cACnC,CAAC,kBAAkB,CAAC;;sBAQ/B,KAAK;;sBAEL,MAAM;;sBAEN,MAAM;;sBAIN,KAAK;;sBACL,MAAM;;sBAwHN,KAAK;;sBAmBL,MAAM","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 @@
|
|
|
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 @@
|
|
|
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 >@\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\">@</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 >@\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\">@</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 >@\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\">@</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 —\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 —\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 —\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"]}
|