poohr преди 3 седмици
родител
ревизия
5dd9aec539

+ 2
- 0
src/app/models/danka.ts Целия файл

@@ -2,7 +2,9 @@
2 2
 export interface Danka {
3 3
   id: string;
4 4
   householdName: string;
5
+  householdFurigana: string;
5 6
   householder: string;
7
+  householderFurigana: string;
6 8
   postalCode: string;
7 9
   address: string;
8 10
   phones: Phone[];

+ 68
- 38
src/app/pages/danka-detail/danka-detail.html Целия файл

@@ -65,11 +65,20 @@
65 65
             <button
66 66
               type="button"
67 67
               class="add-button"
68
-              [routerLink]="['/kakocho-edit', danka.id]"
68
+              [routerLink]="['/danka', danka.id, 'kakocho-new']"
69 69
             >
70 70
               故人を登録
71 71
             </button>
72 72
           }
73
+
74
+          @if (selectedTab === 'family') {
75
+            <a
76
+              class="family-page-add-button"
77
+              [routerLink]="['/danka', danka.id, 'family-new']"
78
+            >
79
+              家族を追加
80
+            </a>
81
+          }
73 82
         </div>
74 83
 
75 84
         @if (selectedTab === 'basic' || selectedTab === 'kakocho') {
@@ -97,41 +106,59 @@
97 106
               </div>
98 107
 
99 108
               <div class="info-form">
100
-                <div class="info-row">
101
-                  <div class="info-label">世帯名</div>
102
-                  <div class="info-value">{{ danka.householdName }}</div>
103
-                </div>
109
+                <div class="info-pair-row">
110
+                  <div class="info-row">
111
+                    <div class="info-label">檀家名</div>
112
+                    <div class="info-value">{{ danka.householdName }}</div>
113
+                  </div>
104 114
 
105
-                <div class="info-row">
106
-                  <div class="info-label">世帯主</div>
107
-                  <div class="info-value">{{ danka.householder }}</div>
115
+                  <div class="info-row">
116
+                    <div class="info-label">ふりがな</div>
117
+                    <div class="info-value">{{ danka.householdFurigana || '未登録' }}</div>
118
+                  </div>
108 119
                 </div>
109 120
 
110
-                <div class="info-row">
111
-                  <div class="info-label">郵便番号</div>
112
-                  <div class="info-value">{{ danka.postalCode }}</div>
113
-                </div>
121
+                <div class="info-pair-row">
122
+                  <div class="info-row">
123
+                    <div class="info-label">施主名</div>
124
+                    <div class="info-value">{{ danka.householder }}</div>
125
+                  </div>
114 126
 
115
-                <div class="info-row">
116
-                  <div class="info-label">住所</div>
117
-                  <div class="info-value">{{ danka.address }}</div>
127
+                  <div class="info-row">
128
+                    <div class="info-label">ふりがな</div>
129
+                    <div class="info-value">{{ danka.householderFurigana || '未登録' }}</div>
130
+                  </div>
118 131
                 </div>
119 132
 
120
-                <div class="info-row phone-row">
121
-                  <div class="info-label">電話番号</div>
133
+                <div class="info-pair-row">
134
+                  <div class="info-row">
135
+                    <div class="info-label">郵便番号</div>
136
+                    <div class="info-value">{{ danka.postalCode }}</div>
137
+                  </div>
122 138
 
123
-                  <div class="phone-table">
124
-                    <div class="phone-header">
125
-                      <div>番号</div>
126
-                      <div>備考</div>
127
-                    </div>
139
+                  <div class="info-row">
140
+                    <div class="info-label">住所</div>
141
+                    <div class="info-value">{{ danka.address }}</div>
142
+                  </div>
143
+                </div>
144
+
145
+                <div class="info-pair-row">
146
+                  <div class="info-row phone-row">
147
+                    <div class="info-label">電話番号</div>
128 148
 
129
-                    @for (phone of danka.phones; track $index) {
130
-                      <div class="phone-item">
131
-                        <div>{{ phone.tel }}</div>
132
-                        <div>{{ phone.note }}</div>
149
+                    <div class="phone-table">
150
+                      <div class="phone-header">
151
+                        <div>番号</div>
152
+                        <div>備考</div>
133 153
                       </div>
134
-                    }
154
+
155
+                      @for (phone of danka.phones; track $index) {
156
+                        <div class="phone-item">
157
+                          <div>{{ phone.tel }}</div>
158
+                          <div>{{ phone.note }}</div>
159
+                        </div>
160
+                      }
161
+                    </div>
135 162
                   </div>
136 163
                 </div>
137 164
               </div>
@@ -190,19 +217,18 @@
190 217
             </div>
191 218
 
192 219
             <section class="family-list-summary">
193
-              <div>
194
-                <p class="family-list-title">
195
-                  {{ danka.householdName }}の家族 {{ families.length }}名
196
-                </p>
220
+              <div class="family-search-box">
221
+                <span class="family-search-label">家族検索</span>
222
+                <input
223
+                  type="text"
224
+                  [(ngModel)]="familySearchKeyword"
225
+                  placeholder="氏名・ふりがな・続柄・備考で検索"
226
+                />
197 227
               </div>
198
-
199
-              <p class="family-list-head">
200
-                ※ 世帯主:{{ danka.householder }}
201
-              </p>
202 228
             </section>
203 229
 
204 230
             <section class="family-table-section">
205
-              @if (families.length > 0) {
231
+              @if (filteredFamilies.length > 0) {
206 232
                 <div class="family-table">
207 233
                   <div class="family-table-header">
208 234
                     <div>氏名</div>
@@ -214,7 +240,7 @@
214 240
                     <div>操作</div>
215 241
                   </div>
216 242
 
217
-                  @for (family of families; track family.id) {
243
+                  @for (family of filteredFamilies; track family.id) {
218 244
                     <div class="family-table-row">
219 245
                       <div class="family-person-name">
220 246
                         {{ family.name }}
@@ -252,7 +278,11 @@
252 278
                 </div>
253 279
               } @else {
254 280
                 <div class="empty-family-message">
255
-                  登録されている家族情報はありません。
281
+                  @if (families.length > 0) {
282
+                    検索条件に一致する家族情報はありません。
283
+                  } @else {
284
+                    登録されている家族情報はありません。
285
+                  }
256 286
                 </div>
257 287
               }
258 288
             </section>

+ 85
- 29
src/app/pages/danka-detail/danka-detail.scss Целия файл

@@ -86,8 +86,8 @@
86 86
   margin-top: 36px;
87 87
   border: 2px solid #8a6543;
88 88
   border-radius: 6px;
89
-  background: #8a6543;
90
-  color: #ffffff;
89
+  background: #ffffff;
90
+  color: #8a6543;
91 91
   font-size: 18px;
92 92
   font-weight: 800;
93 93
   cursor: pointer;
@@ -95,23 +95,27 @@
95 95
 }
96 96
 
97 97
 .edit-button:hover {
98
-  background: #765639;
98
+  background: #f6efe6;
99 99
 }
100 100
 
101 101
 .family-summary {
102
-  min-height: 82px;
102
+  min-height: 64px;
103 103
   margin-bottom: 28px;
104
-  padding: 14px 26px;
104
+  padding: 12px 22px;
105 105
   border: 2px solid #d8caba;
106 106
   border-radius: 14px;
107 107
   background: #eadfce;
108
-  display: grid;
109
-  grid-template-columns: 1.2fr 1.6fr auto;
108
+  display: flex;
110 109
   align-items: center;
111
-  column-gap: 24px;
112 110
   box-sizing: border-box;
113 111
 }
114 112
 
113
+.family-name-area {
114
+  display: flex;
115
+  align-items: baseline;
116
+  gap: 18px;
117
+}
118
+
115 119
 .family-name {
116 120
   margin: 0;
117 121
   color: #2f2720;
@@ -121,7 +125,7 @@
121 125
 }
122 126
 
123 127
 .family-head {
124
-  margin: 2px 0 0;
128
+  margin: 0;
125 129
   color: #6f6257;
126 130
   font-size: 16px;
127 131
 }
@@ -153,11 +157,11 @@
153 157
   width: 140px;
154 158
   height: 46px;
155 159
   margin-top: 36px;
156
-  border: 2px solid #d8caba;
160
+  border: 2px solid #8a6543;
157 161
   border-radius: 6px;
158 162
   background: #ffffff;
159
-  color: #2f2720;
160
-  font-size: 16px;
163
+  color: #8a6543;
164
+  font-size: 18px;
161 165
   font-weight: 800;
162 166
   cursor: pointer;
163 167
   box-sizing: border-box;
@@ -167,16 +171,37 @@
167 171
   background: #f6efe6;
168 172
 }
169 173
 
174
+.family-page-add-button {
175
+  width: 140px;
176
+  height: 46px;
177
+  margin-top: 36px;
178
+  border: 2px solid #8a6543;
179
+  border-radius: 6px;
180
+  background: #ffffff;
181
+  color: #8a6543;
182
+  font-size: 18px;
183
+  font-weight: 800;
184
+  text-decoration: none;
185
+  display: flex;
186
+  align-items: center;
187
+  justify-content: center;
188
+  box-sizing: border-box;
189
+}
190
+
191
+.family-page-add-button:hover {
192
+  background: #f6efe6;
193
+}
194
+
170 195
 
171 196
 .detail-content {
172 197
   display: grid;
173
-  grid-template-columns: minmax(0, 1fr) 500px;
174
-  gap: 48px;
198
+  grid-template-columns: minmax(0, 1fr) 460px;
199
+  gap: 28px;
175 200
   align-items: start;
176 201
 }
177 202
 
178 203
 .basic-info-section {
179
-  padding-left: 8px;
204
+  padding-left: 0;
180 205
 }
181 206
 
182 207
 .section-heading {
@@ -197,13 +222,24 @@
197 222
 }
198 223
 
199 224
 .info-form {
200
-  width: 650px;
225
+  width: 100%;
226
+}
227
+
228
+.info-pair-row {
229
+  display: grid;
230
+  grid-template-columns: 1fr 1fr;
231
+  gap: 14px;
232
+  margin-top: 10px;
201 233
 }
202 234
 
203 235
 .info-row {
204 236
   display: grid;
205
-  grid-template-columns: 120px 1fr;
237
+  grid-template-columns: 96px 1fr;
206 238
   align-items: center;
239
+  margin-top: 0;
240
+}
241
+
242
+.info-form > .info-row {
207 243
   margin-top: 10px;
208 244
 }
209 245
 
@@ -228,7 +264,6 @@
228 264
 
229 265
 .phone-row {
230 266
   align-items: start;
231
-  margin-top: 18px;
232 267
 }
233 268
 
234 269
 .phone-row .info-label {
@@ -242,7 +277,7 @@
242 277
 .phone-header,
243 278
 .phone-item {
244 279
   display: grid;
245
-  grid-template-columns: 1fr 1.4fr 1.2fr;
280
+  grid-template-columns: 1fr 1fr;
246 281
   align-items: center;
247 282
 }
248 283
 
@@ -272,7 +307,7 @@
272 307
 
273 308
 .status-panel {
274 309
   min-height: 382px;
275
-  padding: 30px 24px 22px;
310
+  padding: 24px 22px 22px;
276 311
   border: 2px solid #d8caba;
277 312
   border-radius: 62px;
278 313
   background: #fffdf9;
@@ -421,23 +456,39 @@
421 456
   justify-content: space-between;
422 457
   align-items: center;
423 458
   gap: 16px;
424
-  padding: 16px 20px;
459
+  padding: 14px 18px;
425 460
   margin-bottom: 20px;
426 461
   background: #efe4d6;
427 462
   border: 2px solid #d8c2aa;
428 463
   border-radius: 12px;
429 464
 }
430 465
 
431
-.family-list-title {
432
-  margin: 0;
433
-  font-size: 20px;
434
-  font-weight: 700;
466
+.family-search-box {
467
+  flex: 1;
468
+  min-width: 0;
469
+  display: grid;
470
+  grid-template-columns: 96px minmax(0, 1fr);
471
+  gap: 12px;
472
+  align-items: center;
435 473
 }
436 474
 
437
-.family-list-head {
438
-  margin: 0;
439
-  font-size: 14px;
440
-  color: #6f6256;
475
+.family-search-label {
476
+  color: #4b3c31;
477
+  font-size: 16px;
478
+  font-weight: 800;
479
+}
480
+
481
+.family-search-box input {
482
+  width: 100%;
483
+  height: 42px;
484
+  padding: 0 14px;
485
+  border: 2px solid #d8c2aa;
486
+  border-radius: 8px;
487
+  background: #fffdf9;
488
+  color: #2f2720;
489
+  font-size: 15px;
490
+  font-weight: 700;
491
+  box-sizing: border-box;
441 492
 }
442 493
 
443 494
 .family-table-section {
@@ -1023,6 +1074,11 @@
1023 1074
     flex-direction: column;
1024 1075
   }
1025 1076
 
1077
+  .family-search-box {
1078
+    width: 100%;
1079
+    grid-template-columns: 1fr;
1080
+  }
1081
+
1026 1082
   .family-table {
1027 1083
     overflow-x: auto;
1028 1084
   }

+ 20
- 1
src/app/pages/danka-detail/danka-detail.ts Целия файл

@@ -10,6 +10,7 @@ import { MarriageRelation } from '../../models/marriage-relation';
10 10
 import { AppHeader } from '../../share/header/app-header';
11 11
 import { AppSideMenu } from '../../share/side-menu/app-side-menu';
12 12
 import { MarriageRelationService } from '../../services/marriage-relation-service';
13
+import { FormsModule } from '@angular/forms';
13 14
 
14 15
 interface NextMemorial {
15 16
   name: string;
@@ -20,7 +21,7 @@ interface NextMemorial {
20 21
 
21 22
 @Component({
22 23
   selector: 'app-danka-detail',
23
-  imports: [AppHeader, AppSideMenu, RouterLink],
24
+  imports: [AppHeader, AppSideMenu, RouterLink, FormsModule],
24 25
   templateUrl: './danka-detail.html',
25 26
   styleUrl: './danka-detail.scss',
26 27
 })
@@ -31,6 +32,7 @@ export class DankaDetail {
31 32
   marriageRelations: MarriageRelation[] = [];
32 33
   nextMemorial: NextMemorial | undefined;
33 34
   currentYear = new Date().getFullYear();
35
+  familySearchKeyword = '';
34 36
 
35 37
   selectedTab: 'basic' | 'family' | 'kakocho' | 'familyTree' = 'basic';
36 38
   selectedFamily: Family | undefined = undefined;
@@ -80,6 +82,23 @@ export class DankaDetail {
80 82
     return age.toString();
81 83
   }
82 84
 
85
+  get filteredFamilies(): Family[] {
86
+    const keyword = this.familySearchKeyword.trim();
87
+    if (!keyword) {
88
+      return this.families;
89
+    }
90
+
91
+    return this.families.filter((family) =>
92
+      [
93
+        family.name,
94
+        family.furigana,
95
+        family.birthDate,
96
+        family.relationship,
97
+        family.note,
98
+      ].some((value) => value.includes(keyword)),
99
+    );
100
+  }
101
+
83 102
   getKaiki(deathDate: string): number {
84 103
     return this.currentYear - new Date(deathDate).getFullYear() + 1;
85 104
   }

+ 1
- 1
src/app/pages/danka-edit/danka-edit.scss Целия файл

@@ -93,7 +93,7 @@
93 93
 
94 94
 .form-row {
95 95
   display: grid;
96
-  grid-template-columns: 120px 1fr;
96
+  grid-template-columns: 160px 1fr;
97 97
   align-items: center;
98 98
   gap: 16px;
99 99
   margin-bottom: 14px;

+ 6
- 0
src/app/pages/danka-edit/danka-edit.ts Целия файл

@@ -24,7 +24,9 @@ export class DankaEdit {
24 24
 
25 25
   dankaForm = new FormGroup({
26 26
     householdName: new FormControl('', [Validators.required]),
27
+    householdFurigana: new FormControl(''),
27 28
     householder: new FormControl('', [Validators.required]),
29
+    householderFurigana: new FormControl(''),
28 30
     postalCode: new FormControl('', Validators.pattern(/^\d{3}-\d{4}$/)),
29 31
     address: new FormControl(''),
30 32
     phones: new FormArray([this.createPhoneForm('', '')]),
@@ -42,7 +44,9 @@ export class DankaEdit {
42 44
       if (this.danka) {
43 45
         this.dankaForm.patchValue({
44 46
           householdName: this.danka.householdName,
47
+          householdFurigana: this.danka.householdFurigana,
45 48
           householder: this.danka.householder,
49
+          householderFurigana: this.danka.householderFurigana,
46 50
           postalCode: this.danka.postalCode,
47 51
           address: this.danka.address,
48 52
         });
@@ -90,7 +94,9 @@ export class DankaEdit {
90 94
     const updatedDanka: Danka = {
91 95
       id: dankaId,
92 96
       householdName: formValue.householdName?.trim() ?? '',
97
+      householdFurigana: formValue.householdFurigana?.trim() ?? '',
93 98
       householder: formValue.householder?.trim() ?? '',
99
+      householderFurigana: formValue.householderFurigana?.trim() ?? '',
94 100
       postalCode: formValue.postalCode?.trim() ?? '',
95 101
       address: formValue.address?.trim() ?? '',
96 102
       updatedAt: this.formatDateForSave(new Date()),

+ 2
- 0
src/app/pages/danka-list/danka-list.scss Целия файл

@@ -177,7 +177,9 @@
177 177
   display: grid;
178 178
   grid-template-columns: 1.5fr 1.1fr 2.8fr 1.25fr 0.65fr;
179 179
   align-items: center;
180
+  justify-items: start;
180 181
   column-gap: 16px;
182
+  text-align: left;
181 183
 }
182 184
 
183 185
 .danka-table-header {

+ 2
- 0
src/app/pages/danka-list/danka-list.ts Целия файл

@@ -105,7 +105,9 @@ export class DankaList {
105 105
     this.filterDankaList = this.dankaList.filter((danka) => {
106 106
       return (
107 107
         danka.householdName.includes(keyword) ||
108
+        danka.householdFurigana.includes(keyword) ||
108 109
         danka.householder.includes(keyword) ||
110
+        danka.householderFurigana.includes(keyword) ||
109 111
         danka.postalCode.includes(keyword) ||
110 112
         danka.address.includes(keyword) ||
111 113
         danka.phones.some((phone) => phone.tel.includes(keyword) || phone.note.includes(keyword))

+ 4
- 4
src/app/pages/family-edit/family-edit.html Целия файл

@@ -7,7 +7,7 @@
7 7
   <main class="danka-edit-main">
8 8
     <section class="edit-panel">
9 9
       <div class="page-title-area">
10
-        <h1>家族(個人)編集</h1>
10
+        <h1>{{ familyId ? '家族編集' : '家族追加' }}</h1>
11 11
       </div>
12 12
 
13 13
       <form [formGroup]="familyForm" class="edit-form">
@@ -44,7 +44,7 @@
44 44
                   <select id="relationship"
45 45
                           formControlName="relationship">
46 46
                     <option value="">選択してください</option>
47
-                    <option value="世帯主">世帯主</option>
47
+                    <option value="施主">施主</option>
48 48
                     <option value="配偶者">配偶者</option>
49 49
                     <option value="父">父</option>
50 50
                     <option value="母">母</option>
@@ -170,12 +170,12 @@
170 170
 
171 171
           <section class="phone-edit-section">
172 172
             <div class="householder-area">
173
-              <h3>この方を世帯主にする</h3>
173
+              <h3>この方を主にする</h3>
174 174
 
175 175
               <button type="button"
176 176
                       class="set-householder-button"
177 177
                       (click)="setAsHouseholder()">
178
-                世帯主に設定
178
+                主に設定
179 179
               </button>
180 180
             </div>
181 181
           </section>

+ 6
- 2
src/app/services/dankaService.ts Целия файл

@@ -9,7 +9,9 @@ export class DankaService {
9 9
     {
10 10
       id: '1',
11 11
       householdName: '鈴木家',
12
+      householdFurigana: 'すずきけ',
12 13
       householder: '鈴木 太郎',
14
+      householderFurigana: 'すずき たろう',
13 15
       postalCode: '123-4567',
14 16
       address: '市内 1-2-3',
15 17
       updatedAt: '2026-05-28',
@@ -20,14 +22,16 @@ export class DankaService {
20 22
         },
21 23
         {
22 24
           tel: '090-1234-5678',
23
-          note: '世帯主',
25
+          note: '主',
24 26
         },
25 27
       ],
26 28
     },
27 29
     {
28 30
       id: '2',
29 31
       householdName: '古田家',
32
+      householdFurigana: 'ふるたけ',
30 33
       householder: '古田 太郎',
34
+      householderFurigana: 'ふるた たろう',
31 35
       postalCode: '234-4567',
32 36
       address: '市内 1-2-3',
33 37
       updatedAt: '2026-05-28',
@@ -38,7 +42,7 @@ export class DankaService {
38 42
         },
39 43
         {
40 44
           tel: '080-7890-4567',
41
-          note: '世帯主',
45
+          note: '主',
42 46
         },
43 47
       ],
44 48
     }

+ 1
- 1
src/app/services/family-service.ts Целия файл

@@ -13,7 +13,7 @@ export class FamilyService {
13 13
       name: '鈴木 花子',
14 14
       relationship: '母',
15 15
       birthDate: '1975-01-01',
16
-      note: '次の世帯主',
16
+      note: '次の主',
17 17
       fatherId: '5',
18 18
       motherId: '6',
19 19
       spouseId: '3',

Loading…
Отказ
Запис