4 Commits

Autor SHA1 Nachricht Datum
  poohr 79ef9279d8 [add] vor 3 Wochen
  poohr 2c5ae879e4 [add] vor 3 Wochen
  poohr 1c4debc98a [add] vor 3 Wochen
  poohr aefb802b21 [update] vor 3 Wochen

+ 1
- 0
src/app/models/danka.ts Datei anzeigen

@@ -6,6 +6,7 @@ export interface Danka {
6 6
   postalCode: string;
7 7
   address: string;
8 8
   phones: Phone[];
9
+  updatedAt: string;
9 10
 }
10 11
 
11 12
 export interface Phone {

+ 25
- 72
src/app/pages/danka-detail/danka-detail.html Datei anzeigen

@@ -1,8 +1,5 @@
1 1
 <app-header></app-header>
2 2
 
3
-<div class="breadcrumb">
4
-  ホーム &gt; 檀家(世帯) &gt; {{ danka?.householdName }}
5
-</div>
6 3
 
7 4
 <div class="danka-detail-page">
8 5
   <app-side-menu></app-side-menu>
@@ -13,19 +10,7 @@
13 10
         <div class="page-title-row">
14 11
           <div>
15 12
             <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
-              }
13
+              檀家詳細 - {{ danka.householdName }}
29 14
             </h1>
30 15
 
31 16
             <nav class="tab-list">
@@ -84,14 +69,6 @@
84 69
             >
85 70
               故人を登録
86 71
             </button>
87
-
88
-            <button
89
-              type="button"
90
-              class="edit-button"
91
-              [routerLink]="['/kakocho-edit', danka.id, kakocholist[0].id]"
92
-            >
93
-              編集
94
-            </button>
95 72
           }
96 73
         </div>
97 74
 
@@ -100,27 +77,14 @@
100 77
             @if (selectedTab === 'basic') {
101 78
               <div class="family-name-area">
102 79
                 <p class="family-name">{{ danka.householdName }}</p>
103
-                <p class="family-head">世帯主: {{ danka.householder }}</p>
80
+                <p class="family-head">更新日: {{ formatUpdatedAt(danka.updatedAt) }}</p>
104 81
               </div>
105
-
106
-              <div class="family-address">
107
-                <p>郵便番号 〒{{ danka.postalCode }}</p>
108
-                <p>住所 {{ danka.address }}</p>
109
-              </div>
110
-
111
-              <button type="button" class="memo-button">
112
-                回忌を見る
113
-              </button>
114 82
             }
115 83
 
116 84
             @if (selectedTab === 'kakocho') {
117 85
               <div class="family-name-area">
118 86
                 <p class="family-name">{{ danka.householdName }}の過去帳{{ kakocholist.length }} 名</p>
119 87
               </div>
120
-
121
-              <button type="button" class="memo-button">
122
-                年次法要を見る
123
-              </button>
124 88
             }
125 89
           </section>
126 90
         }
@@ -180,8 +144,7 @@
180 144
                 <button
181 145
                   type="button"
182 146
                   class="status-card"
183
-                  (click)="selectedTab = 'family'"
184
-                >
147
+                  (click)="selectedTab = 'family'">
185 148
                   <p class="status-label">家族</p>
186 149
                   <p class="status-count">{{ families.length }} 名</p>
187 150
                   <p class="status-link">詳細へ</p>
@@ -190,8 +153,7 @@
190 153
                 <button
191 154
                   type="button"
192 155
                   class="status-card"
193
-                  (click)="selectedTab = 'kakocho'"
194
-                >
156
+                  (click)="selectedTab = 'kakocho'">
195 157
                   <p class="status-label">過去帳</p>
196 158
                   <p class="status-count">{{ kakocholist.length }}  名</p>
197 159
                   <p class="status-link">詳細へ</p>
@@ -202,30 +164,21 @@
202 164
                 <h3>次の法要</h3>
203 165
 
204 166
                 <div class="memorial-card">
205
-                  <p class="memorial-title">佐藤 ハナ - 三回忌</p>
206
-                  <p class="memorial-text">
207
-                    対象年 2026 / 没年月日 2024-01-08
208
-                  </p>
167
+                  @if (nextMemorial) {
168
+                    <p class="memorial-title">
169
+                      {{ nextMemorial.name }} - {{ nextMemorial.memorialType }}
170
+                    </p>
171
+                    <p class="memorial-text">
172
+                      対象年 {{ nextMemorial.targetYear }} / 没年月日 {{ nextMemorial.deathDate }}
173
+                    </p>
174
+                  } @else {
175
+                    <p class="memorial-title">対象の法要はありません</p>
176
+                    <p class="memorial-text">
177
+                      今年の年忌法要対象者がいる場合に表示されます。
178
+                    </p>
179
+                  }
209 180
                 </div>
210 181
               </section>
211
-
212
-              <div class="status-button-list">
213
-                <button
214
-                  type="button"
215
-                  class="status-button"
216
-                  (click)="selectedTab = 'family'"
217
-                >
218
-                  家族を見る
219
-                </button>
220
-
221
-                <button
222
-                  type="button"
223
-                  class="status-button"
224
-                  (click)="selectedTab = 'kakocho'"
225
-                >
226
-                  過去帳を見る
227
-                </button>
228
-              </div>
229 182
             </aside>
230 183
           </div>
231 184
         }
@@ -254,9 +207,9 @@
254 207
                   <div class="family-table-header">
255 208
                     <div>氏名</div>
256 209
                     <div>ふりがな</div>
257
-                    <div>関係</div>
258
-                    <div>年齢</div>
259 210
                     <div>生年月日</div>
211
+                    <div>年齢</div>
212
+                    <div>続柄</div>
260 213
                     <div>備考</div>
261 214
                     <div>操作</div>
262 215
                   </div>
@@ -272,7 +225,7 @@
272 225
                       </div>
273 226
 
274 227
                       <div>
275
-                        {{ family.relationship || '未登録' }}
228
+                        {{ family.birthDate || '未登録' }}
276 229
                       </div>
277 230
 
278 231
                       <div>
@@ -280,7 +233,7 @@
280 233
                       </div>
281 234
 
282 235
                       <div>
283
-                        {{ family.birthDate || '未登録' }}
236
+                        {{ family.relationship || '未登録' }}
284 237
                       </div>
285 238
 
286 239
                       <div>
@@ -319,7 +272,7 @@
319 272
                     <div>戒名</div>
320 273
                     <div>俗名</div>
321 274
                     <div>没年月日</div>
322
-                    <div>関係</div>
275
+                    <div>続柄</div>
323 276
                     <div>回忌</div>
324 277
                     <div>備考</div>
325 278
                   </div>
@@ -335,7 +288,7 @@
335 288
                       </div>
336 289
 
337 290
                       <div>
338
-                        {{ kakocho.deathDate }}
291
+                        {{ formatDeathDateWithYear(kakocho.deathDate) }}
339 292
                       </div>
