Просмотр исходного кода

[wip]

家族情報ページの開発
poohr 3 недель назад
Родитель
Сommit
157e5174aa

+ 1
- 0
src/app/models/family.ts Просмотреть файл

@@ -2,6 +2,7 @@
2 2
 export interface Family {
3 3
   id: string;
4 4
   dankaId: string;
5
+  furigana: string;
5 6
   name: string;
6 7
   relationship: string;
7 8
   birthDate: string;

+ 260
- 88
src/app/pages/danka-detail/danka-detail.html Просмотреть файл

@@ -1,7 +1,7 @@
1 1
 <app-header></app-header>
2 2
 
3 3
 <div class="breadcrumb">
4
-  ホーム &gt; 檀家(世帯) &gt; 鈴木家
4
+  ホーム &gt; 檀家(世帯) &gt; {{ danka?.householdName }}
5 5
 </div>
6 6
 
7 7
 <div class="danka-detail-page">
@@ -9,117 +9,289 @@
9 9
 
10 10
   <main class="danka-detail-main">
11 11
     <section class="detail-panel">
12
-      <div class="page-title-row">
13
-        <div>
14
-          <h1>檀家(世帯)詳細 - 基本情報</h1>
15
-
16
-          <nav class="tab-list">
17
-            <a href="#" class="tab-button active">基本情報</a>
18
-            <a href="#" class="tab-button">家族</a>
19
-            <a href="#" class="tab-button">過去帳</a>
20
-            <a href="#" class="tab-button">家系図</a>
21
-          </nav>
22
-        </div>
12
+      @if (danka) {
13
+        <div class="page-title-row">
14
+          <div>
15
+            <h1>
16
+              檀家(世帯)詳細 -
17
+              @if (selectedTab === 'basic') {
18
+                基本情報
19
+              }
20
+              @if (selectedTab === 'family') {
21
+                家族
22
+              }
23
+              @if (selectedTab === 'kakocho') {
24
+                過去帳
25
+              }
26
+              @if (selectedTab === 'familyTree') {
27
+                家系図
28
+              }
29
+            </h1>
23 30
 
24
-        <button type="button" class="edit-button" [routerLink]="['/danka-edit', danka?.id]">
25
-          編集
26
-        </button>
27
-      </div>
31
+            <nav class="tab-list">
32
+              <button
33
+                type="button"
34
+                class="tab-button"
35
+                [class.active]="selectedTab === 'basic'"
36
+                (click)="selectedTab = 'basic'"
37
+              >
38
+                基本情報
39
+              </button>
28 40
 
29
-      <section class="family-summary">
30
-        <div class="family-name-area">
31
-          <p class="family-name">{{ danka?.householdName }}</p>
32
-          <p class="family-head">世帯主: {{ danka?.householder }}</p>
33
-        </div>
41
+              <button
42
+                type="button"
43
+                class="tab-button"
44
+                [class.active]="selectedTab === 'family'"
45
+                (click)="selectedTab = 'family'"
46
+              >
47
+                家族
48
+              </button>
34 49
 
35
-        <div class="family-address">
36
-          <p>郵便番号 〒{{ danka?.postalCode }}</p>
37
-          <p>住所 {{ danka?.address }}</p>
50
+              <button
51
+                type="button"
52
+                class="tab-button"
53
+                [class.active]="selectedTab === 'kakocho'"
54
+                (click)="selectedTab = 'kakocho'"
55
+              >
56
+                過去帳
57
+              </button>
58
+
59
+              <button
60
+                type="button"
61
+                class="tab-button"
62
+                [class.active]="selectedTab === 'familyTree'"
63
+                (click)="selectedTab = 'familyTree'"
64
+              >
65
+                家系図
66
+              </button>
67
+            </nav>
68
+          </div>
69
+
70
+          <button
71
+            type="button"
72
+            class="edit-button"
73
+            [routerLink]="['/danka-edit', danka.id]"
74
+          >
75
+            編集
76
+          </button>
38 77
         </div>
39 78
 
40
-        <button type="button" class="memo-button">
41
-          回忌を見る
42
-        </button>
43
-      </section>
79
+        <section class="family-summary">
80
+          <div class="family-name-area">
81
+            <p class="family-name">{{ danka.householdName }}</p>
82
+            <p class="family-head">世帯主: {{ danka.householder }}</p>
83
+          </div>
44 84
 
45
-      <div class="detail-content">
46
-        <section class="basic-info-section">
47
-          <div class="section-heading">
48
-            <h2>基本情報</h2>
85
+          <div class="family-address">
86
+            <p>郵便番号 〒{{ danka.postalCode }}</p>
87
+            <p>住所 {{ danka.address }}</p>
49 88
           </div>
50 89
 
51
-          <div class="info-form">
52
-            <div class="info-row">
53
-              <div class="info-label">世帯主</div>
54
-              <div class="info-value">{{ danka?.householdName }}</div>
55
-            </div>
90
+          <button type="button" class="memo-button">
91
+            回忌を見る
92
+          </button>
93
+        </section>
56 94
 
57
-            <div class="info-row">
58
-              <div class="info-label">郵便番号</div>
59
-              <div class="info-value">{{ danka?.postalCode }}</div>
60
-            </div>
95
+        @if (selectedTab === 'basic') {
96
+          <div class="detail-content">
97
+            <section class="basic-info-section">
98
+              <div class="section-heading">
99
+                <h2>基本情報</h2>
100
+              </div>
61 101
 
62
-            <div class="info-row">
63
-              <div class="info-label">住所</div>
64
-              <div class="info-value">{{ danka?.address }}</div>
65
-            </div>
102
+              <div class="info-form">
103
+                <div class="info-row">
104
+                  <div class="info-label">世帯名</div>
105
+                  <div class="info-value">{{ danka.householdName }}</div>
106
+                </div>
107
+
108
+                <div class="info-row">
109
+                  <div class="info-label">世帯主</div>
110
+                  <div class="info-value">{{ danka.householder }}</div>
111
+                </div>
66 112
 
67
-            <div class="info-row phone-row">
68
-              <div class="info-label">電話番号</div>
113
+                <div class="info-row">
114
+                  <div class="info-label">郵便番号</div>
115
+                  <div class="info-value">{{ danka.postalCode }}</div>
116
+                </div>
69 117
 
70
-              <div class="phone-table">
71
-                <div class="phone-header">
72
-                  <div>番号</div>
73
-                  <div>備考</div>
118
+                <div class="info-row">
119
+                  <div class="info-label">住所</div>
120
+                  <div class="info-value">{{ danka.address }}</div>
74 121
                 </div>
75 122
 
76
-                @if (danka) {
77
-                  @for (phone of danka.phones; track $index) {
78
-                    <div class="phone-item">
79
-                      <div>{{ phone.tel }}</div>
80
-                      <div>{{ phone.note }}</div>
123
+                <div class="info-row phone-row">
124
+                  <div class="info-label">電話番号</div>
125
+
126
+                  <div class="phone-table">
127
+                    <div class="phone-header">
128
+                      <div>番号</div>
129
+                      <div>備考</div>
81 130
                     </div>
82
-                  }
83
-                }
84 131
 
132
+                    @for (phone of danka.phones; track $index) {
133
+                      <div class="phone-item">
134
+                        <div>{{ phone.tel }}</div>
135
+                        <div>{{ phone.note }}</div>
136
+                      </div>
137
+                    }
138
+                  </div>
139
+                </div>
85 140
               </div>
86
-            </div>
87
-          </div>
88
-        </section>
141
+            </section>
142
+
143
+            <aside class="status-panel">
144
+              <h2>この世帯の状況</h2>
145
+
146
+              <div class="status-card-list">
147
+                <button
148
+                  type="button"
149
+                  class="status-card"
150
+                  (click)="selectedTab = 'family'"
151
+                >
152
+                  <p class="status-label">家族</p>
153
+                  <p class="status-count">{{ families.length }} 名</p>
154
+                  <p class="status-link">詳細へ</p>
155
+                </button>
156
+
157
+                <button
158
+                  type="button"
159
+                  class="status-card"
160
+                  (click)="selectedTab = 'kakocho'"
161
+                >
162
+                  <p class="status-label">過去帳</p>
163
+                  <p class="status-count">2 名</p>
164
+                  <p class="status-link">詳細へ</p>
165
+                </button>
166
+              </div>
167
+
168
+              <section class="next-memorial">
169
+                <h3>次の法要</h3>
89 170
 
90
-        <aside class="status-panel">
91
-          <h2>この世帯の状況</h2>
92
-
93
-          <div class="status-card-list">
94
-            <a href="#" class="status-card">
95
-              <p class="status-label">家族</p>
96
-              <p class="status-count">4 名</p>
97
-              <p class="status-link">詳細へ</p>
98
-            </a>
99
-
100
-            <a href="#" class="status-card">
101
-              <p class="status-label">過去帳</p>
102
-              <p class="status-count">2 名</p>
103
-              <p class="status-link">詳細へ</p>
104
-            </a>
171
+                <div class="memorial-card">
172
+                  <p class="memorial-title">佐藤 ハナ - 三回忌</p>
173
+                  <p class="memorial-text">
174
+                    対象年 2026 / 没年月日 2024-01-08
175
+                  </p>
176
+                </div>
177
+              </section>
178
+
179
+              <div class="status-button-list">
180
+                <button
181
+                  type="button"
182
+                  class="status-button"
183
+                  (click)="selectedTab = 'family'"
184
+                >
185
+                  家族を見る
186
+                </button>
187
+
188
+                <button
189
+                  type="button"
190
+                  class="status-button"
191
+                  (click)="selectedTab = 'kakocho'"
192
+                >
193
+                  過去帳を見る
194
+                </button>
195
+              </div>
196
+            </aside>
105 197
           </div>
198
+        }
199
+
200
+        @if (selectedTab === 'family') {
201
+          <section class="family-tab-content">
202
+            <div class="section-heading">
203
+              <h2>家族情報</h2>
204
+            </div>
205
+
206
+            <section class="family-list-summary">
207
+              <div>
208
+                <p class="family-list-title">
209
+                  {{ danka.householdName }}の家族 {{ families.length }}名
210
+                </p>
211
+              </div>
212
+
213
+              <p class="family-list-head">
214
+                ※ 世帯主:{{ danka.householder }}
215
+              </p>
216
+            </section>
217
+
218
+            <section class="family-table-section">
219
+              @if (families.length > 0) {
220
+                <div class="family-table">
221
+                  <div class="family-table-header">
222
+                    <div>氏名</div>
223
+                    <div>ふりがな</div>
224
+                    <div>関係</div>
225
+                    <div>年齢</div>
226
+                    <div>生年月日</div>
227
+                    <div>備考</div>
228
+                  </div>
229
+
230
+                  @for (family of families; track family.id) {
231
+                    <div class="family-table-row">
232
+                      <div class="family-person-name">
233
+                        {{ family.name }}
234
+                      </div>
235
+
236
+                      <div>
237
+                        {{ family.furigana }}
238
+                      </div>
239
+
240
+                      <div>
241
+                        {{ family.relationship || '未登録' }}
242
+                      </div>
106 243
 
107
-          <section class="next-memorial">
108
-            <h3>次の法要</h3>
244
+                      <div>
245
+                        -
246
+                      </div>
109 247
 
110
-            <div class="memorial-card">
111
-              <p class="memorial-title">佐藤 ハナ - 三回忌</p>
112
-              <p class="memorial-text">対象年 2026 / 没年月日 2024-01-08</p>
248
+                      <div>
249
+                        {{ family.birthDate || '未登録' }}
250
+                      </div>
251
+
252
+                      <div>
253
+                        {{ family.note || '' }}
254
+                      </div>
255
+                    </div>
256
+                  }
257
+                </div>
258
+              } @else {
259
+                <div class="empty-family-message">
260
+                  登録されている家族情報はありません。
261
+                </div>
262
+              }
263
+            </section>
264
+          </section>
265
+        }
266
+
267
+        @if (selectedTab === 'kakocho') {
268
+          <section class="coming-soon-section">
269
+            <div class="section-heading">
270
+              <h2>過去帳</h2>
113 271
             </div>
272
+
273
+            <p class="empty-family-message">
274
+              過去帳情報はこれから実装します。
275
+            </p>
114 276
           </section>
277
+        }
115 278
 
116
-          <div class="status-button-list">
117
-            <a href="#" class="status-button">家族を見る</a>
118
-            <a href="#" class="status-button">過去帳を見る</a>
119
-          </div>
120
-        </aside>
121
-      </div>
279
+        @if (selectedTab === 'familyTree') {
280
+          <section class="coming-soon-section">
281
+            <div class="section-heading">
282
+              <h2>家系図</h2>
283
+            </div>
284
+
285
+            <p class="empty-family-message">
286
+              家系図はこれから実装します。
287
+            </p>
288
+          </section>
289
+        }
290
+      } @else {
291
+        <p class="empty-family-message">
292
+          檀家情報が見つかりませんでした。
293
+        </p>
294
+      }
122 295
     </section>
123 296
   </main>
124 297
 </div>
125
-

+ 153
- 0
src/app/pages/danka-detail/danka-detail.scss Просмотреть файл

@@ -388,3 +388,156 @@
388 388
   font-size: 14px;
389 389
   box-sizing: border-box;
390 390
 }
