@propbinder/mobile-design 0.2.74 → 0.2.75

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/index.d.ts CHANGED
@@ -1026,7 +1026,7 @@ declare class WhitelabelService {
1026
1026
  readonly logoUrl: _angular_core.Signal<string>;
1027
1027
  readonly logoMarkUrl: _angular_core.Signal<string>;
1028
1028
  readonly logoAlt: _angular_core.Signal<string>;
1029
- readonly logoSize: _angular_core.Signal<"md" | "sm" | "lg" | "xl">;
1029
+ readonly logoSize: _angular_core.Signal<"sm" | "md" | "lg" | "xl">;
1030
1030
  readonly logoHeight: _angular_core.Signal<number>;
1031
1031
  readonly appIconSurface: _angular_core.Signal<string>;
1032
1032
  readonly appIconContent: _angular_core.Signal<string>;
@@ -1279,7 +1279,7 @@ declare class DsMobileContentComponent {
1279
1279
  */
1280
1280
  declare class SectionHeaderComponent {
1281
1281
  /** Width of the header placeholder */
1282
- width: _angular_core.InputSignal<"half" | "third" | "full">;
1282
+ width: _angular_core.InputSignal<"full" | "half" | "third">;
1283
1283
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SectionHeaderComponent, never>;
1284
1284
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SectionHeaderComponent, "section-header", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1285
1285
  }
@@ -2777,7 +2777,7 @@ declare class DsMobileListItemComponent implements AfterViewInit {
2777
2777
  * - 'center' - Align to center
2778
2778
  * - 'bottom' - Align to bottom
2779
2779
  */
2780
- align: _angular_core.InputSignal<"top" | "center" | "bottom">;
2780
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
2781
2781
  /**
2782
2782
  * Remove top padding — use on the first item in a section when there is
2783
2783
  * no preceding content, to avoid unnecessary whitespace.
@@ -3065,7 +3065,7 @@ declare class DsMobileInteractiveListItemPostComponent {
3065
3065
  * - 'center' - Align to center
3066
3066
  * - 'bottom' - Align to bottom
3067
3067
  */
3068
- align: _angular_core.InputSignal<"top" | "center" | "bottom">;
3068
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
3069
3069
  /**
3070
3070
  * Whether the post card is clickable
3071
3071
  */
@@ -3293,7 +3293,7 @@ declare class DsMobileInteractiveListItemInquiryComponent {
3293
3293
  * - 'center' - Align to center
3294
3294
  * - 'bottom' - Align to bottom
3295
3295
  */
3296
- align: _angular_core.InputSignal<"top" | "center" | "bottom">;
3296
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
3297
3297
  /**
3298
3298
  * Whether the inquiry item is clickable
3299
3299
  */
@@ -3963,6 +3963,7 @@ interface ChatParticipant {
3963
3963
  avatarInitials?: string;
3964
3964
  avatarType?: 'initials' | 'photo' | 'icon';
3965
3965
  avatarSrc?: string;
3966
+ avatarShape?: 'circle' | 'squircle';
3966
3967
  badge?: string;
3967
3968
  verified?: boolean;
3968
3969
  lastActive?: string;
@@ -4538,7 +4539,7 @@ declare class DsMobileInteractiveListItemMessageComponent {
4538
4539
  * - 'center' - Align to center
4539
4540
  * - 'bottom' - Align to bottom
4540
4541
  */
4541
- align: _angular_core.InputSignal<"top" | "center" | "bottom">;
4542
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
4542
4543
  /**
4543
4544
  * Whitelabel logomark on the avatar corner (e.g. org branding for staff).
4544
4545
  * Default true — preserves backward compatibility with inquiry assignee rows.
@@ -4600,7 +4601,7 @@ declare class DsMobileContactListItemComponent {
4600
4601
  /** Show a trailing trash-bin icon; emits {@link deleteClick} on tap. */
4601
4602
  showDeleteAction: _angular_core.InputSignal<boolean>;
4602
4603
  variant: _angular_core.InputSignal<"compact" | undefined>;
4603
- align: _angular_core.InputSignal<"top" | "center" | "bottom">;
4604
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
4604
4605
  contactClick: _angular_core.OutputEmitterRef<void>;
4605
4606
  selectionToggle: _angular_core.OutputEmitterRef<void>;
4606
4607
  moreClick: _angular_core.OutputEmitterRef<void>;
@@ -4692,6 +4693,76 @@ declare class DsMobileGroupMembersModalComponent implements OnInit {
4692
4693
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileGroupMembersModalComponent, "ds-mobile-group-members-modal", never, { "getMembersSnapshot": { "alias": "getMembersSnapshot"; "required": true; }; "isAdmin": { "alias": "isAdmin"; "required": false; }; "currentUserId": { "alias": "currentUserId"; "required": false; }; "onRemoveMember": { "alias": "onRemoveMember"; "required": false; }; "onMessageMember": { "alias": "onMessageMember"; "required": false; }; "openAddMembersPicker": { "alias": "openAddMembersPicker"; "required": false; }; }, {}, never, never, true, never>;
4693
4694
  }
4694
4695
 
4696
+ interface CommunityAdminRow {
4697
+ id: string;
4698
+ name: string;
4699
+ unit?: string;
4700
+ avatarInitials?: string;
4701
+ avatarType?: 'initials' | 'photo' | 'icon';
4702
+ avatarSrc?: string;
4703
+ }
4704
+
4705
+ interface CommunityAdminLabels {
4706
+ pageTitle: string;
4707
+ closeButton: string;
4708
+ addButtonAriaLabel: string;
4709
+ emptyState: string;
4710
+ emptyStateDescription: string;
4711
+ removeConfirmTitle: string;
4712
+ removeConfirmMessage: (name: string) => string;
4713
+ removeConfirmButton: string;
4714
+ cancelButton: string;
4715
+ addPickerTitle: string;
4716
+ addPickerSearchPlaceholder: string;
4717
+ addPickerSearchAriaLabel: string;
4718
+ addPickerEmpty: string;
4719
+ onboardingTitle: string;
4720
+ onboardingMessage: string;
4721
+ onboardingButton: string;
4722
+ }
4723
+ /**
4724
+ * Full-screen modal for managing community administrators.
4725
+ *
4726
+ * The main view lists current admins with a "more" menu to remove them.
4727
+ * Tapping the "+" header button opens a stacked picker modal to add new admins
4728
+ * from the available tenants list.
4729
+ */
4730
+ declare class DsMobileCommunityAdminsModalComponent implements OnInit {
4731
+ private modalCtrl;
4732
+ private bottomSheet;
4733
+ getAdminsSnapshot: () => CommunityAdminRow[];
4734
+ availableTenants: CommunityAdminRow[];
4735
+ currentUserId: string;
4736
+ onAddAdmin?: (tenantId: string) => void | Promise<void>;
4737
+ onRemoveAdmin?: (adminId: string) => void | Promise<void>;
4738
+ labels?: Partial<CommunityAdminLabels>;
4739
+ lbl: CommunityAdminLabels;
4740
+ localAdmins: CommunityAdminRow[];
4741
+ get showAddButton(): boolean;
4742
+ ngOnInit(): void;
4743
+ syncAdmins(): void;
4744
+ confirmRemoveAdmin(admin: CommunityAdminRow): Promise<void>;
4745
+ openAddAdminPicker(): Promise<void>;
4746
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCommunityAdminsModalComponent, never>;
4747
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCommunityAdminsModalComponent, "ds-mobile-community-admins-modal", never, { "getAdminsSnapshot": { "alias": "getAdminsSnapshot"; "required": true; }; "availableTenants": { "alias": "availableTenants"; "required": false; }; "currentUserId": { "alias": "currentUserId"; "required": false; }; "onAddAdmin": { "alias": "onAddAdmin"; "required": false; }; "onRemoveAdmin": { "alias": "onRemoveAdmin"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; }, {}, never, never, true, never>;
4748
+ }
4749
+ /**
4750
+ * Internal stacked picker for selecting a single tenant to promote to admin.
4751
+ */
4752
+ declare class DsMobileCommunityAdminPickerComponent implements OnInit {
4753
+ private modalCtrl;
4754
+ tenants: CommunityAdminRow[];
4755
+ labels?: CommunityAdminLabels;
4756
+ lbl: CommunityAdminLabels;
4757
+ searchQuery: _angular_core.WritableSignal<string>;
4758
+ private tenantsSig;
4759
+ ngOnInit(): void;
4760
+ filteredTenants: _angular_core.Signal<CommunityAdminRow[]>;
4761
+ selectTenant(tenant: CommunityAdminRow): void;
4762
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCommunityAdminPickerComponent, never>;
4763
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCommunityAdminPickerComponent, "ds-mobile-community-admin-picker", never, { "tenants": { "alias": "tenants"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; }, {}, never, never, true, never>;
4764
+ }
4765
+
4695
4766
  /**
4696
4767
  * Group thread avatar: optional custom image, or member faces.
4697
4768
  *
@@ -4704,7 +4775,7 @@ declare class DsMobileGroupAvatarStackComponent {
4704
4775
  /** Full member list; {@link currentUserId} is removed for display when set. */
4705
4776
  members: _angular_core.InputSignal<ChatParticipant[]>;
4706
4777
  customAvatarUrl: _angular_core.InputSignal<string>;
4707
- size: _angular_core.InputSignal<"md" | "sm" | "lg" | "xl">;
4778
+ size: _angular_core.InputSignal<"sm" | "md" | "lg" | "xl">;
4708
4779
  /** Row avatar (32×32, diagonal **xs** faces) vs header / hero stack. */
4709
4780
  layout: _angular_core.InputSignal<"stack" | "list">;
4710
4781
  /** When set, this participant is omitted from the stack (e.g. current user id). */
@@ -4837,6 +4908,14 @@ declare class DsMobileTenantPickerModalComponent {
4837
4908
  private modalCtrl;
4838
4909
  private peerMessaging;
4839
4910
  private peerChat;
4911
+ /**
4912
+ * When true the modal acts as a simple single-select picker:
4913
+ * tapping a tenant dismisses with `{ tenantId }` (role `'selected'`).
4914
+ * The "more" menu and group-selection footer are hidden.
4915
+ */
4916
+ pickMode: boolean;
4917
+ /** Optional set of tenant IDs to exclude from the list (e.g. already-selected admins). */
4918
+ excludeIds?: Set<string>;
4840
4919
  searchQuery: _angular_core.WritableSignal<string>;
4841
4920
  selectionMode: _angular_core.WritableSignal<boolean>;
4842
4921
  selectedIds: _angular_core.WritableSignal<Set<string>>;
@@ -4847,7 +4926,7 @@ declare class DsMobileTenantPickerModalComponent {
4847
4926
  openTenantActions(tenant: PeerTenantContact): Promise<void>;
4848
4927
  promptCreateGroup(): Promise<void>;
4849
4928
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileTenantPickerModalComponent, never>;
4850
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileTenantPickerModalComponent, "ds-mobile-tenant-picker-modal", never, {}, {}, never, never, true, never>;
4929
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileTenantPickerModalComponent, "ds-mobile-tenant-picker-modal", never, { "pickMode": { "alias": "pickMode"; "required": false; }; "excludeIds": { "alias": "excludeIds"; "required": false; }; }, {}, never, never, true, never>;
4851
4930
  }
4852
4931
 
4853
4932
  interface CreateGroupMember {
@@ -4868,7 +4947,7 @@ declare class DsMobileCreateGroupModalComponent implements OnInit {
4868
4947
  members: CreateGroupMember[];
4869
4948
  defaultName: string;
4870
4949
  allTenants: CreateGroupMember[];
4871
- view: _angular_core.WritableSignal<"main" | "add-members">;
4950
+ view: _angular_core.WritableSignal<"add-members" | "main">;
4872
4951
  groupName: _angular_core.WritableSignal<string>;
4873
4952
  customAvatarUrl: _angular_core.WritableSignal<string>;
4874
4953
  localMembers: _angular_core.WritableSignal<CreateGroupMember[]>;
@@ -5009,7 +5088,7 @@ declare class DsMobileInteractiveListItemBookingComponent {
5009
5088
  * - 'center' - Align to center
5010
5089
  * - 'bottom' - Align to bottom
5011
5090
  */
5012
- align: _angular_core.InputSignal<"top" | "center" | "bottom">;
5091
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
5013
5092
  /**
5014
5093
  * Whether the booking item is clickable
5015
5094
  */
@@ -5941,7 +6020,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
5941
6020
  * - 'overlay': keyboard/footer overlays lower content (no auto scroll push)
5942
6021
  * @default 'follow'
5943
6022
  */
5944
- keyboardContentBehavior: _angular_core.InputSignal<"follow" | "overlay">;
6023
+ keyboardContentBehavior: _angular_core.InputSignal<"overlay" | "follow">;
5945
6024
  /**
5946
6025
  * Optional interceptor called instead of the default dismiss when the close button is tapped.
5947
6026
  * Return a function to take over close behavior (e.g. navigate back within the modal).
@@ -6786,6 +6865,10 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
6786
6865
  * Label for the submit button
6787
6866
  */
6788
6867
  submitButtonLabel: string;
6868
+ /**
6869
+ * Pre-set category included in the emitted NewInquiryData (e.g. vendor id)
6870
+ */
6871
+ category?: string;
6789
6872
  /**
6790
6873
  * Form title field
6791
6874
  */
@@ -6871,7 +6954,7 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
6871
6954
  private isFormDirty;
6872
6955
  private showUnsavedChangesSheet;
6873
6956
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileNewInquiryModalComponent, never>;
6874
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileNewInquiryModalComponent, "ds-mobile-new-inquiry-modal", never, { "loading": { "alias": "loading"; "required": false; }; "error": { "alias": "error"; "required": false; }; "onSubmit": { "alias": "onSubmit"; "required": false; }; "titlePlaceholder": { "alias": "titlePlaceholder"; "required": false; }; "descriptionPlaceholder": { "alias": "descriptionPlaceholder"; "required": false; }; "submitButtonLabel": { "alias": "submitButtonLabel"; "required": false; }; }, {}, never, never, true, never>;
6957
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileNewInquiryModalComponent, "ds-mobile-new-inquiry-modal", never, { "loading": { "alias": "loading"; "required": false; }; "error": { "alias": "error"; "required": false; }; "onSubmit": { "alias": "onSubmit"; "required": false; }; "titlePlaceholder": { "alias": "titlePlaceholder"; "required": false; }; "descriptionPlaceholder": { "alias": "descriptionPlaceholder"; "required": false; }; "submitButtonLabel": { "alias": "submitButtonLabel"; "required": false; }; "category": { "alias": "category"; "required": false; }; }, {}, never, never, true, never>;
6875
6958
  }
6876
6959
 
6877
6960
  /**
@@ -6890,6 +6973,8 @@ interface NewInquiryModalOptions {
6890
6973
  descriptionPlaceholder?: string;
6891
6974
  /** Custom label for submit button */
6892
6975
  submitButtonLabel?: string;
6976
+ /** Pre-set category included in the emitted NewInquiryData (e.g. vendor id) */
6977
+ category?: string;
6893
6978
  }
6894
6979
  /**
6895
6980
  * DsMobileNewInquiryModalService
@@ -8189,7 +8274,7 @@ declare class DsMobileHandbookFolderMiniComponent {
8189
8274
  * ```
8190
8275
  */
8191
8276
  declare class DsTextInputComponent implements ControlValueAccessor {
8192
- type: _angular_core.InputSignal<"search" | "text" | "email" | "tel" | "password" | "url">;
8277
+ type: _angular_core.InputSignal<"search" | "text" | "email" | "password" | "tel" | "url">;
8193
8278
  label: _angular_core.InputSignal<string>;
8194
8279
  placeholder: _angular_core.InputSignal<string>;
8195
8280
  disabled: _angular_core.InputSignal<boolean>;
@@ -8198,7 +8283,7 @@ declare class DsTextInputComponent implements ControlValueAccessor {
8198
8283
  hasError: _angular_core.InputSignal<boolean>;
8199
8284
  errorMessage: _angular_core.InputSignal<string>;
8200
8285
  autocomplete: _angular_core.InputSignal<string>;
8201
- inputmode: _angular_core.InputSignal<"search" | "text" | "email" | "tel" | "url" | "numeric" | undefined>;
8286
+ inputmode: _angular_core.InputSignal<"search" | "text" | "numeric" | "email" | "tel" | "url" | undefined>;
8202
8287
  autoClearError: _angular_core.InputSignal<boolean>;
8203
8288
  validator: _angular_core.InputSignal<((value: string) => boolean) | null>;
8204
8289
  valueChange: _angular_core.OutputEmitterRef<string>;
@@ -8271,7 +8356,7 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
8271
8356
  * Note: FAB is always 56px circular, but this affects the icon size
8272
8357
  * @default 'md'
8273
8358
  */
8274
- size: _angular_core.InputSignal<"md" | "sm" | "lg">;
8359
+ size: _angular_core.InputSignal<"sm" | "md" | "lg">;
8275
8360
  /**
8276
8361
  * ARIA label for accessibility
8277
8362
  * @required - Always provide a descriptive label
@@ -8506,7 +8591,7 @@ declare class DsMobileIllustrationComponent {
8506
8591
  * Predefined illustration variant
8507
8592
  * Available variants: 'post', 'inquiry', 'confirmation', 'family'
8508
8593
  */
8509
- variant: _angular_core.InputSignal<"post" | "inquiry" | "confirmation" | "family" | "cancel-booking" | "delete-warning">;
8594
+ variant: _angular_core.InputSignal<"inquiry" | "delete-warning" | "post" | "confirmation" | "family" | "cancel-booking">;
8510
8595
  /**
8511
8596
  * Illustration size (width and height)
8512
8597
  * @default '120px'
@@ -8722,6 +8807,24 @@ declare class MobileHandbookPageComponent {
8722
8807
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHandbookPageComponent, "app-mobile-handbook-page", never, {}, {}, never, never, true, never>;
8723
8808
  }
8724
8809
 
8810
+ interface ServiceVendor {
8811
+ id: string;
8812
+ name: string;
8813
+ category: string;
8814
+ description?: string;
8815
+ phone?: string;
8816
+ logo?: string;
8817
+ thumbnail?: string;
8818
+ heroImage?: string;
8819
+ fullDescription?: string;
8820
+ price?: string;
8821
+ availabilityStatus?: 'available-today' | 'available-from' | 'unavailable';
8822
+ statusLabel?: string;
8823
+ requirements?: string[];
8824
+ restrictions?: string[];
8825
+ expectations?: string;
8826
+ }
8827
+
8725
8828
  type LoadingPhase = 'loading' | 'exiting' | 'idle';
8726
8829
  /**
8727
8830
  * PageLoadingService
@@ -8838,16 +8941,14 @@ declare class MobileHomePageComponent implements OnInit {
8838
8941
  readonly isPeerGroupConversation: typeof isPeerGroupConversation;
8839
8942
  protected pageLoading: PageLoadingService;
8840
8943
  recentPosts: _angular_core.Signal<_propbinder_mobile_design.Post[]>;
8841
- private allInquiries;
8842
- openInquiries: _angular_core.Signal<{
8843
- id: string;
8844
- title: string;
8845
- description: string;
8846
- status: "open";
8847
- timestamp: string;
8848
- }[]>;
8944
+ private inquiriesService;
8945
+ openInquiries: _angular_core.Signal<_propbinder_mobile_design.Inquiry[]>;
8849
8946
  recentPeerMessages: _angular_core.Signal<PeerConversation[]>;
8947
+ private allVendors;
8948
+ previewVendors: _angular_core.Signal<ServiceVendor[]>;
8850
8949
  private modalCtrl;
8950
+ private vendorModal;
8951
+ private newInquiryModal;
8851
8952
  constructor(router: Router, navCtrl: NavController, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService, trackingPermissionService: TrackingPermissionService, bottomSheet: DsMobileBottomSheetService, familyAccessService: FamilyAccessService, peerMessaging: PeerMessagingService, peerChat: PeerChatLauncherService);
8852
8953
  ngOnInit(): void;
8853
8954
  private simulateLoad;
@@ -8858,6 +8959,9 @@ declare class MobileHomePageComponent implements OnInit {
8858
8959
  navigateToInquiries(): void;
8859
8960
  navigateToTenants(): void;
8860
8961
  private openTenantPicker;
8962
+ navigateToServices(): void;
8963
+ openVendorSheet(vendor: ServiceVendor): Promise<void>;
8964
+ private openInquiryForVendor;
8861
8965
  navigateToMessages(): void;
8862
8966
  openPeerMessagePreview(conv: PeerConversation): Promise<void>;
8863
8967
  handlePostLongPress(postId: string): Promise<void>;
@@ -8871,20 +8975,29 @@ interface Inquiry {
8871
8975
  description: string;
8872
8976
  status: 'open' | 'closed';
8873
8977
  timestamp: string;
8874
- category: 'maintenance' | 'plumbing' | 'electrical' | 'heating' | 'security' | 'appliance' | 'other';
8978
+ category: string;
8979
+ vendorName?: string;
8980
+ vendorLogo?: string;
8875
8981
  }
8982
+ declare class InquiriesService {
8983
+ readonly inquiries: _angular_core.WritableSignal<Inquiry[]>;
8984
+ readonly openInquiries: _angular_core.Signal<Inquiry[]>;
8985
+ getById(id: string): Inquiry | undefined;
8986
+ addInquiry(inquiry: Inquiry): void;
8987
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InquiriesService, never>;
8988
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<InquiriesService>;
8989
+ }
8990
+
8876
8991
  declare class MobileInquiriesPageComponent {
8877
8992
  userService: UserService;
8878
8993
  private navCtrl;
8879
8994
  private newInquiryModal;
8880
8995
  pageComponent: DsMobilePageMainComponent;
8996
+ private inquiriesService;
8881
8997
  constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
8882
8998
  filterStatus: _angular_core.WritableSignal<"open" | "closed" | "all">;
8883
8999
  tabItems: InlineTabItem[];
8884
- inquiries: _angular_core.WritableSignal<Inquiry[]>;
8885
9000
  filteredInquiries: _angular_core.Signal<Inquiry[]>;
8886
- openInquiries: _angular_core.Signal<Inquiry[]>;
8887
- closedInquiries: _angular_core.Signal<Inquiry[]>;
8888
9001
  setFilter(status: 'all' | 'open' | 'closed'): void;
8889
9002
  getInquiryIcon(category: string): string;
8890
9003
  openInquiryDetail(inquiryId: string): void;
@@ -8905,30 +9018,37 @@ interface MessageThread {
8905
9018
  timestamp: string;
8906
9019
  unread: boolean;
8907
9020
  }
8908
- declare class MobileInquiryDetailPageComponent {
9021
+ declare class MobileInquiryDetailPageComponent implements OnInit {
8909
9022
  userService: UserService;
8910
9023
  private lightbox;
8911
9024
  private chatModal;
9025
+ private route;
9026
+ private inquiriesService;
8912
9027
  inquiryTitle: string;
9028
+ inquiryDescription: string;
9029
+ inquiryCategory: string;
9030
+ inquiryTimestamp: string;
9031
+ vendorName: string;
9032
+ vendorInitials: string;
9033
+ vendorLogo: string;
9034
+ isServiceInquiry: boolean;
8913
9035
  activeTab: _angular_core.WritableSignal<string>;
8914
9036
  tabItems: InlineTabItem[];
9037
+ serviceMessageThread: MessageThread[];
9038
+ get activeMessages(): MessageThread[];
8915
9039
  messageThreads: MessageThread[];
8916
- unreadMessagesCount: _angular_core.Signal<number>;
9040
+ private updateMessagesBadge;
8917
9041
  photos: LightboxImage[];
8918
9042
  get photoUrls(): string[];
8919
9043
  constructor(userService: UserService, lightbox: DsMobileLightboxService, chatModal: DsMobileChatModalService);
9044
+ ngOnInit(): void;
8920
9045
  setActiveTab(tabId: string): void;
8921
9046
  goBack(): void;
8922
9047
  handleRefresh(event: any): void;
8923
- /**
8924
- * Check if there are unread messages
8925
- */
8926
9048
  hasUnreadMessages(): boolean;
8927
- /**
8928
- * Navigate to messages tab when banner is clicked
8929
- */
8930
9049
  navigateToMessagesTab(): void;
8931
9050
  openMessage(messageId: string): Promise<void>;
9051
+ openVendorChat(): Promise<void>;
8932
9052
  openPhotoLightbox(index: number): Promise<void>;
8933
9053
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileInquiryDetailPageComponent, never>;
8934
9054
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileInquiryDetailPageComponent, "app-mobile-inquiry-detail-page", never, {}, {}, never, never, true, never>;
@@ -9347,6 +9467,53 @@ declare class TenantChatPageComponent {
9347
9467
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TenantChatPageComponent, "app-tenant-chat-page", never, {}, {}, never, never, true, never>;
9348
9468
  }
9349
9469
 
9470
+ interface ServicePageLabels {
9471
+ pageTitle: string;
9472
+ emptyState: string;
9473
+ emptyStateDescription: string;
9474
+ }
9475
+ declare const DEFAULT_SERVICE_PAGE_LABELS: ServicePageLabels;
9476
+ declare function stripHtml(html: string): string;
9477
+ declare class ServicesPageComponent {
9478
+ pageComponent: DsMobilePageMainComponent;
9479
+ private vendorModal;
9480
+ private newInquiryModal;
9481
+ private inquiriesService;
9482
+ private navCtrl;
9483
+ userService: UserService;
9484
+ lbl: ServicePageLabels;
9485
+ vendors: _angular_core.WritableSignal<ServiceVendor[]>;
9486
+ stripHtml: typeof stripHtml;
9487
+ openVendorSheet(vendor: ServiceVendor): Promise<void>;
9488
+ private openInquiryForVendor;
9489
+ handleRefresh(event: CustomEvent): void;
9490
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ServicesPageComponent, never>;
9491
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ServicesPageComponent, "app-services-page", never, {}, {}, never, never, true, never>;
9492
+ }
9493
+
9494
+ declare class DsMobileServiceVendorSheetComponent {
9495
+ vendorName: string;
9496
+ vendorDescription: string;
9497
+ vendorImage: string;
9498
+ vendorLogo: string;
9499
+ bookButtonLabel: string;
9500
+ private modalController;
9501
+ handleBook(): Promise<void>;
9502
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileServiceVendorSheetComponent, never>;
9503
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileServiceVendorSheetComponent, "ds-mobile-service-vendor-sheet", never, { "vendorName": { "alias": "vendorName"; "required": true; }; "vendorDescription": { "alias": "vendorDescription"; "required": false; }; "vendorImage": { "alias": "vendorImage"; "required": false; }; "vendorLogo": { "alias": "vendorLogo"; "required": false; }; "bookButtonLabel": { "alias": "bookButtonLabel"; "required": false; }; }, {}, never, never, true, never>;
9504
+ }
9505
+ declare class DsMobileServiceVendorModalService extends BaseModalService {
9506
+ constructor(modalController: ModalController);
9507
+ open(props: {
9508
+ vendorName: string;
9509
+ vendorDescription?: string;
9510
+ vendorImage?: string;
9511
+ vendorLogo?: string;
9512
+ }): Promise<HTMLIonModalElement>;
9513
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileServiceVendorModalService, never>;
9514
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DsMobileServiceVendorModalService>;
9515
+ }
9516
+
9350
9517
  /**
9351
9518
  * Custom page transition - iOS-style push/pop with dark overlay
9352
9519
  *
@@ -9404,5 +9571,5 @@ declare class MediaPickerService {
9404
9571
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MediaPickerService>;
9405
9572
  }
9406
9573
 
9407
- export { AcceptInvitePageComponent, ActionCommentComponent, ActionLikeComponent, AvatarUploadPageComponent, BaseModalService, ContentRowComponent, CreateAccountPageComponent, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAddGroupTenantsModalComponent, DsMobileAppLoadingComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingConfirmationWrapperComponent, DsMobileBookingModalComponent, DsMobileBookingModalService, DsMobileBookingSummaryComponent, DsMobileBottomSheetHeaderComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCapacitySheetComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileConfirmationSheetComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileCreateGroupModalComponent, DsMobileDropdownComponent, DsMobileEditGroupModalComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFacilityArchiveConfirmationComponent, DsMobileFacilityCreationConfirmationWrapperComponent, DsMobileFacilityCreationModalComponent, DsMobileFacilityCreationModalService, DsMobileFacilityDeleteConfirmationComponent, DsMobileFacilityDetailModalComponent, DsMobileFacilityDetailModalService, DsMobileFileAttachmentComponent, DsMobileGroupAvatarStackComponent, DsMobileGroupMembersModalComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileIllustrationComponent, DsMobileImagePlaceholderComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemBookingComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileListSearchComponent, DsMobileLoaderOverlayComponent, DsMobileLongPressDirective, DsMobileMediaActionsPanelComponent, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobileOfflineBannerComponent, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobilePillComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobilePriceSheetComponent, DsMobileProfileActionsSheetComponent, DsMobilePromptBottomSheetComponent, DsMobilePropertyBannerComponent, DsMobileRichTextEditorComponent, DsMobileSectionComponent, DsMobileSwiperComponent, DsMobileSwiperWithNavComponent, DsMobileSystemMessageBannerComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsMobileTenantPickerModalComponent, DsMobileWhenCanBookSheetComponent, DsMobileWhoCanBookSheetComponent, DsTextInputComponent, FamilyAccessPageComponent, FamilyAccessService, InviteSuccessPageComponent, MediaPickerService, MobileBookingPageComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PageLoadingService, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, SectionHeaderComponent, SignInPageComponent, SignInToAcceptPageComponent, TenantChatPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition };
9408
- export type { ActionGroup, ActionItem, ActionResult, AddGroupTenantPickerRow, AppIconSize, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BookingModalExtras, BookingResult, BottomSheetOptions, ChatAttachment, ChatGroupPanelLabels, ChatMessage, ChatModalData, ChatModalGroupData, ChatModalLabels, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, ContactItem, ContactType, ContentWidth, CreateGroupMember, CreateGroupResult, DateOption, DropdownAlign, DropdownPosition, DsMobileDropdownItem, EditGroupMember, EditGroupResult, FacilityCreationModalOptions, FacilityDetailData, FacilityDetailDisplayData, FacilityDetailEditContext, FamilyInvite, FamilyMember, FamilyMemberStatus, GroupMemberRow, HandbookDetailData, HandbookItem, InlineTabItem, InquiryPhoto, Language, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, LoadingPhase, LogoSize, LogoVariant, MediaPickerResult, ModalOptions, MoreMenuItem, NetworkStatus, NewFacilityData, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, PromptBottomSheetResult, PromptGroupPreviewMember, TabConfig, TimeSlot, WhitelabelConfig };
9574
+ export { AcceptInvitePageComponent, ActionCommentComponent, ActionLikeComponent, AvatarUploadPageComponent, BaseModalService, ContentRowComponent, CreateAccountPageComponent, DEFAULT_SERVICE_PAGE_LABELS, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAddGroupTenantsModalComponent, DsMobileAppLoadingComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingConfirmationWrapperComponent, DsMobileBookingModalComponent, DsMobileBookingModalService, DsMobileBookingSummaryComponent, DsMobileBottomSheetHeaderComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCapacitySheetComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileCommunityAdminPickerComponent, DsMobileCommunityAdminsModalComponent, DsMobileConfirmationSheetComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileCreateGroupModalComponent, DsMobileDropdownComponent, DsMobileEditGroupModalComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFacilityArchiveConfirmationComponent, DsMobileFacilityCreationConfirmationWrapperComponent, DsMobileFacilityCreationModalComponent, DsMobileFacilityCreationModalService, DsMobileFacilityDeleteConfirmationComponent, DsMobileFacilityDetailModalComponent, DsMobileFacilityDetailModalService, DsMobileFileAttachmentComponent, DsMobileGroupAvatarStackComponent, DsMobileGroupMembersModalComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileIllustrationComponent, DsMobileImagePlaceholderComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemBookingComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileListSearchComponent, DsMobileLoaderOverlayComponent, DsMobileLongPressDirective, DsMobileMediaActionsPanelComponent, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobileOfflineBannerComponent, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobilePillComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobilePriceSheetComponent, DsMobileProfileActionsSheetComponent, DsMobilePromptBottomSheetComponent, DsMobilePropertyBannerComponent, DsMobileRichTextEditorComponent, DsMobileSectionComponent, DsMobileServiceVendorModalService, DsMobileServiceVendorSheetComponent, DsMobileSwiperComponent, DsMobileSwiperWithNavComponent, DsMobileSystemMessageBannerComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsMobileTenantPickerModalComponent, DsMobileWhenCanBookSheetComponent, DsMobileWhoCanBookSheetComponent, DsTextInputComponent, FamilyAccessPageComponent, FamilyAccessService, InquiriesService, InviteSuccessPageComponent, MediaPickerService, MobileBookingPageComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PageLoadingService, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, SectionHeaderComponent, ServicesPageComponent, SignInPageComponent, SignInToAcceptPageComponent, TenantChatPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition };
9575
+ export type { ActionGroup, ActionItem, ActionResult, AddGroupTenantPickerRow, AppIconSize, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BookingModalExtras, BookingResult, BottomSheetOptions, ChatAttachment, ChatGroupPanelLabels, ChatMessage, ChatModalData, ChatModalGroupData, ChatModalLabels, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, CommunityAdminRow, ContactItem, ContactType, ContentWidth, CreateGroupMember, CreateGroupResult, DateOption, DropdownAlign, DropdownPosition, DsMobileDropdownItem, EditGroupMember, EditGroupResult, FacilityCreationModalOptions, FacilityDetailData, FacilityDetailDisplayData, FacilityDetailEditContext, FamilyInvite, FamilyMember, FamilyMemberStatus, GroupMemberRow, HandbookDetailData, HandbookItem, InlineTabItem, Inquiry, InquiryPhoto, Language, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, LoadingPhase, LogoSize, LogoVariant, MediaPickerResult, ModalOptions, MoreMenuItem, NetworkStatus, NewFacilityData, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, PromptBottomSheetResult, PromptGroupPreviewMember, ServicePageLabels, ServiceVendor, TabConfig, TimeSlot, WhitelabelConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@propbinder/mobile-design",
3
- "version": "0.2.74",
3
+ "version": "0.2.75",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0 || ^21.0.0",
6
6
  "@angular/core": "^20.3.0 || ^21.0.0"
package/styles/ionic.css CHANGED
@@ -986,4 +986,4 @@ ds-button .btn:active:not(:disabled) {
986
986
  /* FORCE hover background color directly - only for primary variant */
987
987
  ds-button[variant="primary"]:hover .btn {
988
988
  background-color: var(--color-accent-hover) !important;
989
- }
989
+ }