| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- import { Component, OnInit } from '@angular/core';
- import { RouterLink } from '@angular/router';
- import { DankaService } from '../../services/dankaService';
- import { FamilyService } from '../../services/family-service';
- import { AppHeader } from '../../share/header/app-header';
- import { AppSideMenu } from '../../share/side-menu/app-side-menu';
- import { Danka } from '../../models/danka';
- import { FormsModule } from '@angular/forms';
-
- type KanaRowValue =
- | 'all'
- | 'a'
- | 'ka'
- | 'sa'
- | 'ta'
- | 'na'
- | 'ha'
- | 'ma'
- | 'ya'
- | 'ra'
- | 'wa';
-
- @Component({
- selector: 'app-danka-list',
- imports: [AppHeader, AppSideMenu, RouterLink, FormsModule],
- templateUrl: './danka-list.html',
- styleUrl: './danka-list.scss',
- })
- export class DankaList implements OnInit {
- dankaList: Danka[] = [];
- filterDankaList: Danka[] = [];
- searchKeyword: string = '';
- dankaDisplay: number = 0;
- selectedFilter = 'all';
- selectedKanaRow: KanaRowValue = 'all';
-
- kanaRows: { label: string; value: KanaRowValue }[] = [
- { label: '全件', value: 'all' },
- { label: 'あ行', value: 'a' },
- { label: 'か行', value: 'ka' },
- { label: 'さ行', value: 'sa' },
- { label: 'た行', value: 'ta' },
- { label: 'な行', value: 'na' },
- { label: 'は行', value: 'ha' },
- { label: 'ま行', value: 'ma' },
- { label: 'や行', value: 'ya' },
- { label: 'ら行', value: 'ra' },
- { label: 'わ行', value: 'wa' },
- ];
-
- private readonly kanaRowMap: Record<Exclude<KanaRowValue, 'all'>, string[]> = {
- a: ['あ','い','う','え','お','ア','イ','ウ','エ','オ'],
- ka: ['か','き','く','け','こ','が','ぎ','ぐ','げ','ご','カ','キ','ク','ケ','コ','ガ','ギ','グ','ゲ','ゴ'],
- sa: ['さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','サ','シ','ス','セ','ソ','ザ','ジ','ズ','ゼ','ゾ'],
- ta: ['た','ち','つ','て','と','だ','ぢ','づ','で','ど','タ','チ','ツ','テ','ト','ダ','ヂ','ヅ','デ','ド'],
- na: ['な','に','ぬ','ね','の','ナ','ニ','ヌ','ネ','ノ'],
- ha: ['は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ハ','ヒ','フ','ヘ','ホ','バ','ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ'],
- ma: ['ま','み','む','め','も','マ','ミ','ム','メ','モ'],
- ya: ['や','ゆ','よ','ヤ','ユ','ヨ'],
- ra: ['ら','り','る','れ','ろ','ラ','リ','ル','レ','ロ'],
- wa: ['わ','を','ん','ワ','ヲ','ン'],
- };
-
- constructor(
- private dankaService: DankaService,
- private familyService: FamilyService,
- ) {}
-
- // 非同期初期化
- ngOnInit(): void {
- this.init();
- }
-
- async init(): Promise<void> {
- this.dankaList = await this.dankaService.getDankaList();
- this.showAllDanka();
- }
-
- showAllDanka() {
- this.selectedFilter = 'all';
- this.selectedKanaRow = 'all';
- this.searchKeyword = '';
- this.filterDankaList = this.dankaList;
- this.dankaDisplay = this.filterDankaList.length;
- }
-
- filterPhoneAvailable() {
- this.selectedFilter = 'phone';
- this.selectedKanaRow = 'all';
-
- this.filterDankaList = this.dankaList.filter((danka) =>
- danka.phones.some((phone) => phone.tel.trim() !== '')
- );
-
- this.dankaDisplay = this.filterDankaList.length;
- }
-
- searchDanka() {
- this.selectedFilter = 'search';
- this.selectedKanaRow = 'all';
-
- const keyword = this.searchKeyword.trim();
-
- if (keyword === '') {
- this.showAllDanka();
- return;
- }
-
- this.filterDankaList = this.dankaList.filter((danka) =>
- danka.householdName.includes(keyword) ||
- danka.householdFurigana.includes(keyword) ||
- danka.householder.includes(keyword) ||
- danka.householderFurigana.includes(keyword) ||
- danka.postalCode.includes(keyword) ||
- danka.address.includes(keyword) ||
- danka.phones.some((p) => p.tel.includes(keyword) || p.note.includes(keyword))
- );
-
- this.dankaDisplay = this.filterDankaList.length;
- }
-
- filterByKanaRow(row: KanaRowValue): void {
- this.selectedFilter = 'kana';
- this.selectedKanaRow = row;
- this.searchKeyword = '';
-
- if (row === 'all') {
- this.showAllDanka();
- return;
- }
-
- this.filterDankaList = this.dankaList.filter(async (danka) => {
- const firstKana = (await this.getDankaSortText(danka)).charAt(0);
- return this.kanaRowMap[row].includes(firstKana);
- });
-
- this.dankaDisplay = this.filterDankaList.length;
- }
-
- clearDanka() {
- this.selectedFilter = '';
- this.selectedKanaRow = 'all';
- this.searchKeyword = '';
- this.filterDankaList = [];
- this.dankaDisplay = 0;
- }
-
- private async getDankaSortText(danka: Danka): Promise<string> {
- const householderName = this.normalizeName(danka.householder);
-
- const householderFamily = (await this.familyService
- .getFamiliesByDankaId(danka.id))
- .find((f) => this.normalizeName(f.name) === householderName);
-
- return (householderFamily?.furigana || danka.householder).trim();
- }
-
- private normalizeName(name: string): string {
- return name.replace(/\s/g, '');
- }
- }
|