@propbinder/mobile-design 0.2.47 → 0.2.50

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.
Files changed (221) hide show
  1. package/ng-package.json +24 -0
  2. package/package.json +3 -39
  3. package/src/animations/page-transitions.ts +165 -0
  4. package/src/assets/fonts/brockmann-mediumitalic-webfont.woff2 +0 -0
  5. package/src/assets/fonts/brockmann-regularitalic-webfont.woff2 +0 -0
  6. package/src/assets/fonts/brockmann-semibolditalic-webfont.woff2 +0 -0
  7. package/src/components/action-list-item/ds-mobile-action-list-item.ts +102 -0
  8. package/src/components/action-list-item/index.ts +2 -0
  9. package/src/components/app-icon/ds-app-icon.ts +133 -0
  10. package/src/components/app-icon/index.ts +2 -0
  11. package/src/components/attachment-preview/ds-mobile-attachment-preview.css +139 -0
  12. package/src/components/attachment-preview/ds-mobile-attachment-preview.ts +164 -0
  13. package/src/components/attachment-preview/index.ts +1 -0
  14. package/src/components/avatar-with-badge/ds-avatar-with-badge.ts +142 -0
  15. package/src/components/avatar-with-badge/index.ts +2 -0
  16. package/src/components/booking-modal/ds-mobile-booking-confirmation-wrapper.ts +71 -0
  17. package/src/components/booking-modal/ds-mobile-booking-modal.service.ts +121 -0
  18. package/src/components/booking-modal/ds-mobile-booking-modal.ts +598 -0
  19. package/src/components/booking-modal/ds-mobile-booking-summary.ts +161 -0
  20. package/src/components/booking-modal/index.ts +4 -0
  21. package/src/components/bottom-sheet/ds-mobile-actions-bottom-sheet.ts +266 -0
  22. package/src/components/bottom-sheet/ds-mobile-bottom-sheet-header.ts +146 -0
  23. package/src/components/bottom-sheet/ds-mobile-bottom-sheet-wrapper.ts +156 -0
  24. package/src/components/bottom-sheet/ds-mobile-bottom-sheet.css +101 -0
  25. package/src/components/bottom-sheet/ds-mobile-bottom-sheet.service.ts +169 -0
  26. package/src/components/bottom-sheet/ds-mobile-confirmation-sheet.ts +211 -0
  27. package/src/components/bottom-sheet/ds-mobile-post-create-bottom-sheet.ts +578 -0
  28. package/src/components/bottom-sheet/ds-mobile-profile-actions-sheet.ts +614 -0
  29. package/src/components/bottom-sheet/index.ts +8 -0
  30. package/src/components/bottom-sheet/modal-shadow-fix.ts +42 -0
  31. package/src/components/card-inline/ds-mobile-card-inline.ts +301 -0
  32. package/src/components/card-inline/index.ts +2 -0
  33. package/src/components/card-inline-banner/ds-mobile-card-inline-banner.ts +118 -0
  34. package/src/components/card-inline-banner/index.ts +1 -0
  35. package/src/components/card-inline-contact/ds-mobile-card-inline-contact.ts +120 -0
  36. package/src/components/card-inline-contact/index.ts +1 -0
  37. package/src/components/card-inline-file/ds-mobile-card-inline-file.ts +141 -0
  38. package/src/components/card-inline-file/index.ts +1 -0
  39. package/src/components/chat-modal/ds-mobile-chat-modal.css +159 -0
  40. package/src/components/chat-modal/ds-mobile-chat-modal.service.ts +105 -0
  41. package/src/components/chat-modal/ds-mobile-chat-modal.ts +918 -0
  42. package/src/components/chat-modal/index.ts +8 -0
  43. package/src/components/comment/ds-mobile-comment.ts +568 -0
  44. package/src/components/comment/index.ts +2 -0
  45. package/src/components/contact-list-item/ds-mobile-contact-list-item.ts +182 -0
  46. package/src/components/contact-list-item/index.ts +2 -0
  47. package/src/components/content/ds-mobile-content.ts +139 -0
  48. package/src/components/content/index.ts +2 -0
  49. package/src/components/dropdown/ds-mobile-dropdown.css +199 -0
  50. package/src/components/dropdown/ds-mobile-dropdown.ts +340 -0
  51. package/src/components/dropdown/index.ts +2 -0
  52. package/src/components/ds-mobile-tabs.css +407 -0
  53. package/src/components/ds-mobile-tabs.ts +216 -0
  54. package/src/components/empty-state/ds-mobile-empty-state.ts +120 -0
  55. package/src/components/empty-state/index.ts +2 -0
  56. package/src/components/fab/ds-mobile-fab.ts +315 -0
  57. package/src/components/fab/index.ts +1 -0
  58. package/src/components/facility-creation-modal/ds-mobile-facility-creation-confirmation-wrapper.ts +121 -0
  59. package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.css +189 -0
  60. package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.service.ts +135 -0
  61. package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.ts +656 -0
  62. package/src/components/facility-creation-modal/index.ts +9 -0
  63. package/src/components/facility-creation-modal/sheets/ds-mobile-access-sheet.ts +105 -0
  64. package/src/components/facility-creation-modal/sheets/ds-mobile-price-sheet.ts +188 -0
  65. package/src/components/facility-creation-modal/sheets/ds-mobile-when-can-book-sheet.ts +460 -0
  66. package/src/components/facility-creation-modal/sheets/ds-mobile-who-can-book-sheet.ts +134 -0
  67. package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.service.ts +69 -0
  68. package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.ts +379 -0
  69. package/src/components/facility-detail-modal/index.ts +2 -0
  70. package/src/components/file-attachment/ds-mobile-file-attachment.ts +164 -0
  71. package/src/components/file-attachment/index.ts +2 -0
  72. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.css +214 -0
  73. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.service.ts +84 -0
  74. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.ts +424 -0
  75. package/src/components/handbook-detail-modal/index.ts +3 -0
  76. package/src/components/handbook-folder/ds-mobile-handbook-folder-mini.ts +175 -0
  77. package/src/components/handbook-folder/ds-mobile-handbook-folder.ts +533 -0
  78. package/src/components/handbook-folder/index.ts +4 -0
  79. package/src/components/header-content/ds-mobile-header-content.ts +222 -0
  80. package/src/components/header-content/index.ts +2 -0
  81. package/src/components/illustration/ds-mobile-illustration.ts +124 -0
  82. package/src/components/illustration/index.ts +2 -0
  83. package/src/components/index.ts +124 -0
  84. package/src/components/inline-photo/ds-mobile-inline-photo.ts +361 -0
  85. package/src/components/inline-photo/index.ts +1 -0
  86. package/src/components/inline-tabs/ds-mobile-inline-tabs.ts +132 -0
  87. package/src/components/inline-tabs/index.ts +2 -0
  88. package/src/components/interactive-list-item-booking/ds-mobile-interactive-list-item-booking.ts +350 -0
  89. package/src/components/interactive-list-item-booking/index.ts +1 -0
  90. package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.ts +321 -0
  91. package/src/components/interactive-list-item-inquiry/index.ts +2 -0
  92. package/src/components/interactive-list-item-message/ds-mobile-interactive-list-item-message.ts +237 -0
  93. package/src/components/interactive-list-item-message/index.ts +2 -0
  94. package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.ts +549 -0
  95. package/src/components/interactive-list-item-post/ds-mobile-post-pdf-attachment.ts +124 -0
  96. package/src/components/interactive-list-item-post/index.ts +13 -0
  97. package/src/components/lightbox/ds-mobile-lightbox-footer.ts +315 -0
  98. package/src/components/lightbox/ds-mobile-lightbox-header.ts +202 -0
  99. package/src/components/lightbox/ds-mobile-lightbox-image.ts +484 -0
  100. package/src/components/lightbox/ds-mobile-lightbox-pdf.css +377 -0
  101. package/src/components/lightbox/ds-mobile-lightbox-pdf.ts +374 -0
  102. package/src/components/lightbox/ds-mobile-lightbox.css +587 -0
  103. package/src/components/lightbox/ds-mobile-lightbox.service.ts +296 -0
  104. package/src/components/lightbox/ds-mobile-lightbox.ts +529 -0
  105. package/src/components/lightbox/index.ts +22 -0
  106. package/src/components/list-item/ds-mobile-list-item.ts +603 -0
  107. package/src/components/list-item/index.ts +2 -0
  108. package/src/components/list-item-static/ds-mobile-list-item-static.ts +133 -0
  109. package/src/components/list-item-static/index.ts +2 -0
  110. package/src/components/loader-overlay/ds-mobile-loader-overlay.css +49 -0
  111. package/src/components/loader-overlay/ds-mobile-loader-overlay.ts +77 -0
  112. package/src/components/loader-overlay/index.ts +1 -0
  113. package/src/components/logo/ds-logo.ts +95 -0
  114. package/src/components/logo/index.ts +2 -0
  115. package/src/components/message-bubble/ds-mobile-message-bubble.ts +633 -0
  116. package/src/components/message-bubble/index.ts +7 -0
  117. package/src/components/message-composer/ds-mobile-message-composer.ts +1146 -0
  118. package/src/components/message-composer/index.ts +7 -0
  119. package/src/components/modal/ds-mobile-modal.css +163 -0
  120. package/src/components/modal/ds-mobile-modal.service.ts +329 -0
  121. package/src/components/modal/index.ts +8 -0
  122. package/src/components/modal-base/ds-mobile-modal-base.css +378 -0
  123. package/src/components/modal-base/ds-mobile-modal-base.ts +261 -0
  124. package/src/components/modal-base/index.ts +2 -0
  125. package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.css +112 -0
  126. package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.service.ts +93 -0
  127. package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.ts +442 -0
  128. package/src/components/new-inquiry-modal/index.ts +4 -0
  129. package/src/components/offline-banner/ds-mobile-offline-banner.ts +135 -0
  130. package/src/components/offline-banner/index.ts +1 -0
  131. package/src/components/page-details/ds-mobile-page-details.css +83 -0
  132. package/src/components/page-details/ds-mobile-page-details.ts +282 -0
  133. package/src/components/page-details/index.ts +2 -0
  134. package/src/components/page-main/ds-mobile-page-main.css +68 -0
  135. package/src/components/page-main/ds-mobile-page-main.ts +421 -0
  136. package/src/components/page-main/index.ts +2 -0
  137. package/src/components/post-composer/ds-mobile-post-composer.ts +140 -0
  138. package/src/components/post-composer/index.ts +2 -0
  139. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.css +390 -0
  140. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.service.ts +108 -0
  141. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.ts +722 -0
  142. package/src/components/post-detail-modal/index.ts +9 -0
  143. package/src/components/property-banner/ds-mobile-property-banner.ts +95 -0
  144. package/src/components/property-banner/index.ts +2 -0
  145. package/src/components/section/ds-mobile-section.ts +263 -0
  146. package/src/components/section/index.ts +2 -0
  147. package/src/components/shared/directives/index.ts +2 -0
  148. package/src/components/shared/directives/long-press.directive.ts +212 -0
  149. package/src/components/shared/index.ts +3 -0
  150. package/src/components/shared/mobile-modal-base.ts +457 -0
  151. package/src/components/shared/mobile-page-base.ts +204 -0
  152. package/src/components/swiper/ds-mobile-swiper-with-nav.ts +160 -0
  153. package/src/components/swiper/ds-mobile-swiper.ts +327 -0
  154. package/src/components/swiper/index.ts +3 -0
  155. package/src/components/system-message-banner/ds-mobile-system-message-banner.ts +129 -0
  156. package/src/components/system-message-banner/index.ts +2 -0
  157. package/src/components/tab-bar/ds-mobile-tab-bar.css +533 -0
  158. package/src/components/tab-bar/ds-mobile-tab-bar.ts +735 -0
  159. package/src/components/tab-bar/index.ts +2 -0
  160. package/src/components/tabs/ds-mobile-tabs.css +25 -0
  161. package/src/components/tabs/ds-mobile-tabs.ts +89 -0
  162. package/src/components/tabs/index.ts +2 -0
  163. package/src/components/text-input/ds-text-input.ts +287 -0
  164. package/src/components/text-input/index.ts +2 -0
  165. package/src/examples/booking.page.ts +434 -0
  166. package/src/examples/community.page.ts +776 -0
  167. package/src/examples/handbook.page.ts +324 -0
  168. package/src/examples/home.page.ts +347 -0
  169. package/src/examples/index.ts +12 -0
  170. package/src/examples/inquiries.example.ts +273 -0
  171. package/src/examples/inquiry-detail.example.css +189 -0
  172. package/src/examples/inquiry-detail.example.ts +415 -0
  173. package/src/examples/mobile-tabs-example.component.ts +208 -0
  174. package/src/examples/post-create.page.ts +311 -0
  175. package/src/examples/post-detail.page.ts +296 -0
  176. package/src/examples/sign-in.page.ts +291 -0
  177. package/src/examples/whitelabel-demo-modal.component.ts +1094 -0
  178. package/src/examples/whitelabel-demo-modal.service.ts +77 -0
  179. package/src/models/index.ts +7 -0
  180. package/src/models/post.model.ts +41 -0
  181. package/src/pages/community.page.ts +769 -0
  182. package/src/pages/handbook.page.ts +388 -0
  183. package/src/pages/home.page.ts +303 -0
  184. package/src/pages/index.ts +11 -0
  185. package/src/pages/inquiries.example.ts +273 -0
  186. package/src/pages/inquiry-detail.example.css +189 -0
  187. package/src/pages/inquiry-detail.example.ts +415 -0
  188. package/src/pages/mobile-tabs-example.component.ts +179 -0
  189. package/src/pages/post-create.page.ts +311 -0
  190. package/src/pages/post-detail.page.ts +296 -0
  191. package/src/pages/sign-in.page.ts +291 -0
  192. package/src/pages/whitelabel-demo-modal.component.ts +1094 -0
  193. package/src/pages/whitelabel-demo-modal.service.ts +77 -0
  194. package/src/public-api.ts +6 -0
  195. package/src/services/base-modal.service.ts +101 -0
  196. package/src/services/index.ts +11 -0
  197. package/src/services/posts.service.ts +542 -0
  198. package/src/services/tracking-permission.service.ts +88 -0
  199. package/src/services/user.service.ts +60 -0
  200. package/src/services/whitelabel.service.ts +675 -0
  201. package/{styles → src/styles}/ionic.css +25 -0
  202. package/tsconfig.lib.json +17 -0
  203. package/tsconfig.lib.prod.json +9 -0
  204. package/tsconfig.spec.json +13 -0
  205. package/fesm2022/propbinder-mobile-design.mjs +0 -26136
  206. package/fesm2022/propbinder-mobile-design.mjs.map +0 -1
  207. package/index.d.ts +0 -8154
  208. /package/{assets → src/assets}/fonts/Brockmann-Bold.otf +0 -0
  209. /package/{assets → src/assets}/fonts/Brockmann-BoldItalic.otf +0 -0
  210. /package/{assets → src/assets}/fonts/Brockmann-Medium.otf +0 -0
  211. /package/{assets → src/assets}/fonts/Brockmann-MediumItalic.otf +0 -0
  212. /package/{assets → src/assets}/fonts/Brockmann-Regular.otf +0 -0
  213. /package/{assets → src/assets}/fonts/Brockmann-RegularItalic.otf +0 -0
  214. /package/{assets → src/assets}/fonts/Brockmann-SemiBold.otf +0 -0
  215. /package/{assets → src/assets}/fonts/Brockmann-SemiBoldItalic.otf +0 -0
  216. /package/{assets → src/assets}/fonts/Brockmann_desktop_license.pdf +0 -0
  217. /package/{assets → src/assets}/fonts/brockmann-medium-webfont.woff2 +0 -0
  218. /package/{assets → src/assets}/fonts/brockmann-regular-webfont.woff2 +0 -0
  219. /package/{assets → src/assets}/fonts/brockmann-semibold-webfont.woff2 +0 -0
  220. /package/{styles → src/components/shared}/mobile-common.css +0 -0
  221. /package/{styles → src/components/shared}/mobile-page-base.css +0 -0
