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