391
+
392
+/* =========================
393
+   家族タブ
394
+========================= */
395
+
396
+.family-tab-content {
397
+  margin-top: 24px;
398
+}
399
+
400
+.family-tab-content .section-heading {
401
+  margin-bottom: 16px;
402
+
403
+  h2 {
404
+    margin: 0;
405
+    font-size: 20px;
406
+    font-weight: 700;
407
+  }
408
+}
409
+
410
+.family-list-summary {
411
+  display: flex;
412
+  justify-content: space-between;
413
+  align-items: center;
414
+  gap: 16px;
415
+  padding: 16px 20px;
416
+  margin-bottom: 20px;
417
+  background: #efe4d6;
418
+  border: 2px solid #d8c2aa;
419
+  border-radius: 12px;
420
+}
421
+
422
+.family-list-title {
423
+  margin: 0;
424
+  font-size: 20px;
425
+  font-weight: 700;
426
+}
427
+
428
+.family-list-head {
429
+  margin: 0;
430
+  font-size: 14px;
431
+  color: #6f6256;
432
+}
433
+
434
+.family-table-section {
435
+  margin-top: 16px;
436
+}
437
+
438
+.family-table {
439
+  display: grid;
440
+  gap: 8px;
441
+}
442
+
443
+.family-table-header,
444
+.family-table-row {
445
+  display: grid;
446
+  grid-template-columns: 1.2fr 1.2fr 0.8fr 0.6fr 1fr 1.4fr;
447
+  gap: 10px;
448
+  align-items: center;
449
+}
450
+
451
+.family-table-header {
452
+  padding: 12px 14px;
453
+  background: #efe4d6;
454
+  border: 2px solid #d8c2aa;
455
+  border-radius: 10px;
456
+  font-size: 14px;
457
+  font-weight: 700;
458
+  color: #5d3b24;
459
+}
460
+
461
+.family-table-row {
462
+  min-height: 56px;
463
+  padding: 12px 14px;
464
+  background: #fffaf3;
465
+  border: 2px solid #d8c2aa;
466
+  border-radius: 10px;
467
+  font-size: 15px;
468
+  color: #2f2923;
469
+}
470
+
471
+.family-table-row:hover {
472
+  background: #fff4e8;
473
+}
474
+
475
+/* 既存の .family-name と名前がかぶるので、家族表の中だけに効かせる */
476
+.family-table-row .family-person-name {
477
+  margin: 0;
478
+  font-size: 15px;
479
+  font-weight: 700;
480
+  color: #5d3b24;
481
+}
482
+
483
+.empty-family-message {
484
+  padding: 20px;
485
+  background: #fffaf3;
486
+  border: 2px solid #d8c2aa;
487
+  border-radius: 12px;
488
+  color: #6f6256;
489
+  font-weight: 700;
490
+}
491
+
492
+.family-support-area {
493
+  display: grid;
494
+  grid-template-columns: 1fr 1fr;
495
+  gap: 18px;
496
+  margin-top: 24px;
497
+}
498
+
499
+.support-card {
500
+  padding: 18px 20px;
501
+  background: #fffaf3;
502
+  border: 2px solid #d8c2aa;
503
+  border-radius: 14px;
504
+
505
+  h2 {
506
+    margin: 0 0 8px;
507
+    font-size: 17px;
508
+    font-weight: 700;
509
+    color: #5d3b24;
510
+  }
511
+
512
+  p {
513
+    margin: 0;
514
+    font-size: 14px;
515
+    color: #6f6256;
516
+    line-height: 1.7;
517
+  }
518
+}
519
+
520
+.coming-soon-section {
521
+  margin-top: 24px;
522
+}
523
+
524
+/* 家族表が狭い画面では横スクロール */
525
+@media (max-width: 800px) {
526
+  .family-list-summary {
527
+    align-items: flex-start;
528
+    flex-direction: column;
529
+  }
530
+
531
+  .family-table {
532
+    overflow-x: auto;
533
+  }
534
+
535
+  .family-table-header,
536
+  .family-table-row {
537
+    min-width: 760px;
538
+  }
539
+
540
+  .family-support-area {
541
+    grid-template-columns: 1fr;
542
+  }
543
+}