@@ -0,0 +1,324 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import { DsMobilePageMainComponent } from '../components/page-main';
3
+ import { DsMobileSectionComponent } from '../components/section';
4
+ import { DsMobileHandbookFolderComponent } from '../components/handbook-folder';
5
+ import { DsMobileOfflineBannerComponent } from '../components/offline-banner';
6
+ import { UserService } from '../services/user.service';
7
+ import { HandbookItem } from '../components/handbook-detail-modal/ds-mobile-handbook-detail-modal';
8
+
9
+ @Component({
10
+ selector: 'app-mobile-handbook-page',
11
+ standalone: true,
12
+ imports: [DsMobilePageMainComponent, DsMobileSectionComponent, DsMobileHandbookFolderComponent, DsMobileOfflineBannerComponent],
13
+ styles: [
14
+ `
15
+ .folders-grid {
16
+ display: grid;
17
+ grid-template-columns: repeat(2, 1fr);
18
+ gap: 20px;
19
+ justify-items: center;
20
+ }
21
+
22
+ /* 3 columns at tablet breakpoint (md: 768px) and above
23
+ Content area at this breakpoint is ~864px max */
24
+ @media (min-width: 768px) {
25
+ .folders-grid {
26
+ grid-template-columns: repeat(3, 1fr);
27
+ }
28
+ }
29
+
30
+ ds-mobile-handbook-folder {
31
+ width: 100%;
32
+ min-width: 0;
33
+ }
34
+ `,
35
+ ],
36
+ template: `
37
+ <ds-mobile-page-main #pageComponent title="Håndbog" [avatarInitials]="userService.avatarInitials()" [avatarType]="userService.avatarType()" (refresh)="handleRefresh($event)">
38
+ <!-- Offline indicator -->
39
+ @if (pageComponent.isOffline()) {
40
+ <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
41
+ }
42
+
43
+ <ds-mobile-section>
44
+ <div class="folders-grid">
45
+ <ds-mobile-handbook-folder [variant]="'pink'" [iconName]="'remixLightbulbLine'" [itemCount]="8" [label]="'Forsyninger'" [items]="utilitiesItems">
46
+ </ds-mobile-handbook-folder>
47
+
48
+ <ds-mobile-handbook-folder [variant]="'success'" [iconName]="'remixKey2Line'" [itemCount]="4" [label]="'Sikkerhedsudstyr'" [items]="sikkerhedsudstyrItems">
49
+ </ds-mobile-handbook-folder>
50
+
51
+ <ds-mobile-handbook-folder [variant]="'blue'" [iconName]="'remixFileList3Line'" [itemCount]="8" [label]="'Servicekontrakter'" [items]="serviceContractsItems">
52
+ </ds-mobile-handbook-folder>
53
+
54
+ <ds-mobile-handbook-folder [variant]="'warning'" [iconName]="'remixToolsLine'" [itemCount]="5" [label]="'Udstyr'" [items]="equipmentItems"> </ds-mobile-handbook-folder>
55
+ </div>
56
+ </ds-mobile-section>
57
+ </ds-mobile-page-main>
58
+ `,
59
+ })
60
+ export class MobileHandbookPageComponent {
61
+ @ViewChild('pageComponent') pageComponent!: DsMobilePageMainComponent;
62
+
63
+ // Utilities folder data
64
+ utilitiesItems: HandbookItem[] = [
65
+ {
66
+ title: 'El',
67
+ description: '<p>Hovedeltavle placeret i <strong>kælderrum B-12</strong>. Nødafbryderknap er ved hovedindgangen. Alle kredsløb er mærket.</p><p><em>Bemærk: Der må ikke foretages ændringer på eltavlen uden tilladelse fra ejendomsadministrationen.</em></p><p>Ved <u>strømsvigt</u> kontakt venligst ElektroTek ApS på nedenstående nummer.</p>',
68
+ contacts: [
69
+ {
70
+ name: 'ElektroTek ApS',
71
+ initials: 'E',
72
+ contactPerson: 'Lars Nielsen',
73
+ phoneNumber: '+45 23 45 67 89',
74
+ },
75
+ ],
76
+ },
77
+ {
78
+ title: 'Elektrisk diagram',
79
+ description: 'Komplet diagram over bygningens elektriske installation med alle kredsløb og afbrydere.',
80
+ attachments: [{ name: 'Elektrisk_Diagram.pdf', type: 'pdf' }],
81
+ },
82
+ {
83
+ title: 'Vandforsyning',
84
+ description: '<p>Hovedvandhane er placeret i kælderens <strong>tekniske rum</strong>. Individuelle lejlighedsafspærringer er i gangpanelerne.</p><p>Vandtryk overvåges <em>automatisk</em> af bygningens system.</p><p><strong><em>Vigtigt:</em></strong> Ved vandskade, luk <u>straks</u> for hovedvandhanen og kontakt VVS Hansen.</p>',
85
+ contacts: [
86
+ {
87
+ name: 'VVS Hansen',
88
+ initials: 'V',
89
+ contactPerson: 'Peter Hansen',
90
+ phoneNumber: '+45 34 56 78 90',
91
+ },
92
+ ],
93
+ },
94
+ {
95
+ title: 'Varmesystem',
96
+ description: '<p>Fjernvarmetilslutning i kælder. Termostater i hver enhed kan justeres individuelt.</p><p>Systemet vedligeholdes <strong>kvartalsvis</strong> af certificerede teknikere.</p><p><em>Tip: Sæt termostaten til 21°C for optimal komfort og energibesparelse.</em></p>',
97
+ contacts: [
98
+ {
99
+ name: 'Varme Service A/S',
100
+ initials: 'V',
101
+ contactPerson: 'Maria Jensen',
102
+ phoneNumber: '+45 45 67 89 01',
103
+ },
104
+ ],
105
+ },
106
+ {
107
+ title: 'Varmeanlæg dokumentation',
108
+ description: 'Teknisk dokumentation og vedligeholdelseshistorik for bygningens varmesystem.',
109
+ attachments: [
110
+ { name: 'Varmeplan.pdf', type: 'pdf' },
111
+ { name: 'Vedligeholdelseslog.pdf', type: 'pdf' },
112
+ ],
113
+ },
114
+ {
115
+ title: 'Internet & TV',
116
+ description: 'Fiberforbindelse i bygningen. Distributionspanel er i stueetageteknisk rum. Hver lejlighed har ethernet-stik i stue og soveværelser.',
117
+ contacts: [
118
+ {
119
+ name: 'TeleCom Solutions',
120
+ initials: 'T',
121
+ contactPerson: 'Anders Petersen',
122
+ phoneNumber: '+45 56 78 90 12',
123
+ },
124
+ ],
125
+ },
126
+ {
127
+ title: 'Netværksopsætning guide',
128
+ attachments: [{ name: 'Netværksopsætning.pdf', type: 'pdf' }],
129
+ },
130
+ {
131
+ title: 'Affaldshåndtering',
132
+ description: 'Affaldssorteringsstation placeret i gården. Afhentninger: Dagrenovation (man/tor), Genbrug (ons), Organisk (tir/fre). Storskrald kræver booking.',
133
+ attachments: [{ name: 'Affaldsretningslinjer.pdf', type: 'pdf' }],
134
+ },
135
+ ];
136
+
137
+ // Safety Equipment folder data
138
+ sikkerhedsudstyrItems: HandbookItem[] = [
139
+ {
140
+ title: 'Fælles områder og sikkerhed',
141
+ description: 'Trappeopgange med nødbelysning og brandsikre døre. Postkasser placeret i indgangspartiet. Hold altid flugtveje fri.',
142
+ images: ['/Assets/Dummy-photos/staircase.jpg', '/Assets/Dummy-photos/mailboxes.jpg'],
143
+ },
144
+ {
145
+ title: 'Hjertestarter (AED)',
146
+ description: 'Automatisk hjertestarter placeret i stueetagen ved hovedindgangen. Tilgængelig 24/7. Ingen særlig uddannelse kræves - enheden guider dig gennem processen.',
147
+ contacts: [
148
+ {
149
+ name: 'MediTech Service',
150
+ initials: 'M',
151
+ contactPerson: 'John Mortensen',
152
+ phoneNumber: '+45 12 34 56 78',
153
+ },
154
+ ],
155
+ attachments: [
156
+ {
157
+ name: 'Brandplan.pdf',
158
+ type: 'pdf',
159
+ url: 'https://portal-api.propbinder.com/Handbook/GetFile/50145267-d9a2-448b-a0e1-1af39d344818',
160
+ },
161
+ ],
162
+ },
163
+ {
164
+ title: 'Brandslukningsudstyr',
165
+ description: 'Brandslukkere placeret på hver etage. Eftersyn udføres årligt. Brandalarm aktiveres automatisk ved røg.',
166
+ attachments: [{ name: 'Brandplan.pdf', type: 'pdf' }],
167
+ },
168
+ {
169
+ title: 'Alarmsystem',
170
+ description: 'Adgangskontrol med kodesystem ved alle indgange. Kode ændres kvartalsvis. Ved indbrud kontakt straks politiet og ejendomsadministrationen.',
171
+ contacts: [
172
+ {
173
+ name: 'SecureHome A/S',
174
+ initials: 'S',
175
+ contactPerson: 'Henrik Johansen',
176
+ phoneNumber: '+45 98 76 54 32',
177
+ },
178
+ ],
179
+ },
180
+ ];
181
+
182
+ // Service Contracts folder data
183
+ serviceContractsItems: HandbookItem[] = [
184
+ {
185
+ title: 'Rengøringsservice',
186
+ description: 'Ugentlig rengøring af fællesarealer inklusiv indgangshal, trapper og elevatorer. Hovedrengøring kvartalsvis. Service leveres mandag-fredag, 6:00-9:00.',
187
+ contacts: [
188
+ {
189
+ name: 'CleanCo Denmark',
190
+ initials: 'C',
191
+ contactPerson: 'Anne Kristensen',
192
+ phoneNumber: '+45 89 01 23 45',
193
+ },
194
+ ],
195
+ },
196
+ {
197
+ title: 'Rengøringskontrakt',
198
+ attachments: [
199
+ { name: 'Rengøringskontrakt_2024.pdf', type: 'pdf' },
200
+ { name: 'Rengøringsplan.pdf', type: 'pdf' },
201
+ ],
202
+ },
203
+ {
204
+ title: 'Udendørs arealer',
205
+ description: 'Fælles grønne områder med bede, siddepladser og terrasse. Beboere må frit benytte området. Respektér planterne og hold området pænt.',
206
+ images: ['/Assets/Dummy-photos/park.jpg', '/Assets/Dummy-photos/yard.jpg'],
207
+ },
208
+ {
209
+ title: 'Havevedligeholdelse',
210
+ description: 'Professionel havepleje inklusiv plæneklipning, hækklipning og blomsterbedvedligeholdelse. Vintersnefjerning inkluderet.',
211
+ contacts: [
212
+ {
213
+ name: 'Green Gardens ApS',
214
+ initials: 'G',
215
+ contactPerson: 'Michael Olsen',
216
+ phoneNumber: '+45 90 12 34 56',
217
+ },
218
+ ],
219
+ },
220
+ {
221
+ title: 'Haveserviceaftale',
222
+ attachments: [{ name: 'Haveserviceaftale.pdf', type: 'pdf' }],
223
+ },
224
+ {
225
+ title: 'Vinduespolering',
226
+ description: 'Professionel vinduespoleringsservice for alle udvendige vinduer to gange årligt - forår og efterår.',
227
+ contacts: [
228
+ {
229
+ name: 'Crystal Clear Windows',
230
+ initials: 'C',
231
+ contactPerson: 'Lene Schmidt',
232
+ phoneNumber: '+45 01 23 45 67',
233
+ },
234
+ ],
235
+ },
236
+ {
237
+ title: 'Sikkerhedsservice',
238
+ description: '24/7 overvågningsservice med alarmrespons. Direkte forbindelse til politi og brandvæsen.',
239
+ contacts: [
240
+ {
241
+ name: 'SecureHome A/S',
242
+ initials: 'S',
243
+ contactPerson: 'Henrik Johansen',
244
+ phoneNumber: '+45 12 34 56 78',
245
+ },
246
+ ],
247
+ },
248
+ {
249
+ title: 'Sikkerhedskontrakt og procedurer',
250
+ attachments: [
251
+ { name: 'Sikkerhedskontrakt.pdf', type: 'pdf' },
252
+ { name: 'Nødprocedurer.pdf', type: 'pdf' },
253
+ ],
254
+ },
255
+ ];
256
+
257
+ // Equipment folder data
258
+ equipmentItems: HandbookItem[] = [
259
+ {
260
+ title: 'Balkon udsigt',
261
+ description: 'Eksempel på udsigt fra øverste etagers balkoner. Flere lejligheder har privat altan med fantastisk udsyn.',
262
+ images: ['/Assets/Dummy-photos/balcony-view.jpg'],
263
+ },
264
+ {
265
+ title: 'Vaskerum',
266
+ description:
267
+ 'Fælles vaskerum med 4 vaskemaskiner og 4 tørretumblere. Bookingsystem tilgængeligt via beboerportal. Maskiner accepterer betalingskort. Åbningstider: 7:00-22:00.',
268
+ contacts: [
269
+ {
270
+ name: 'WashTech Service',
271
+ initials: 'W',
272
+ contactPerson: 'Kirsten Berg',
273
+ phoneNumber: '+45 34 56 78 90',
274
+ },
275
+ ],
276
+ },
277
+ {
278
+ title: 'Vaskeri instruktioner',
279
+ attachments: [
280
+ { name: 'Vaskeinstruktioner.pdf', type: 'pdf' },
281
+ { name: 'Bookingguide.pdf', type: 'pdf' },
282
+ ],
283
+ },
284
+ {
285
+ title: 'Vedligeholdelse og reparationer',
286
+ description: 'Ved behov for reparationer eller vedligeholdelse i din lejlighed, kontakt vores hausmeister. Akutte problemer håndteres samme dag.',
287
+ images: ['/Assets/Dummy-photos/handyman.jpg'],
288
+ contacts: [
289
+ {
290
+ name: 'Hausmeister Service',
291
+ initials: 'H',
292
+ contactPerson: 'Erik Sørensen',
293
+ phoneNumber: '+45 56 78 90 12',
294
+ },
295
+ ],
296
+ },
297
+ {
298
+ title: 'Værktøjsudlån',
299
+ description: 'Basis håndværktøj tilgængeligt til beboerbrug. Kvittér for værktøj ved receptionen. Returnér inden for 48 timer.',
300
+ attachments: [
301
+ { name: 'Værktøjsliste.pdf', type: 'pdf' },
302
+ { name: 'Udlånspolitik.pdf', type: 'pdf' },
303
+ ],
304
+ },
305
+ ];
306
+
307
+ constructor(public userService: UserService) {}
308
+
309
+ handleRefresh(event: any): void {
310
+ console.log('Pull-to-refresh triggered');
311
+
312
+ // Check if offline and complete immediately
313
+ if (this.pageComponent?.isOffline()) {
314
+ console.log('Cannot refresh while offline');
315
+ event.target.complete();
316
+ return;
317
+ }
318
+
319
+ setTimeout(() => {
320
+ console.log('Refresh complete');
321
+ event.target.complete();
322
+ }, 1000);
323
+ }
324
+ }
@@ -0,0 +1,347 @@
1
+ import { Component, OnInit, computed, signal, ViewChild } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { DsButtonComponent } from '@propbinder/design-system';
4
+ import { DsMobilePageMainComponent } from '../components/page-main';
5
+ import { DsMobileSectionComponent } from '../components/section';
6
+ import { DsMobileIllustrationComponent } from '../components/illustration';
7
+ import { DsMobilePropertyBannerComponent } from '../components/property-banner';
8
+ import { DsMobileInteractiveListItemPostComponent } from '../components/interactive-list-item-post';
9
+ import { DsMobileOfflineBannerComponent } from '../components/offline-banner';
10
+ import {
11
+ PostContentComponent,
12
+ PostTextComponent,
13
+ PostActionsComponent,
14
+ ActionLikeComponent,
15
+ ActionCommentComponent
16
+ } from '../components/interactive-list-item-post';
17
+ import { DsMobileInteractiveListItemInquiryComponent } from '../components/interactive-list-item-inquiry';
18
+ import { UserService } from '../services/user.service';
19
+ import { PostsService } from '../services/posts.service';
20
+ import { DsMobilePostDetailModalService } from '../components/post-detail-modal/ds-mobile-post-detail-modal.service';
21
+ import { TrackingPermissionService } from '../services/tracking-permission.service';
22
+ import { DsMobileBottomSheetService } from '../components/bottom-sheet/ds-mobile-bottom-sheet.service';
23
+ import { DsMobilePostActionsBottomSheetComponent, PostActionResult } from '../components/bottom-sheet';
24
+
25
+ @Component({
26
+ selector: 'app-home-page',
27
+ standalone: true,
28
+ imports: [
29
+ DsButtonComponent,
30
+ DsMobilePageMainComponent,
31
+ DsMobileSectionComponent,
32
+ DsMobileIllustrationComponent,
33
+ DsMobilePropertyBannerComponent,
34
+ DsMobileInteractiveListItemPostComponent,
35
+ DsMobileInteractiveListItemInquiryComponent,
36
+ DsMobileOfflineBannerComponent,
37
+ PostContentComponent,
38
+ PostTextComponent,
39
+ PostActionsComponent,
40
+ ActionLikeComponent,
41
+ ActionCommentComponent
42
+ ],
43
+ styles: [`
44
+ /* Posts list wrapper */
45
+ .posts-list {
46
+ display: flex;
47
+ flex-direction: column;
48
+ }
49
+
50
+ /* Inquiries list wrapper */
51
+ .inquiries-list {
52
+ display: flex;
53
+ flex-direction: column;
54
+ }
55
+
56
+ /* Empty state */
57
+ .empty-state {
58
+ display: flex;
59
+ flex-direction: column;
60
+ align-items: center;
61
+ justify-content: center;
62
+ padding: 20px;
63
+ text-align: center;
64
+ }
65
+
66
+ .empty-state ds-button {
67
+ display: block;
68
+ margin-top: 16px;
69
+ }
70
+
71
+ .empty-state ds-button::ng-deep .btn {
72
+ width: 100%;
73
+ border-radius: 9999px;
74
+ }
75
+
76
+ .empty-state-title {
77
+ font-family: 'Brockmann', sans-serif;
78
+ font-size: var(--font-size-base);
79
+ font-weight: 600;
80
+ color: var(--color-text-primary);
81
+ margin-top: -16px;
82
+ z-index: 4;
83
+ }
84
+
85
+ .empty-state-description {
86
+ font-family: 'Brockmann', sans-serif;
87
+ font-size: var(--font-size-sm);
88
+ color: var(--color-text-secondary);
89
+ margin: 0;
90
+ }
91
+ `],
92
+ template: `
93
+ <ds-mobile-page-main
94
+ #pageComponent
95
+ title="Hjem"
96
+ headerTitle="Velkommen, Lars"
97
+ [avatarInitials]="userService.avatarInitials()"
98
+ [avatarType]="userService.avatarType()"
99
+ (refresh)="handleRefresh($event)"
100
+ >
101
+
102
+ <!-- Offline indicator -->
103
+ @if (pageComponent.isOffline()) {
104
+ <ds-mobile-offline-banner
105
+ offline-indicator
106
+ title="Ingen internetforbindelse"
107
+ message="Nogle funktioner kan være utilgængelige">
108
+ </ds-mobile-offline-banner>
109
+ }
110
+
111
+ <!-- Property Banner in Header -->
112
+ <ds-mobile-property-banner
113
+ header-content
114
+ address="Toftegårds Allé 5A, 2. tv."
115
+ photoUrl="/Assets/Dummy-photos/building.jpg">
116
+ </ds-mobile-property-banner>
117
+
118
+ <!-- Recent Community Posts Section (with content) -->
119
+ <ds-mobile-section
120
+ headline="Seneste opslag"
121
+ linkText="Se alle"
122
+ (linkClick)="navigateToCommunity()">
123
+
124
+ <div class="posts-list">
125
+ @for (post of recentPosts(); track post.id) {
126
+ <ds-mobile-interactive-list-item-post
127
+ [authorName]="post.authorName"
128
+ [authorRole]="post.authorRole"
129
+ [timestamp]="post.timestamp"
130
+ [avatarType]="post.avatarType"
131
+ [avatarSrc]="post.avatarSrc || ''"
132
+ [avatarInitials]="post.avatarInitials || ''"
133
+ [showBadge]="post.showBadge || false"
134
+ [clickable]="true"
135
+ [moreActions]="true"
136
+ (postClick)="openPost(post.id)"
137
+ (commentClick)="openPost(post.id, true)"
138
+ (longPress)="handlePostLongPress(post.id)">
139
+
140
+ <post-content>
141
+ @if (post.content) {
142
+ <post-text>{{ post.content }}</post-text>
143
+ }
144
+ </post-content>
145
+
146
+ <post-actions>
147
+ <action-like [count]="post.likeCount" [active]="post.isLiked" />
148
+ <action-comment [count]="post.commentCount" (commentClick)="openPost(post.id, true)" />
149
+ </post-actions>
150
+ </ds-mobile-interactive-list-item-post>
151
+ }
152
+ </div>
153
+ </ds-mobile-section>
154
+
155
+ <!-- Recent Community Posts Section (empty state) -->
156
+ <ds-mobile-section>
157
+ <div class="empty-state">
158
+ <ds-mobile-illustration variant="post" alt="No posts" />
159
+ <h3 class="empty-state-title">Ingen opslag endnu</h3>
160
+ <p class="empty-state-description">Der er ingen opslag i fællesområdet i øjeblikket</p>
161
+
162
+ <ds-button
163
+ variant="secondary"
164
+ trailingIcon="remixArrowRightSLine"
165
+ (click)="navigateToCommunity()">
166
+ Gå til fællesområdet
167
+ </ds-button>
168
+ </div>
169
+ </ds-mobile-section>
170
+
171
+ <!-- Open Inquiries Section (with content) -->
172
+ <ds-mobile-section
173
+ headline="Åbne henvendelser"
174
+ linkText="Se alle"
175
+ (linkClick)="navigateToInquiries()">
176
+
177
+ <div class="inquiries-list">
178
+ @for (inquiry of openInquiries(); track inquiry.id) {
179
+ <ds-mobile-interactive-list-item-inquiry
180
+ [title]="inquiry.title"
181
+ [description]="inquiry.description"
182
+ [status]="inquiry.status"
183
+ [timestamp]="inquiry.timestamp"
184
+ [iconName]="'remixTodoLine'"
185
+ [clickable]="true"
186
+ [showChevron]="false"
187
+ [enableLongPress]="false"
188
+ (inquiryClick)="openInquiryDetail(inquiry.id)">
189
+ </ds-mobile-interactive-list-item-inquiry>
190
+ }
191
+ </div>
192
+ </ds-mobile-section>
193
+
194
+ <!-- Open Inquiries Section (empty state) -->
195
+ <ds-mobile-section>
196
+ <div class="empty-state">
197
+ <ds-mobile-illustration variant="inquiry" alt="No inquiries" />
198
+ <h3 class="empty-state-title">Ingen åbne henvendelser</h3>
199
+ <p class="empty-state-description">Du har ingen åbne henvendelser i øjeblikket</p>
200
+
201
+ <ds-button
202
+ variant="secondary"
203
+ trailingIcon="remixArrowRightSLine"
204
+ (click)="navigateToInquiries()">
205
+ Gå til henvendelser
206
+ </ds-button>
207
+ </div>
208
+ </ds-mobile-section>
209
+ </ds-mobile-page-main>
210
+ `
211
+ })
212
+
213
+ export class MobileHomePageComponent implements OnInit {
214
+ @ViewChild('pageComponent') pageComponent!: DsMobilePageMainComponent;
215
+
216
+ // Get recent posts from PostsService - exclude pinned post (post-4) and limit to 3
217
+ recentPosts = computed(() =>
218
+ this.postsService.posts()
219
+ .filter(post => post.id !== 'post-4') // Exclude pinned post
220
+ .slice(0, 3)
221
+ );
222
+
223
+ // Mock inquiry data
224
+ private allInquiries = signal([
225
+ {
226
+ id: '1',
227
+ title: 'Tørretumbler virker ikke',
228
+ description: 'I de sidste tre dage har jeg oplevet vedvarende problemer med tørretumbleren. Den starter, men stopper efter få minutter.',
229
+ status: 'open' as const,
230
+ timestamp: '12 dage siden'
231
+ },
232
+ {
233
+ id: '2',
234
+ title: 'Problem med vandtryk',
235
+ description: 'Lavt vandtryk i badeværelseshåndvasken. Det er blevet gradvist værre i løbet af den sidste uge.',
236
+ status: 'open' as const,
237
+ timestamp: '5 dage siden'
238
+ },
239
+ {
240
+ id: '3',
241
+ title: 'Varme virker ikke ordentligt',
242
+ description: 'Varmesystemet holder ikke den indstillede temperatur. Lejligheden er meget koldere, end den burde være.',
243
+ status: 'closed' as const,
244
+ timestamp: '2 måneder siden'
245
+ }
246
+ ]);
247
+
248
+ // Filter for open inquiries and limit to 3
249
+ openInquiries = computed(() =>
250
+ this.allInquiries()
251
+ .filter(inquiry => inquiry.status === 'open')
252
+ .slice(0, 3)
253
+ );
254
+
255
+ constructor(
256
+ private router: Router,
257
+ public userService: UserService,
258
+ private postsService: PostsService,
259
+ private postModal: DsMobilePostDetailModalService,
260
+ private trackingPermissionService: TrackingPermissionService,
261
+ private bottomSheet: DsMobileBottomSheetService
262
+ ) {
263
+ console.log('MobileHomePageComponent constructor');
264
+ }
265
+
266
+ ngOnInit(): void {
267
+ void this.trackingPermissionService.requestOnFirstHomeEntry();
268
+ }
269
+
270
+ handleRefresh(event: any): void {
271
+ console.log('Pull-to-refresh triggered');
272
+ setTimeout(() => {
273
+ console.log('Refresh complete');
274
+ event.target.complete();
275
+ }, 1000);
276
+ }
277
+
278
+ async openPost(postId: string, focusComment: boolean = false): Promise<void> {
279
+ console.log('Opening post:', postId, 'Focus comments:', focusComment);
280
+
281
+ const post = this.postsService.getPostById(postId);
282
+
283
+ if (post) {
284
+ // Convert Post model to modal format (add postId and focusComment)
285
+ const postData = {
286
+ ...post,
287
+ postId: post.id,
288
+ avatarType: post.avatarType === 'icon' ? undefined : post.avatarType,
289
+ focusComment
290
+ };
291
+
292
+ await this.postModal.open(postData, {
293
+ currentUserName: 'Lars Mikkelsen',
294
+ currentUserInitials: this.userService.avatarInitials()
295
+ });
296
+ }
297
+ }
298
+
299
+ openInquiryDetail(inquiryId: string): void {
300
+ console.log('Opening inquiry:', inquiryId);
301
+ this.router.navigate(['/inquiry-detail', inquiryId]);
302
+ }
303
+
304
+ navigateToCommunity(): void {
305
+ console.log('Navigating to community page');
306
+ this.router.navigate(['/announcements']);
307
+ }
308
+
309
+ navigateToInquiries(): void {
310
+ console.log('Navigating to inquiries page');
311
+ this.router.navigate(['/inquiries']);
312
+ }
313
+
314
+ async handlePostLongPress(postId: string): Promise<void> {
315
+ const sheet = await this.bottomSheet.create({
316
+ component: DsMobilePostActionsBottomSheetComponent,
317
+ componentProps: { isOwnContent: false },
318
+ breakpoints: [0, 1],
319
+ initialBreakpoint: 1,
320
+ handle: true,
321
+ backdropDismiss: true,
322
+ cssClass: 'auto-height'
323
+ });
324
+
325
+ const result = await sheet.onWillDismiss();
326
+
327
+ if (result.role === 'select' && result.data) {
328
+ const action = (result.data as PostActionResult).action;
329
+
330
+ switch (action) {
331
+ case 'like':
332
+ const post = this.postsService.getPostById(postId);
333
+ if (post) {
334
+ this.postsService.updatePost(postId, {
335
+ isLiked: !post.isLiked,
336
+ likeCount: post.isLiked ? post.likeCount - 1 : post.likeCount + 1
337
+ });
338
+ }
339
+ break;
340
+ case 'reply':
341
+ await this.openPost(postId, true);
342
+ break;
343
+ }
344
+ }
345
+ }
346
+ }
347
+
@@ -0,0 +1,12 @@
1
+ export * from './community.page';
2
+ export * from './handbook.page';
3
+ export * from './home.page';
4
+ export * from './inquiries.example';
5
+ export * from './inquiry-detail.example';
6
+ export * from './mobile-tabs-example.component';
7
+ export * from './booking.page';
8
+ export * from './post-create.page';
9
+ export * from './post-detail.page';
10
+ export * from './sign-in.page';
11
+ export * from './whitelabel-demo-modal.component';
12
+ export * from './whitelabel-demo-modal.service';