Преглед на файлове

[add]

<檀家一覧>
タブについて全件は残して、行順タブを追加

<檀家一覧(家族)>
氏名・ふりがな・生年月日・年齢・関係・備考
poohr преди 3 седмици
родител
ревизия
2c5ae879e4

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

@@ -210,9 +210,9 @@
210 210
                   <div class="family-table-header">
211 211
                     <div>氏名</div>
212 212
                     <div>ふりがな</div>
213
-                    <div>関係</div>
214
-                    <div>年齢</div>
215 213
                     <div>生年月日</div>
214
+                    <div>年齢</div>
215
+                    <div>関係</div>
216 216
                     <div>備考</div>
217 217
                     <div>操作</div>
218 218
                   </div>
@@ -228,7 +228,7 @@
228 228
                       </div>
229 229
 
230 230
                       <div>
231
-                        {{ family.relationship || '未登録' }}
231
+                        {{ family.birthDate || '未登録' }}
232 232
                       </div>
233 233
 
234 234
                       <div>
@@ -236,7 +236,7 @@
236 236
                       </div>
237 237
 
238 238
                       <div>
239
-                        {{ family.birthDate || '未登録' }}
239
+                        {{ family.relationship || '未登録' }}
240 240
                       </div>
241 241
 
242 242
                       <div>

+ 10
- 17
src/app/pages/danka-list/danka-list.html Целия файл

@@ -31,23 +31,16 @@
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 Целия файл

@@ -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
-}

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

@@ -1,11 +1,25 @@
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 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';
22
+
9 23
 @Component({
10 24
   selector: 'app-danka-list',
11 25
   imports: [AppHeader, AppSideMenu, RouterLink, FormsModule],
@@ -18,8 +32,38 @@ export class DankaList {
18 32
   searchKeyword: string = '';
19 33
   dankaDisplay: number = 0;
20 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
+  };
21 62
 
22
-  constructor(private dankaService: DankaService) {
63
+  constructor(
64
+    private dankaService: DankaService,
65
+    private familyService: FamilyService,
66
+  ) {
23 67
     this.dankaList = this.dankaService.getDankaList();
24 68
     this.showAllDanka();
25 69
   }
@@ -27,6 +71,7 @@ export class DankaList {
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() !== '');
@@ -45,6 +91,7 @@ export class DankaList {
45 91
   //検索処理
46 92
   searchDanka() {
47 93
     this.selectedFilter = 'search';
94
+    this.selectedKanaRow = 'all';
48 95
     //検索欄に入力された値から余白を削除
49 96
     const keyword = this.searchKeyword.trim();
50 97
     //検索欄が空の場合は檀家の一覧を表示
@@ -68,10 +115,42 @@ export class DankaList {
68 115
     console.log(this.dankaDisplay);
69 116
   }
70 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
+
71 136
   clearDanka() {
72 137
     this.selectedFilter = '';
138
+    this.selectedKanaRow = 'all';
73 139
     this.searchKeyword = '';
74 140
     this.filterDankaList = [];
75 141
     this.dankaDisplay = 0;
76 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
+  }
77 156
 }

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