+ 8
- 0
src/app/pages/danka-detail/danka-detail.ts Просмотреть файл

@@ -1,7 +1,9 @@
1 1
 import { Component } from '@angular/core';
2 2
 import { ActivatedRoute, RouterLink } from '@angular/router';
3 3
 import { DankaService } from '../../services/dankaService';
4
+import { FamilyService } from '../../services/family-service';
4 5
 import { Danka } from '../../models/danka';
6
+import { Family } from '../../models/family';
5 7
 import { AppHeader } from '../../share/header/app-header';
6 8
 import { AppSideMenu } from '../../share/side-menu/app-side-menu';
7 9
 
@@ -13,15 +15,21 @@ import { AppSideMenu } from '../../share/side-menu/app-side-menu';
13 15
 })
14 16
 export class DankaDetail {
15 17
   danka: Danka | undefined;
18
+  families: Family[] = [];
19
+
20
+  selectedTab: 'basic' | 'family' | 'kakocho' | 'familyTree' = 'basic';
16 21
 
17 22
   constructor(
18 23
     private dankaService: DankaService,
24
+    private familyService: FamilyService,
19 25
     private route: ActivatedRoute,
20 26
   ) {
21 27
     const id = this.route.snapshot.params['id'];
22 28
     if (id) {
23 29
       this.danka = this.dankaService.getDankaById(id);
30
+      this.families = this.familyService.getFamiliesByDankaId(id);
24 31
     }
25 32
     console.log(this.danka);
33
+    console.log(this.families);
26 34
   }
27 35
 }

+ 2
- 0
src/app/services/family-service.ts Просмотреть файл

@@ -9,6 +9,7 @@ export class FamilyService {
9 9
     {
10 10
       id: '1',
11 11
       dankaId: '1',
12
+      furigana: 'すずき はなこ',
12 13
       name: '鈴木 花子',
13 14
       relationship: '母',
14 15
       birthDate: '1975-01-01',
@@ -17,6 +18,7 @@ export class FamilyService {
17 18
     {
18 19
       id: '2',
19 20
       dankaId: '1',
21
+      furigana: 'すずき たろう',
20 22
       name: '鈴木 太郎',
21 23
       relationship: '長男',
22 24
       birthDate: '2005-12-31',

Загрузка…
Отмена
Сохранить