@propbinder/mobile-design 0.2.74 → 0.2.79

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 {
@@ -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
  */
@@ -5636,6 +5715,34 @@ declare class DsMobileLoaderOverlayComponent {
5636
5715
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileLoaderOverlayComponent, "ds-mobile-loader-overlay", never, { "spinnerSize": { "alias": "spinnerSize"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5637
5716
  }
5638
5717
 
5718
+ /**
5719
+ * DsMobileGlassSpinnerComponent
5720
+ *
5721
+ * Reusable loader overlay with a glassmorphism (blurred) background and a spinner.
5722
+ * This is useful when you want to show a loading state without covering the entire screen
5723
+ * with a solid background, but rather blurring the content behind it.
5724
+ *
5725
+ * Features:
5726
+ * - Glassmorphism blurred background
5727
+ * - Centered animated spinner
5728
+ * - Customizable spinner size
5729
+ * - Absolute positioning to cover parent
5730
+ */
5731
+ declare class DsMobileGlassSpinnerComponent {
5732
+ /**
5733
+ * Size of the spinner in pixels
5734
+ * @default 24
5735
+ */
5736
+ spinnerSize: _angular_core.InputSignal<number>;
5737
+ /**
5738
+ * Border radius of the overlay in pixels (should match parent's border radius)
5739
+ * @default 0
5740
+ */
5741
+ borderRadius: _angular_core.InputSignal<number>;
5742
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileGlassSpinnerComponent, never>;
5743
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileGlassSpinnerComponent, "ds-mobile-glass-spinner", never, { "spinnerSize": { "alias": "spinnerSize"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5744
+ }
5745
+
5639
5746
  /**
5640
5747
  * DsMobileAppLoadingComponent — dev app mirror.
5641
5748
  * See projects/mobile-design-lib/src/components/app-loading for the authoritative source.
@@ -6501,7 +6608,7 @@ declare class DsMobileCardInlineComponent {
6501
6608
  * - 'default' - Column layout with standard padding (gap: 12px, padding: 10px 12px)
6502
6609
  * - 'compact' - Row layout with reduced padding (gap: 8px, padding: 10px)
6503
6610
  */
6504
- variant: _angular_core.InputSignal<"compact" | "default">;
6611
+ variant: _angular_core.InputSignal<"default" | "compact">;
6505
6612
  /**
6506
6613
  * Whether the card is disabled
6507
6614
  * Disables all interactions and reduces opacity
@@ -6564,7 +6671,7 @@ declare class DsMobileCardInlineBannerComponent {
6564
6671
  * - 'default' - Standard padding and column layout
6565
6672
  * - 'compact' - Reduced padding and row layout
6566
6673
  */
6567
- layout: _angular_core.InputSignal<"compact" | "default">;
6674
+ layout: _angular_core.InputSignal<"default" | "compact">;
6568
6675
  /**
6569
6676
  * Emits when the banner is clicked
6570
6677
  */
@@ -6619,7 +6726,7 @@ declare class DsMobileCardInlineContactComponent {
6619
6726
  * - 'default' - Standard padding and column layout
6620
6727
  * - 'compact' - Reduced padding and row layout
6621
6728
  */
6622
- layout: _angular_core.InputSignal<"compact" | "default">;
6729
+ layout: _angular_core.InputSignal<"default" | "compact">;
6623
6730
  /**
6624
6731
  * Whether the contact item is clickable
6625
6732
  */
@@ -6684,7 +6791,7 @@ declare class DsMobileCardInlineFileComponent {
6684
6791
  * - 'default' - Standard padding and column layout
6685
6792
  * - 'compact' - Reduced padding and row layout
6686
6793
  */
6687
- layout: _angular_core.InputSignal<"compact" | "default">;
6794
+ layout: _angular_core.InputSignal<"default" | "compact">;
6688
6795
  /**
6689
6796
  * Optional URL to open when clicked
6690
6797
  * If provided, clicking the card will open this URL in a new tab
@@ -6786,6 +6893,10 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
6786
6893
  * Label for the submit button
6787
6894
  */
6788
6895
  submitButtonLabel: string;
6896
+ /**
6897
+ * Pre-set category included in the emitted NewInquiryData (e.g. vendor id)
6898
+ */
6899
+ category?: string;
6789
6900
  /**
6790
6901
  * Form title field
6791
6902
  */
@@ -6871,7 +6982,7 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
6871
6982
  private isFormDirty;
6872
6983
  private showUnsavedChangesSheet;
6873
6984
  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>;
6985
+ 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
6986
  }
6876
6987
 
6877
6988
  /**
@@ -6890,6 +7001,8 @@ interface NewInquiryModalOptions {
6890
7001
  descriptionPlaceholder?: string;
6891
7002
  /** Custom label for submit button */
6892
7003
  submitButtonLabel?: string;
7004
+ /** Pre-set category included in the emitted NewInquiryData (e.g. vendor id) */
7005
+ category?: string;
6893
7006
  }
6894
7007
  /**
6895
7008
  * DsMobileNewInquiryModalService
@@ -8271,7 +8384,7 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
8271
8384
  * Note: FAB is always 56px circular, but this affects the icon size
8272
8385
  * @default 'md'
8273
8386
  */
8274
- size: _angular_core.InputSignal<"md" | "sm" | "lg">;
8387
+ size: _angular_core.InputSignal<"sm" | "md" | "lg">;
8275
8388
  /**
8276
8389
  * ARIA label for accessibility
8277
8390
  * @required - Always provide a descriptive label
@@ -8722,6 +8835,24 @@ declare class MobileHandbookPageComponent {
8722
8835
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHandbookPageComponent, "app-mobile-handbook-page", never, {}, {}, never, never, true, never>;
8723
8836
  }
8724
8837
 
8838
+ interface ServiceVendor {
8839
+ id: string;
8840
+ name: string;
8841
+ category: string;
8842
+ description?: string;
8843
+ phone?: string;
8844
+ logo?: string;
8845
+ thumbnail?: string;
8846
+ heroImage?: string;
8847
+ fullDescription?: string;
8848
+ price?: string;
8849
+ availabilityStatus?: 'available-today' | 'available-from' | 'unavailable';
8850
+ statusLabel?: string;
8851
+ requirements?: string[];
8852
+ restrictions?: string[];
8853
+ expectations?: string;
8854
+ }
8855
+
8725
8856
  type LoadingPhase = 'loading' | 'exiting' | 'idle';
8726
8857
  /**
8727
8858
  * PageLoadingService
@@ -8838,16 +8969,14 @@ declare class MobileHomePageComponent implements OnInit {
8838
8969
  readonly isPeerGroupConversation: typeof isPeerGroupConversation;
8839
8970
  protected pageLoading: PageLoadingService;
8840
8971
  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
- }[]>;
8972
+ private inquiriesService;
8973
+ openInquiries: _angular_core.Signal<_propbinder_mobile_design.Inquiry[]>;
8849
8974
  recentPeerMessages: _angular_core.Signal<PeerConversation[]>;
8975
+ private allVendors;
8976
+ previewVendors: _angular_core.Signal<ServiceVendor[]>;
8850
8977
  private modalCtrl;
8978
+ private vendorModal;
8979
+ private newInquiryModal;
8851
8980
  constructor(router: Router, navCtrl: NavController, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService, trackingPermissionService: TrackingPermissionService, bottomSheet: DsMobileBottomSheetService, familyAccessService: FamilyAccessService, peerMessaging: PeerMessagingService, peerChat: PeerChatLauncherService);
8852
8981
  ngOnInit(): void;
8853
8982
  private simulateLoad;
@@ -8858,6 +8987,9 @@ declare class MobileHomePageComponent implements OnInit {
8858
8987
  navigateToInquiries(): void;
8859
8988
  navigateToTenants(): void;
8860
8989
  private openTenantPicker;
8990
+ navigateToServices(): void;
8991
+ openVendorSheet(vendor: ServiceVendor): Promise<void>;
8992
+ private openInquiryForVendor;
8861
8993
  navigateToMessages(): void;
8862
8994
  openPeerMessagePreview(conv: PeerConversation): Promise<void>;
8863
8995
  handlePostLongPress(postId: string): Promise<void>;
@@ -8871,20 +9003,29 @@ interface Inquiry {
8871
9003
  description: string;
8872
9004
  status: 'open' | 'closed';
8873
9005
  timestamp: string;
8874
- category: 'maintenance' | 'plumbing' | 'electrical' | 'heating' | 'security' | 'appliance' | 'other';
9006
+ category: string;
9007
+ vendorName?: string;
9008
+ vendorLogo?: string;
8875
9009
  }
9010
+ declare class InquiriesService {
9011
+ readonly inquiries: _angular_core.WritableSignal<Inquiry[]>;
9012
+ readonly openInquiries: _angular_core.Signal<Inquiry[]>;
9013
+ getById(id: string): Inquiry | undefined;
9014
+ addInquiry(inquiry: Inquiry): void;
9015
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InquiriesService, never>;
9016
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<InquiriesService>;
9017
+ }
9018
+
8876
9019
  declare class MobileInquiriesPageComponent {
8877
9020
  userService: UserService;
8878
9021
  private navCtrl;
8879
9022
  private newInquiryModal;
8880
9023
  pageComponent: DsMobilePageMainComponent;
9024
+ private inquiriesService;
8881
9025
  constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
8882
9026
  filterStatus: _angular_core.WritableSignal<"open" | "closed" | "all">;
8883
9027
  tabItems: InlineTabItem[];
8884
- inquiries: _angular_core.WritableSignal<Inquiry[]>;
8885
9028
  filteredInquiries: _angular_core.Signal<Inquiry[]>;
8886
- openInquiries: _angular_core.Signal<Inquiry[]>;
8887
- closedInquiries: _angular_core.Signal<Inquiry[]>;
8888
9029
  setFilter(status: 'all' | 'open' | 'closed'): void;
8889
9030
  getInquiryIcon(category: string): string;
8890
9031
  openInquiryDetail(inquiryId: string): void;
@@ -8905,30 +9046,37 @@ interface MessageThread {
8905
9046
  timestamp: string;
8906
9047
  unread: boolean;
8907
9048
  }
8908
- declare class MobileInquiryDetailPageComponent {
9049
+ declare class MobileInquiryDetailPageComponent implements OnInit {
8909
9050
  userService: UserService;
8910
9051
  private lightbox;
8911
9052
  private chatModal;
9053
+ private route;
9054
+ private inquiriesService;
8912
9055
  inquiryTitle: string;
9056
+ inquiryDescription: string;
9057
+ inquiryCategory: string;
9058
+ inquiryTimestamp: string;
9059
+ vendorName: string;
9060
+ vendorInitials: string;
9061
+ vendorLogo: string;
9062
+ isServiceInquiry: boolean;
8913
9063
  activeTab: _angular_core.WritableSignal<string>;
8914
9064
  tabItems: InlineTabItem[];
9065
+ serviceMessageThread: MessageThread[];
9066
+ get activeMessages(): MessageThread[];
8915
9067
  messageThreads: MessageThread[];
8916
- unreadMessagesCount: _angular_core.Signal<number>;
9068
+ private updateMessagesBadge;
8917
9069
  photos: LightboxImage[];
8918
9070
  get photoUrls(): string[];
8919
9071
  constructor(userService: UserService, lightbox: DsMobileLightboxService, chatModal: DsMobileChatModalService);
9072
+ ngOnInit(): void;
8920
9073
  setActiveTab(tabId: string): void;
8921
9074
  goBack(): void;
8922
9075
  handleRefresh(event: any): void;
8923
- /**
8924
- * Check if there are unread messages
8925
- */
8926
9076
  hasUnreadMessages(): boolean;
8927
- /**
8928
- * Navigate to messages tab when banner is clicked
8929
- */
8930
9077
  navigateToMessagesTab(): void;
8931
9078
  openMessage(messageId: string): Promise<void>;
9079
+ openVendorChat(): Promise<void>;
8932
9080
  openPhotoLightbox(index: number): Promise<void>;
8933
9081
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileInquiryDetailPageComponent, never>;
8934
9082
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileInquiryDetailPageComponent, "app-mobile-inquiry-detail-page", never, {}, {}, never, never, true, never>;
@@ -9347,6 +9495,53 @@ declare class TenantChatPageComponent {
9347
9495
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TenantChatPageComponent, "app-tenant-chat-page", never, {}, {}, never, never, true, never>;
9348
9496
  }
9349
9497
 
9498
+ interface ServicePageLabels {
9499
+ pageTitle: string;
9500
+ emptyState: string;
9501
+ emptyStateDescription: string;
9502
+ }
9503
+ declare const DEFAULT_SERVICE_PAGE_LABELS: ServicePageLabels;
9504
+ declare function stripHtml(html: string): string;
9505
+ declare class ServicesPageComponent {
9506
+ pageComponent: DsMobilePageMainComponent;
9507
+ private vendorModal;
9508
+ private newInquiryModal;
9509
+ private inquiriesService;
9510
+ private navCtrl;
9511
+ userService: UserService;
9512
+ lbl: ServicePageLabels;
9513
+ vendors: _angular_core.WritableSignal<ServiceVendor[]>;
9514
+ stripHtml: typeof stripHtml;
9515
+ openVendorSheet(vendor: ServiceVendor): Promise<void>;
9516
+ private openInquiryForVendor;
9517
+ handleRefresh(event: CustomEvent): void;
9518
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ServicesPageComponent, never>;
9519
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ServicesPageComponent, "app-services-page", never, {}, {}, never, never, true, never>;
9520
+ }
9521
+
9522
+ declare class DsMobileServiceVendorSheetComponent {
9523
+ vendorName: string;
9524
+ vendorDescription: string;
9525
+ vendorImage: string;
9526
+ vendorLogo: string;
9527
+ bookButtonLabel: string;
9528
+ private modalController;
9529
+ handleBook(): Promise<void>;
9530
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileServiceVendorSheetComponent, never>;
9531
+ 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>;
9532
+ }
9533
+ declare class DsMobileServiceVendorModalService extends BaseModalService {
9534
+ constructor(modalController: ModalController);
9535
+ open(props: {
9536
+ vendorName: string;
9537
+ vendorDescription?: string;
9538
+ vendorImage?: string;
9539
+ vendorLogo?: string;
9540
+ }): Promise<HTMLIonModalElement>;
9541
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileServiceVendorModalService, never>;
9542
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DsMobileServiceVendorModalService>;
9543
+ }
9544
+
9350
9545
  /**
9351
9546
  * Custom page transition - iOS-style push/pop with dark overlay
9352
9547
  *
@@ -9404,5 +9599,5 @@ declare class MediaPickerService {
9404
9599
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MediaPickerService>;
9405
9600
  }
9406
9601
 
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 };
9602
+ 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, DsMobileGlassSpinnerComponent, 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 };
9603
+ 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.79",
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
+ }