340 293
 
341 294
                       <div>
@@ -427,7 +380,7 @@
427 380
                             {{ selectedFamily.name }}
428 381
                           </span>
429 382
                           <span class="tree-card-relationship">
430
-                            {{ selectedFamily.relationship || '関係未登録' }}
383
+                            {{ selectedFamily.relationship || '続柄未登録' }}
431 384
                           </span>
432 385
                           <span class="tree-card-birth">
433 386
                             {{ selectedFamily.birthDate || '生年月日未登録' }}
@@ -511,7 +464,7 @@
511 464
 
512 465
                     <div class="selected-info-list">
513 466
                       <div class="selected-info-row">
514
-                        <span>関係</span>
467
+                        <span>続柄</span>
515 468
                         <strong>{{ selectedFamily.relationship || '未登録' }}</strong>
516 469
                       </div>
517 470
 

+ 0
- 10
src/app/pages/danka-detail/danka-detail.scss Datei anzeigen

@@ -6,16 +6,6 @@
6 6
   color: #2f2720;
7 7
 }
8 8
 
9
-.breadcrumb {
10
-  position: absolute;
11
-  top: 28px;
12
-  left: 50%;
13
-  transform: translateX(-50%);
14
-  color: #7b6b5c;
15
-  font-size: 14px;
16
-  z-index: 2;
17
-}
18
-
19 9
 .danka-detail-page {
20 10
   display: flex;
21 11
   align-items: flex-start;

+ 127
- 1
src/app/pages/danka-detail/danka-detail.ts Datei anzeigen

@@ -11,6 +11,13 @@ 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 13
 
14
+interface NextMemorial {
15
+  name: string;
16
+  memorialType: string;
17
+  targetYear: number;
18
+  deathDate: string;
19
+}
20
+
14 21
 @Component({
15 22
   selector: 'app-danka-detail',
16 23
   imports: [AppHeader, AppSideMenu, RouterLink],
@@ -22,6 +29,7 @@ export class DankaDetail {
22 29
   families: Family[] = [];
23 30
   kakocholist: Kakocho[] = [];
24 31
   marriageRelations: MarriageRelation[] = [];
32
+  nextMemorial: NextMemorial | undefined;
25 33
   currentYear = new Date().getFullYear();
26 34
 
27 35
   selectedTab: 'basic' | 'family' | 'kakocho' | 'familyTree' = 'basic';
@@ -47,9 +55,10 @@ export class DankaDetail {
47 55
     if (id) {
48 56
       this.danka = this.dankaService.getDankaById(id);
49 57
       this.marriageRelations = this.marriageRelationService.getMarriageRelationsByDankaId(id);
50
-      this.families = this.familyService.getFamiliesByDankaId(id);
58
+      this.families = this.sortFamiliesByHouseholder(this.familyService.getFamiliesByDankaId(id));
51 59
       this.selectedFamily = this.families[0];
52 60
       this.kakocholist = this.kakochoService.getKakochoByDankaId(id);
61
+      this.nextMemorial = this.getNextMemorial();
53 62
     }
54 63
   }
55 64
 
@@ -75,10 +84,127 @@ export class DankaDetail {
75 84
     return this.currentYear - new Date(deathDate).getFullYear() + 1;
76 85
   }
77 86
 
87
+  formatUpdatedAt(updatedAt: string): string {
88
+    const date = this.parseDate(updatedAt);
89
+    if (!date) {
90
+      return '未登録';
91
+    }
92
+
93
+    return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`;
94
+  }
95
+
96
+  formatDeathDateWithYear(deathDate: string): string {
97
+    const date = this.parseDate(deathDate);
98
+    if (!date) {
99
+      return '未登録';
100
+    }
101
+
102
+    return `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`;
103
+  }
104
+
105
+  getMemorialType(deathDate: string): string {
106
+    const deathYear = Number(deathDate.slice(0, 4));
107
+    const yearDiff = this.currentYear - deathYear;
108
+
109
+    switch (yearDiff) {
110
+      case 1:
111
+        return '一周忌';
112
+      case 2:
113
+        return '三回忌';
114
+      case 6:
115
+        return '七回忌';
116
+      case 12:
117
+        return '十三回忌';
118
+      case 16:
119
+        return '十七回忌';
120
+      case 22:
121
+        return '二十三回忌';
122
+      default:
123
+        return '';
124
+    }
125
+  }
126
+
127
+  private getNextMemorial(): NextMemorial | undefined {
128
+    const today = this.toDateOnly(new Date());
129
+
130
+    return this.kakocholist
131
+      .map((kakocho) => {
132
+        const memorialType = this.getMemorialType(kakocho.deathDate);
133
+        const deathDate = this.parseDate(kakocho.deathDate);
134
+
135
+        if (!memorialType || !deathDate) {
136
+          return undefined;
137
+        }
138
+
139
+        const memorialDate = new Date(
140
+          this.currentYear,
141
+          deathDate.getMonth(),
142
+          deathDate.getDate(),
143
+        );
144
+
145
+        if (memorialDate < today) {
146
+          return undefined;
147
+        }
148
+
149
+        return {
150
+          memorialDate,
151
+          memorial: {
152
+            name: kakocho.name,
153
+            memorialType,
154
+            targetYear: this.currentYear,
155
+            deathDate: kakocho.deathDate,
156
+          },
157
+        };
158
+      })
159
+      .filter(
160
+        (item): item is { memorialDate: Date; memorial: NextMemorial } => item !== undefined,
161
+      )
162
+      .sort(
163
+        (a, b) =>
164
+          a.memorialDate.getTime() - b.memorialDate.getTime() ||
165
+          a.memorial.name.localeCompare(b.memorial.name, 'ja'),
166
+      )[0]?.memorial;
167
+  }
168
+
169
+  private toDateOnly(date: Date): Date {
170
+    return new Date(date.getFullYear(), date.getMonth(), date.getDate());
171
+  }
172
+
173
+  private parseDate(value: string): Date | null {
174
+    const [year, month, day] = value.split('-').map(Number);
175
+    if (!year || !month || !day) {
176
+      return null;
177
+    }
178
+    return new Date(year, month - 1, day);
179
+  }
180
+
78 181
   selectFamily(family: Family): void {
79 182
     this.selectedFamily = family;
80 183
   }
81 184
 
185
+  private sortFamiliesByHouseholder(families: Family[]): Family[] {
186
+    if (!this.danka) {
187
+      return families;
188
+    }
189
+
190
+    const householderName = this.normalizeName(this.danka.householder);
191
+
192
+    return [...families].sort((a, b) => {
193
+      const aIsHouseholder = this.normalizeName(a.name) === householderName;
194
+      const bIsHouseholder = this.normalizeName(b.name) === householderName;
195
+
196
+      if (aIsHouseholder === bIsHouseholder) {
197
+        return 0;
198
+      }
199
+
200
+      return aIsHouseholder ? -1 : 1;
201
+    });
202
+  }
203
+
204
+  private normalizeName(name: string): string {
205
+    return name.replace(/\s/g, '');
206
+  }
207
+
82 208
   getFamilyById(id: string): Family | undefined {
83 209
     if (!id) {
84 210
       return undefined;

+ 0
- 3
src/app/pages/danka-edit/danka-edit.html Datei anzeigen

@@ -1,8 +1,5 @@
1 1
 <app-header></app-header>
2 2
 
3
-<div class="breadcrumb">
4
-  ホーム &gt; 檀家(世帯) &gt; 編集
5
-</div>
6 3
 
7 4
 <div class="danka-edit-page">
8 5
   <app-side-menu></app-side-menu>

+ 0
- 10
src/app/pages/danka-edit/danka-edit.scss Datei anzeigen

@@ -6,16 +6,6 @@
6 6
   color: #2f2720;
7 7
 }
8 8
 
9
-.breadcrumb {
10
-  position: absolute;
11
-  top: 28px;
12
-  left: 50%;
13
-  transform: translateX(-50%);
14
-  color: #7b6b5c;
15
-  font-size: 14px;
16
-  z-index: 2;
17
-}
18
-
19 9
 .danka-edit-page {
20 10
   display: flex;
21 11
   align-items: flex-start;

+ 9
- 1
src/app/pages/danka-edit/danka-edit.ts Datei anzeigen

@@ -87,12 +87,13 @@ export class DankaEdit {
87 87
     const formValue = this.dankaForm.value;
88 88
     const isEdit = !!this.danka;
89 89
     const dankaId = isEdit ? this.danka!.id : Date.now().toString();
90
-    const updatedDanka = {
90
+    const updatedDanka: Danka = {
91 91
       id: dankaId,
92 92
       householdName: formValue.householdName?.trim() ?? '',
93 93
       householder: formValue.householder?.trim() ?? '',
94 94
       postalCode: formValue.postalCode?.trim() ?? '',
95 95
       address: formValue.address?.trim() ?? '',
96
+      updatedAt: this.formatDateForSave(new Date()),
96 97
       phones: (formValue.phones ?? [])
97 98
         .map((phone) => ({
98 99
           tel: phone.tel?.trim() ?? '',
@@ -110,6 +111,13 @@ export class DankaEdit {
110 111
     }
111 112
   }
112 113
 
114
+  private formatDateForSave(date: Date): string {
115
+    const year = date.getFullYear();
116
+    const month = String(date.getMonth() + 1).padStart(2, '0');
117
+    const day = String(date.getDate()).padStart(2, '0');
118
+    return `${year}-${month}-${day}`;
119
+  }
120
+
113 121
   //削除の処理
114 122
   deleteDanka() {
115 123
     if (!this.danka) {

+ 12
- 19
src/app/pages/danka-list/danka-list.html Datei anzeigen

@@ -24,30 +24,23 @@
24 24
           検索
25 25
         </button>
26 26
 
27
-        <button type="button" class="new-button" routerLink="/danka-new">
28
-          新規登録
27
+        <button type="button" class="new-button" (click)="clearDanka()">
28
+          クリア
29 29
         </button>
30 30
       </div>
31 31
 
32 32
       <div class="filter-row">
33 33
         <div class="filter-button-list">
34
-          <button type="button" class="filter-button" [class.active]="selectedFilter === 'all'"
35
-                  (click)="showAllDanka()">
36
-            全件
37
-          </button>
38
-
39
-          <button type="button" class="filter-button">
40
-            過去帳あり
41
-          </button>
42
-
43
-          <button type="button" class="filter-button">
44
-            法要あり
45
-          </button>
46
-
47
-          <button type="button" class="filter-button" [class.active]="selectedFilter === 'phone'"
48
-                  (click)="filterPhoneAvailable()">
49
-            電話番号あり
50
-          </button>
34
+          @for (kanaRow of kanaRows; track kanaRow.value) {
35
+            <button
36
+              type="button"
37
+              class="filter-button"
38
+              [class.active]="selectedKanaRow === kanaRow.value"
39
+              (click)="filterByKanaRow(kanaRow.value)"
40
+            >
41
+              {{ kanaRow.label }}
42
+            </button>
43
+          }
51 44
         </div>
52 45
 
53 46
         <p class="result-count">

+ 11
- 75
src/app/pages/danka-list/danka-list.scss Datei anzeigen

@@ -126,26 +126,31 @@
126 126
   display: flex;
127 127
   align-items: center;
128 128
   justify-content: space-between;
129
+  gap: 16px;
129 130
   margin-bottom: 14px;
130
-  padding-right: 24px;
131
+  padding: 12px 14px;
132
+  background: #fffdf9;
133
+  border: 2px solid #d8caba;
134
+  border-radius: 10px;
131 135
 }
132 136
 
133 137
 .filter-button-list {
134 138
   display: flex;
135 139
   align-items: center;
140
+  flex-wrap: wrap;
136 141
   gap: 8px;
137 142
 }
138 143
 
139 144
 .filter-button {
140
-  min-width: 140px;
145
+  min-width: 56px;
141 146
   height: 40px;
142
-  padding: 0 18px;
147
+  padding: 0 14px;
143 148
   border: 2px solid #d8caba;
144
-  border-radius: 6px;
149
+  border-radius: 8px;
145 150
   background: #f4eee4;
146 151
   color: #2f2720;
147 152
   font-size: 16px;
148
-  font-weight: 700;
153
+  font-weight: 800;
149 154
   cursor: pointer;
150 155
   box-sizing: border-box;
151 156
 }
@@ -168,6 +173,7 @@
168 173
   margin: 0;
169 174
   color: #8a7d6d;
170 175
   font-size: 15px;
176
+  white-space: nowrap;
171 177
 }
172 178
 
173 179
 .list-content {
@@ -232,73 +238,3 @@
232 238
   text-align: center;
233 239
 }
234 240
 
235
-.help-panel {
236
-  position: absolute;
237
-  top: 0;
238
-  right: 18px;
239
-  width: 158px;
240
-  min-height: 446px;
241
-  padding: 28px 14px 18px;
242
-  background: #fffdf9;
243
-  border: 2px solid #d8caba;
244
-  border-radius: 24px;
245
-  box-sizing: border-box;
246
-}
247
-
248
-.help-panel h2 {
249
-  margin: 0 0 16px;
250
-  color: #2f2720;
251
-  font-size: 20px;
252
-  font-weight: 800;
253
-}
254
-
255
-.help-panel ol {
256
-  margin: 0;
257
-  padding-left: 22px;
258
-  color: #6f6257;
259
-  font-size: 14px;
260
-  line-height: 1.45;
261
-}
262
-
263
-.help-title-secondary {
264
-  margin-top: 28px !important;
265
-}
266
-
267
-.help-button-list {
268
-  display: flex;
269
-  flex-direction: column;
270
-  gap: 8px;
271
-}
272
-
273
-.help-button {
274
-  min-height: 46px;
275
-  padding: 0 8px;
276
-  border: 2px solid #d8caba;
277
-  border-radius: 8px;
278
-  background: #ffffff;
279
-  color: #2f2720;
280
-  font-size: 16px;
281
-  font-weight: 800;
282
-  text-decoration: none;
283
-  display: flex;
284
-  align-items: center;
285
-  justify-content: center;
286
-  text-align: center;
287
-  box-sizing: border-box;
288
-}
289
-
290
-.help-button:hover {
291
-  background: #f6efe6;
292
-}
293
-
294
-.bottom-note {
295
-  width: 700px;
296
-  margin: 18px 0 22px 36px;
297
-  padding: 4px 12px;
298
-  border: 2px solid #d8caba;
299
-  border-radius: 4px;
300
-  background: #eadfce;
301
-  color: #7b6b5c;
302
-  font-size: 14px;
303
-  box-sizing: border-box;
304
-}

+ 90
- 3
src/app/pages/danka-list/danka-list.ts Datei anzeigen

@@ -1,11 +1,24 @@
1 1
 import { Component } from '@angular/core';
2 2
 import { RouterLink } from '@angular/router';
3 3
 import { DankaService } from '../../services/dankaService';
4
+import { FamilyService } from '../../services/family-service';
4 5
 import { AppHeader } from '../../share/header/app-header';
5 6
 import { AppSideMenu } from '../../share/side-menu/app-side-menu';
6 7
 import { Danka } from '../../models/danka';
7 8
 import { FormsModule } from '@angular/forms';
8
-import { findIndex } from 'rxjs';
9
+
10
+type KanaRowValue =
11
+  | 'all'
12
+  | 'a'
13
+  | 'ka'
14
+  | 'sa'
15
+  | 'ta'
16
+  | 'na'
17
+  | 'ha'
18
+  | 'ma'
19
+  | 'ya'
20
+  | 'ra'
21
+  | 'wa';
9 22
 
10 23
 @Component({
11 24
   selector: 'app-danka-list',
@@ -19,14 +32,46 @@ export class DankaList {
19 32
   searchKeyword: string = '';
20 33
   dankaDisplay: number = 0;
21 34
   selectedFilter = 'all';
35
+  selectedKanaRow: KanaRowValue = 'all';
36
+  kanaRows: { label: string; value: KanaRowValue }[] = [
37
+    { label: '全件', value: 'all' },
38
+    { label: 'あ行', value: 'a' },
39
+    { label: 'か行', value: 'ka' },
40
+    { label: 'さ行', value: 'sa' },
41
+    { label: 'た行', value: 'ta' },
42
+    { label: 'な行', value: 'na' },
43
+    { label: 'は行', value: 'ha' },
44
+    { label: 'ま行', value: 'ma' },
45
+    { label: 'や行', value: 'ya' },
46
+    { label: 'ら行', value: 'ra' },
47
+    { label: 'わ行', value: 'wa' },
48
+  ];
49
+
50
+  private readonly kanaRowMap: Record<Exclude<KanaRowValue, 'all'>, string[]> = {
51
+    a: ['あ', 'い', 'う', 'え', 'お', 'ア', 'イ', 'ウ', 'エ', 'オ'],
52
+    ka: ['か', 'き', 'く', 'け', 'こ', 'が', 'ぎ', 'ぐ', 'げ', 'ご', 'カ', 'キ', 'ク', 'ケ', 'コ', 'ガ', 'ギ', 'グ', 'ゲ', 'ゴ'],
53
+    sa: ['さ', 'し', 'す', 'せ', 'そ', 'ざ', 'じ', 'ず', 'ぜ', 'ぞ', 'サ', 'シ', 'ス', 'セ', 'ソ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ'],
54
+    ta: ['た', 'ち', 'つ', 'て', 'と', 'だ', 'ぢ', 'づ', 'で', 'ど', 'タ', 'チ', 'ツ', 'テ', 'ト', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド'],
55
+    na: ['な', 'に', 'ぬ', 'ね', 'の', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ'],
56
+    ha: ['は', 'ひ', 'ふ', 'へ', 'ほ', 'ば', 'び', 'ぶ', 'べ', 'ぼ', 'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ', 'ハ', 'ヒ', 'フ', 'ヘ', 'ホ', 'バ', 'ビ', 'ブ', 'ベ', 'ボ', 'パ', 'ピ', 'プ', 'ペ', 'ポ'],
57
+    ma: ['ま', 'み', 'む', 'め', 'も', 'マ', 'ミ', 'ム', 'メ', 'モ'],
58
+    ya: ['や', 'ゆ', 'よ', 'ヤ', 'ユ', 'ヨ'],
59
+    ra: ['ら', 'り', 'る', 'れ', 'ろ', 'ラ', 'リ', 'ル', 'レ', 'ロ'],
60
+    wa: ['わ', 'を', 'ん', 'ワ', 'ヲ', 'ン'],
61
+  };
22 62
 
23
-  constructor(private dankaService: DankaService) {
63
+  constructor(
64
+    private dankaService: DankaService,
65
+    private familyService: FamilyService,
66
+  ) {
24 67
     this.dankaList = this.dankaService.getDankaList();
68
+    this.showAllDanka();
25 69
   }
26 70
 
27 71
   //全件タグで絞り込み
28 72
   showAllDanka() {
29 73
     this.selectedFilter = 'all';
74
+    this.selectedKanaRow = 'all';
30 75
     this.searchKeyword = '';
31 76
     this.filterDankaList = this.dankaList;
32 77
     this.dankaDisplay = this.filterDankaList.length;
@@ -35,6 +80,7 @@ export class DankaList {
35 80
   //電話番号タグで絞り込み
36 81
   filterPhoneAvailable() {
37 82
     this.selectedFilter = 'phone';
83
+    this.selectedKanaRow = 'all';
38 84
     //電話番号タブに該当する檀家を表示
39 85
     this.filterDankaList = this.dankaList.filter((danka) => {
40 86
       return danka.phones.some((phone) => phone.tel.trim() !== '');
@@ -44,12 +90,14 @@ export class DankaList {
44 90
 
45 91
   //検索処理
46 92
   searchDanka() {
47
-        this.selectedFilter = 'search';
93
+    this.selectedFilter = 'search';
94
+    this.selectedKanaRow = 'all';
48 95
     //検索欄に入力された値から余白を削除
49 96
     const keyword = this.searchKeyword.trim();
50 97
     //検索欄が空の場合は檀家の一覧を表示
51 98
     if (keyword === '') {
52 99
       this.filterDankaList = this.dankaList;
100
+      this.dankaDisplay = this.filterDankaList.length;
53 101
       return;
54 102
     }
55 103
 
@@ -66,4 +114,43 @@ export class DankaList {
66 114
     this.dankaDisplay = this.filterDankaList.length;
67 115
     console.log(this.dankaDisplay);
68 116
   }
117
+
118
+  filterByKanaRow(row: KanaRowValue): void {
119
+    this.selectedFilter = 'kana';
120
+    this.selectedKanaRow = row;
121
+    this.searchKeyword = '';
122
+
123
+    if (row === 'all') {
124
+      this.filterDankaList = this.dankaList;
125
+      this.dankaDisplay = this.filterDankaList.length;
126
+      return;
127
+    }
128
+
129
+    this.filterDankaList = this.dankaList.filter((danka) => {
130
+      const firstKana = this.getDankaSortText(danka).charAt(0);
131
+      return this.kanaRowMap[row].includes(firstKana);
132
+    });
133
+    this.dankaDisplay = this.filterDankaList.length;
134
+  }
135
+
136
+  clearDanka() {
137
+    this.selectedFilter = '';
138
+    this.selectedKanaRow = 'all';
139
+    this.searchKeyword = '';
140
+    this.filterDankaList = [];
141
+    this.dankaDisplay = 0;
142
+  }
143
+
144
+  private getDankaSortText(danka: Danka): string {
145
+    const householderName = this.normalizeName(danka.householder);
146
+    const householderFamily = this.familyService
147
+      .getFamiliesByDankaId(danka.id)
148
+      .find((family) => this.normalizeName(family.name) === householderName);
149
+
150
+    return (householderFamily?.furigana || danka.householder).trim();
151
+  }
152
+
153
+  private normalizeName(name: string): string {
154
+    return name.replace(/\s/g, '');
155
+  }
69 156
 }

+ 32
- 32
src/app/pages/dashboard/dashboard.html Datei anzeigen

@@ -15,14 +15,15 @@
15 15
       <section class="overview" aria-label="概要">
16 16
         <a class="card primary" href="#">
17 17
           <div class="card-label">今週の法要</div>
18
-          <div class="metric"><strong>4</strong><span>件</span></div>
19
-          <p class="card-text">本日 1件、明日以降 3件。準備状況を確認できます。</p>
18
+          <div class="metric"><strong>{{ weeklyMemorialCount }}</strong><span>件</span></div>
19
+          <p class="card-text">
20
+            本日 {{ todayMemorialCount }}件、明日以降 {{ upcomingWeeklyMemorialCount }}件。
21
+          </p>
20 22
         </a>
21 23
 
22 24
         <a class="card" href="#">
23 25
           <div class="card-label">今月の年忌法要</div>
24
-          <div class="metric"><strong>12</strong><span>名</span></div>
25
-          <p class="card-text">未確認 3名 / 案内済 7名 / 完了 2名</p>
26
+          <div class="metric"><strong>{{ monthlyMemorialCount }}</strong><span>名</span></div>
26 27
         </a>
27 28
 
28 29
         <div class="search-card">
@@ -92,35 +93,34 @@
92 93
         </div>
93 94
 
94 95
         <div class="upcoming-list">
95
-          <a class="upcoming-item important" href="#">
96
-            <div class="upcoming-date">今日</div>
97
-            <div class="upcoming-main">
98
-              <div class="upcoming-title">鈴木家 美咲様 三回忌</div>
99
-              <div class="upcoming-sub">市内 1-2-3 / 連絡先確認済</div>
96
+          @if (upcomingMemorials.length > 0) {
97
+            @for (memorial of upcomingMemorials; track memorial.id) {
98
+              <a
99
+                class="upcoming-item"
100
+                [class.important]="memorial.dateLabel === '今日'"
101
+                [routerLink]="['/danka-detail', memorial.dankaId]"
102
+                [queryParams]="{tab: 'kakocho'}"
103
+              >
104
+                <div class="upcoming-date">{{ memorial.dateLabel }}</div>
105
+                <div class="upcoming-main">
106
+                  <div class="upcoming-title">{{ memorial.title }}</div>
107
+                  <div class="upcoming-sub">{{ memorial.subText }}</div>
108
+                </div>
109
+                <div class="upcoming-type">{{ memorial.type }}</div>
110
+                <div class="upcoming-status">{{ memorial.status }}</div>
111
+              </a>
112
+            }
113
+          } @else {
114
+            <div class="upcoming-item">
115
+              <div class="upcoming-date">なし</div>
116
+              <div class="upcoming-main">
117
+                <div class="upcoming-title">近日の法要・命日はありません</div>
118
+                <div class="upcoming-sub">過去帳に登録された命日から自動表示します。</div>
119
+              </div>
120
+              <div class="upcoming-type">-</div>
121
+              <div class="upcoming-status">-</div>
100 122
             </div>
101
-            <div class="upcoming-type">年忌法要</div>
102
-            <div class="upcoming-status">準備確認</div>
103
-          </a>
104
-
105
-          <a class="upcoming-item" href="#">
106
-            <div class="upcoming-date">6月2日</div>
107
-            <div class="upcoming-main">
108
-              <div class="upcoming-title">佐藤家 恵夫様 七回忌</div>
109
-              <div class="upcoming-sub">市内 2-8-1 / 案内状送付済</div>
110
-            </div>
111
-            <div class="upcoming-type">年忌法要</div>
112
-            <div class="upcoming-status">案内済</div>
113
-          </a>
114
-
115
-          <a class="upcoming-item" href="#">
116
-            <div class="upcoming-date">6月7日</div>
117
-            <div class="upcoming-main">
118
-              <div class="upcoming-title">田中家 雪音様 祥月命日</div>
119
-              <div class="upcoming-sub">市内 3-4-6 / 法要日は未設定</div>
120
-            </div>
121
-            <div class="upcoming-type">命日</div>
122
-            <div class="upcoming-status">要確認</div>
123
-          </a>
123
+          }
124 124
         </div>
125 125
       </section>
126 126
     </section>

+ 167
- 2
src/app/pages/dashboard/dashboard.ts Datei anzeigen

@@ -1,11 +1,176 @@
1 1
 import { Component } from '@angular/core';
2
+import { RouterLink } from '@angular/router';
3
+import { KakochoService } from '../../services/kakocho-service';
4
+import { DankaService } from '../../services/dankaService';
2 5
 import { AppHeader } from '../../share/header/app-header';
3 6
 import { AppSideMenu } from '../../share/side-menu/app-side-menu';
4 7
 
8
+interface UpcomingMemorial {
9
+  id: string;
10
+  dankaId: string;
11
+  date: Date;
12
+  dateLabel: string;
13
+  title: string;
14
+  subText: string;
15
+  type: '年忌法要' | '命日';
16
+  status: '準備確認' | '要確認';
17
+}
18
+
5 19
 @Component({
6 20
   selector: 'app-dashboard',
7
-  imports: [AppHeader, AppSideMenu],
21
+  imports: [AppHeader, AppSideMenu, RouterLink],
8 22
   templateUrl: './dashboard.html',
9 23
   styleUrl: './dashboard.scss',
10 24
 })
11
-export class Dashboard {}
25
+export class Dashboard {
26
+  weeklyMemorialCount = 0;
27
+  todayMemorialCount = 0;
28
+  upcomingWeeklyMemorialCount = 0;
29
+  monthlyMemorialCount = 0;
30
+  upcomingMemorials: UpcomingMemorial[] = [];
31
+
32
+  private readonly targetYear = new Date().getFullYear();
33
+
34
+  constructor(
35
+    private kakochoService: KakochoService,
36
+    private dankaService: DankaService,
37
+  ) {
38
+    this.setWeeklyMemorialSummary();
39
+    this.setMonthlyMemorialSummary();
40
+    this.setUpcomingMemorials();
41
+  }
42
+
43
+  private setWeeklyMemorialSummary(): void {
44
+    const today = this.toDateOnly(new Date());
45
+    const weekEnd = this.addDays(this.getWeekStart(today), 6);
46
+
47
+    const weeklyMemorials = this.kakochoService.getKakochoList().filter((kakocho) => {
48
+      const deathDate = this.parseDate(kakocho.deathDate);
49
+      if (!deathDate) {
50
+        return false;
51
+      }
52
+
53
+      if (!this.isMemorialTarget(deathDate)) {
54
+        return false;
55
+      }
56
+
57
+      const memorialDate = new Date(this.targetYear, deathDate.getMonth(), deathDate.getDate());
58
+      return memorialDate >= today && memorialDate <= weekEnd;
59
+    });
60
+
61
+    this.weeklyMemorialCount = weeklyMemorials.length;
62
+    this.todayMemorialCount = weeklyMemorials.filter((kakocho) => {
63
+      const deathDate = this.parseDate(kakocho.deathDate);
64
+      return deathDate?.getMonth() === today.getMonth() && deathDate.getDate() === today.getDate();
65
+    }).length;
66
+    this.upcomingWeeklyMemorialCount = this.weeklyMemorialCount - this.todayMemorialCount;
67
+  }
68
+
69
+  private setMonthlyMemorialSummary(): void {
70
+    const today = this.toDateOnly(new Date());
71
+
72
+    this.monthlyMemorialCount = this.kakochoService.getKakochoList().filter((kakocho) => {
73
+      const deathDate = this.parseDate(kakocho.deathDate);
74
+      if (!deathDate || !this.isMemorialTarget(deathDate)) {
75
+        return false;
76
+      }
77
+
78
+      return deathDate.getMonth() === today.getMonth();
79
+    }).length;
80
+  }
81
+
82
+  private setUpcomingMemorials(): void {
83
+    const today = this.toDateOnly(new Date());
84
+    const endDate = this.addDays(today, 30);
85
+
86
+    this.upcomingMemorials = this.kakochoService
87
+      .getKakochoList()
88
+      .map((kakocho): UpcomingMemorial | null => {
89
+        const deathDate = this.parseDate(kakocho.deathDate);
90
+        if (!deathDate) {
91
+          return null;
92
+        }
93
+
94
+        const eventDate = new Date(this.targetYear, deathDate.getMonth(), deathDate.getDate());
95
+        if (eventDate < today || eventDate > endDate) {
96
+          return null;
97
+        }
98
+
99
+        const memorialType = this.getMemorialType(deathDate);
100
+        const danka = this.dankaService.getDankaById(kakocho.dankaId);
101
+        const type = memorialType ? '年忌法要' : '命日';
102
+        const status = memorialType ? '準備確認' : '要確認';
103
+
104
+        return {
105
+          id: kakocho.id,
106
+          dankaId: kakocho.dankaId,
107
+          date: eventDate,
108
+          dateLabel: this.formatDateLabel(eventDate, today),
109
+          title: `${danka?.householdName ?? '不明'} ${kakocho.name}様 ${memorialType || '祥月命日'}`,
110
+          subText: `${danka?.address ?? '住所未登録'} / ${kakocho.kaimyo || '戒名未登録'}`,
111
+          type,
112
+          status,
113
+        };
114
+      })
115
+      .filter((memorial): memorial is UpcomingMemorial => memorial !== null)
116
+      .sort((a, b) => a.date.getTime() - b.date.getTime() || a.title.localeCompare(b.title, 'ja'))
117
+      .slice(0, 3);
118
+  }
119
+
120
+  private isMemorialTarget(deathDate: Date): boolean {
121
+    return this.getMemorialType(deathDate) !== '';
122
+  }
123
+
124
+  private getMemorialType(deathDate: Date): string {
125
+    const yearDiff = this.targetYear - deathDate.getFullYear();
126
+
127
+    switch (yearDiff) {
128
+      case 1:
129
+        return '一周忌';
130
+      case 2:
131
+        return '三回忌';
132
+      case 6:
133
+        return '七回忌';
134
+      case 12:
135
+        return '十三回忌';
136
+      case 16:
137
+        return '十七回忌';
138
+      case 22:
139
+        return '二十三回忌';
140
+      default:
141
+        return '';
142
+    }
143
+  }
144
+
145
+  private formatDateLabel(date: Date, today: Date): string {
146
+    if (date.getTime() === today.getTime()) {
147
+      return '今日';
148
+    }
149
+
150
+    return `${date.getMonth() + 1}月${date.getDate()}日`;
151
+  }
152
+
153
+  private getWeekStart(date: Date): Date {
154
+    const day = date.getDay();
155
+    const diff = day === 0 ? -6 : 1 - day;
156
+    return this.addDays(date, diff);
157
+  }
158
+
159
+  private addDays(date: Date, days: number): Date {
160
+    const result = new Date(date);
161
+    result.setDate(result.getDate() + days);
162
+    return result;
163
+  }
164
+
165
+  private toDateOnly(date: Date): Date {
166
+    return new Date(date.getFullYear(), date.getMonth(), date.getDate());
167
+  }
168
+
169
+  private parseDate(value: string): Date | null {
170
+    const [year, month, day] = value.split('-').map(Number);
171
+    if (!year || !month || !day) {
172
+      return null;
173
+    }
174
+    return new Date(year, month - 1, day);
175
+  }
176
+}

+ 2
- 5
src/app/pages/family-edit/family-edit.html Datei anzeigen

@@ -1,8 +1,5 @@
1 1
 <app-header></app-header>
2 2
 
3
-<div class="breadcrumb">
4
-  ホーム &gt; 檀家(世帯) &gt; 家族 &gt; 編集
5
-</div>
6 3
 
7 4
 <div class="danka-edit-page">
8 5
   <app-side-menu></app-side-menu>
@@ -42,7 +39,7 @@
42 39
               </div>
43 40
 
44 41
               <div class="form-row">
45
-                <label for="relationship">世帯主との関係</label>
42
+                <label for="relationship">続柄</label>
46 43
                 <div class="form-field">
47 44
                   <select id="relationship"
48 45
                           formControlName="relationship">
@@ -58,7 +55,7 @@
58 55
                     <option value="その他">その他</option>
59 56
                   </select>
60 57
                   @if (familyForm.get('relationship')?.invalid && familyForm.get('relationship')?.touched) {
61
-                    <p class="error-message">世帯主との関係を選択してください。</p>
58
+                    <p class="error-message">続柄を選択してください。</p>
62 59
                   }
63 60
                 </div>
64 61
               </div>

+ 0
- 16
src/app/pages/family-edit/family-edit.scss Datei anzeigen

@@ -6,16 +6,6 @@
6 6
   color: #2f2720;
7 7
 }
8 8
 
9
-.breadcrumb {
10
-  position: absolute;
11
-  top: 28px;
12
-  left: 50%;
13
-  transform: translateX(-50%);
14
-  color: #7b6b5c;
15
-  font-size: 14px;
16
-  z-index: 2;
17
-}
18
-
19 9
 .danka-edit-page {
20 10
   display: flex;
21 11
   align-items: flex-start;
@@ -296,12 +286,6 @@
296 286
 }
297 287
 
298 288
 @media (max-width: 800px) {
299
-  .breadcrumb {
300
-    position: static;
301
-    transform: none;
302
-    padding: 16px 20px 0;
303
-  }
304
-
305 289
   .danka-edit-page {
306 290
     flex-direction: column;
307 291
   }

+ 0
- 3
src/app/pages/family-tree/family-tree.html Datei anzeigen

@@ -1,8 +1,5 @@
1 1
 <app-header></app-header>
2 2
 
3
-<div class="breadcrumb">
4
-  ホーム &gt; 家系図
5
-</div>
6 3
 
7 4
 <div class="search-page">
8 5
   <app-side-menu></app-side-menu>

+ 0
- 7
src/app/pages/kakocho-edit/kakocho-edit.html Datei anzeigen

@@ -1,12 +1,5 @@
1 1
 <app-header></app-header>
2 2
 
3
-<div class="breadcrumb">
4
-  @if (kakocho) {
5
-    ホーム &gt; 檀家(世帯) &gt; 過去帳 &gt; 故人を編集
6
-  } @else {
7
-    ホーム &gt; 檀家(世帯) &gt; 過去帳 &gt; 故人を追加
8
-  }
9
-</div>
10 3
 
11 4
 <div class="danka-edit-page">
12 5
   <app-side-menu></app-side-menu>

+ 0
- 10
src/app/pages/kakocho-edit/kakocho-edit.scss Datei anzeigen

@@ -6,16 +6,6 @@
6 6
   color: #2f2720;
7 7
 }
8 8
 
9
-.breadcrumb {
10
-  position: absolute;
11
-  top: 28px;
12
-  left: 50%;
13
-  transform: translateX(-50%);
14
-  color: #7b6b5c;
15
-  font-size: 14px;
16
-  z-index: 2;
17
-}
18
-
19 9
 .danka-edit-page {
20 10
   display: flex;
21 11
   align-items: flex-start;

+ 6
- 9
src/app/pages/memorial-list/memorial-list.html Datei anzeigen

@@ -1,8 +1,5 @@
1 1
 <app-header></app-header>
2 2
 
3
-<div class="breadcrumb">
4
-  ホーム &gt; 年次法要
5
-</div>
6 3
 
7 4
 <div class="memorial-list-page">
8 5
   <app-side-menu></app-side-menu>
@@ -49,11 +46,11 @@
49 46
       <section class="memorial-table-section">
50 47
         <div class="memorial-table">
51 48
           <div class="memorial-table-header">
52
-            <div>俗名</div>
53 49
             <div>戒名</div>
50
+            <div>俗名</div>
51
+            <div>没年月日</div>
54 52
             <div>関係</div>
55 53
             <div>檀家(世帯)</div>
56
-            <div>没年月日</div>
57 54
             <div>回忌</div>
58 55
             <div>詳細</div>
59 56
           </div>
@@ -62,10 +59,13 @@
62 59
             @for (memorial of memorialList; track memorial.id) {
63 60
               <div class="memorial-table-row">
64 61
                 <div class="person-name">
62
+                  {{ memorial.kaimyo }}
63
+                </div>
64
+                <div>
65 65
                   {{ memorial.name }}
66 66
                 </div>
67 67
                 <div>
68
-                  {{ memorial.kaimyo }}
68
+                  {{ formatDeathDate(memorial.deathDate) }}
69 69
                 </div>
70 70
                 <div>
71 71
                   {{ memorial.relationship }}
@@ -73,9 +73,6 @@
73 73
                 <div>
74 74
                   {{ memorial.householdName }}
75 75
                 </div>
76
-                <div>
77
-                  {{ memorial.deathDate }}
78
-                </div>
79 76
                 <div class="memorial-type">
80 77
                   {{ memorial.memorialType }}
81 78
                 </div>

+ 1
- 17
src/app/pages/memorial-list/memorial-list.scss Datei anzeigen

@@ -6,16 +6,6 @@
6 6
   color: #2f2720;
7 7
 }
8 8
 
9
-.breadcrumb {
10
-  position: absolute;
11
-  top: 28px;
12
-  left: 50%;
13
-  transform: translateX(-50%);
14
-  color: #7b6b5c;
15
-  font-size: 14px;
16
-  z-index: 2;
17
-}
18
-
19 9
 .memorial-list-page {
20 10
   display: flex;
21 11
   align-items: flex-start;
@@ -172,7 +162,7 @@
172 162
 .memorial-table-header,
173 163
 .memorial-table-row {
174 164
   display: grid;
175
-  grid-template-columns: 1.2fr 1.4fr 0.8fr 1.2fr 1.1fr 0.8fr 0.7fr;
165
+  grid-template-columns: 1.4fr 1.2fr 0.9fr 0.8fr 1.2fr 0.8fr 0.7fr;
176 166
   align-items: center;
177 167
   column-gap: 12px;
178 168
 }
@@ -284,12 +274,6 @@
284 274
 }
285 275
 
286 276
 @media (max-width: 800px) {
287
-  .breadcrumb {
288
-    position: static;
289
-    transform: none;
290
-    padding: 16px 20px 0;
291
-  }
292
-
293 277
   .memorial-list-page {
294 278
     flex-direction: column;
295 279
   }

+ 9
- 0
src/app/pages/memorial-list/memorial-list.ts Datei anzeigen

@@ -75,6 +75,15 @@ export class MemorialList {
75 75
     this.createMemorialList();
76 76
   }
77 77
 
78
+  formatDeathDate(deathDate: string): string {
79
+    const [, month, day] = deathDate.split('-').map(Number);
80
+    if (!month || !day) {
81
+      return '未登録';
82
+    }
83
+
84
+    return `${month}月${day}日`;
85
+  }
86
+
78 87
   getMemorialType(yearDiff: number) {
79 88
     switch (yearDiff) {
80 89
       case 1:

+ 1
- 16
src/app/pages/search/search.html Datei anzeigen

@@ -1,9 +1,5 @@
1 1
 <app-header></app-header>
2 2
 
3
-<div class="breadcrumb">
4
-  ホーム &gt; まとめて検索
5
-</div>
6
-
7 3
 <div class="search-page">
8 4
   <app-side-menu></app-side-menu>
9 5
 
@@ -11,14 +7,6 @@
11 7
     <section class="search-panel">
12 8
       <div class="page-title-row">
13 9
         <h1>まとめて検索</h1>
14
-        <div class="top-action-list">
15
-          <button type="button" class="top-button" onclick="history.back()">
16
-            戻る
17
-          </button>
18
-          <a routerLink="/" class="top-button">
19
-            ホーム
20
-          </a>
21
-        </div>
22 10
       </div>
23 11
 
24 12
       <section class="search-condition-area">
@@ -26,7 +14,7 @@
26 14
           <div class="search-input-box">
27 15
             <span class="search-icon">⌕</span>
28 16
             <input type="text" [(ngModel)]="searchKeyword"
29
-                   placeholder="さとう / 佐藤 / 釈 / 2024 / 母 / 三回忌"
17
+                   placeholder="三回忌 / 〇〇歳 / 2024 /"
30 18
                    (keydown.enter)="searchAll()"/>
31 19
           </div>
32 20
           <button type="button" class="search-button" (click)="searchAll()">
@@ -35,9 +23,6 @@
35 23
           <button type="button" class="filter-button-main" (click)="clearSearch()">
36 24
             クリア
37 25
           </button>
38
-          <a routerLink="/danka-list" class="back-list-button">
39
-            一覧へ戻る
40
-          </a>
41 26
         </div>
42 27
 
43 28
         <div class="search-filter-list">

+ 0
- 16
src/app/pages/search/search.scss Datei anzeigen

@@ -6,16 +6,6 @@
6 6
   color: #2f2720;
7 7
 }
8 8
 
9
-.breadcrumb {
10
-  position: absolute;
11
-  top: 28px;
12
-  left: 50%;
13
-  transform: translateX(-50%);
14
-  color: #7b6b5c;
15
-  font-size: 14px;
16
-  z-index: 2;
17
-}
18
-
19 9
 .search-page {
20 10
   display: flex;
21 11
   align-items: flex-start;
@@ -314,12 +304,6 @@
314 304
 }
315 305
 
316 306
 @media (max-width: 800px) {
317
-  .breadcrumb {
318
-    position: static;
319
-    transform: none;
320
-    padding: 16px 20px 0;
321
-  }
322
-
323 307
   .search-page {
324 308
     flex-direction: column;
325 309
   }

+ 2
- 0
src/app/services/dankaService.ts Datei anzeigen

@@ -12,6 +12,7 @@ export class DankaService {
12 12
       householder: '鈴木 太郎',
13 13
       postalCode: '123-4567',
14 14
       address: '市内 1-2-3',
15
+      updatedAt: '2026-05-28',
15 16
       phones: [
16 17
         {
17 18
           tel: '03-4567-8910',
@@ -29,6 +30,7 @@ export class DankaService {
29 30
       householder: '古田 太郎',
30 31
       postalCode: '234-4567',
31 32
       address: '市内 1-2-3',
33
+      updatedAt: '2026-05-28',
32 34
       phones: [
33 35
         {
34 36
           tel: '0-5678-9101',

+ 4
- 4
src/app/services/kakocho-service.ts Datei anzeigen

@@ -13,7 +13,7 @@ export class KakochoService {
13 13
       name: '鈴木 一郎',
14 14
       furigana: 'すずき いちろう',
15 15
       relationship: '父',
16
-      kaimyo: '〇〇院〇〇居士',
16
+      kaimyo: '光譽明照信士',
17 17
       deathDate: '2024-01-08',
18 18
       ageAtDeath: '88',
19 19
       note: '三回忌対象',
@@ -25,19 +25,19 @@ export class KakochoService {
25 25
       name: '鈴木 ハナ',
26 26
       furigana: 'すずき はな',
27 27
       relationship: '母',
28
-      kaimyo: '〇〇院〇〇大姉',
28
+      kaimyo: '清譽妙蓮大姉',
29 29
       deathDate: '2020-05-12',
30 30
       ageAtDeath: '82',
31 31
       note: '',
32 32
     },
33 33
     {
34
-      id: '2',
34
+      id: '3',
35 35
       dankaId: '2',
36 36
       familyId: '',
37 37
       name: '鈴木 太郎',
38 38
       furigana: 'すずき たろう',
39 39
       relationship: '息子',
40
-      kaimyo: '〇〇院〇〇大姉',
40
+      kaimyo: '慈譽善道信士',
41 41
       deathDate: '2025-01-08',
42 42
       ageAtDeath: '50',
43 43
       note: '',

+ 4
- 4
src/app/share/side-menu/app-side-menu.html Datei anzeigen

@@ -11,6 +11,10 @@
11 11
         檀家一覧
12 12
       </a>
13 13
 
14
+      <a routerLink="/danka-new" routerLinkActive="active" class="menu-button">
15
+        檀家登録
16
+      </a>
17
+
14 18
       <a routerLink="/memorial-list" routerLinkActive="active" class="menu-button">
15 19
         年次法要
16 20
       </a>
@@ -19,10 +23,6 @@
19 23
         まとめて検索
20 24
       </a>
21 25
 
22
-      <a routerLink="/family-tree" routerLinkActive="active" class="menu-button">
23
-        家系図
24
-      </a>
25
-
26 26
 <!--  ユーザー数が増えた際に実装    -->
27 27
 <!--      <a routerLink="/user-setting" routerLinkActive="active" class="menu-button">-->
28 28
 <!--        利用者設定-->

+ 2
- 3
src/app/share/side-menu/app-side-menu.ts Datei anzeigen

@@ -1,10 +1,9 @@
1 1
 import { Component } from '@angular/core';
2
-import { RouterLink } from '@angular/router';
3
-import { DankaList } from '../../pages/danka-list/danka-list';
2
+import { RouterLink, RouterLinkActive } from '@angular/router';
4 3
 
5 4
 @Component({
6 5
   selector: 'app-side-menu',
7
-  imports: [RouterLink, ],
6
+  imports: [RouterLink, RouterLinkActive],
8 7
   templateUrl: './app-side-menu.html',
9 8
   styleUrl: './app-side-menu.scss',
10 9
 })

+ 1
- 1
src/index.html Datei anzeigen

@@ -1,5 +1,5 @@
1 1
 <!doctype html>
2
-<html lang="en">
2
+<html lang="ja">
3 3
 <head>
4 4
   <meta charset="utf-8">
5 5
   <title>戒名管理</title>

Laden…
Abbrechen
Speichern