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