Skip to content

Commit 88e8dfa

Browse files
committed
ピンの表示を絞り込みに統一し、画面の呼称を「経路」にそろえる
ピンの表示と線の表示を分けた。ピン(スポット)は絞り込み(シリーズ・ カテゴリ・訪問状況)と非表示に全部従い、ルート・経路に含まれていても 例外にしない。かつては「線が通っているのにピンが無い」のを避けるため 表示中ルートの経由地と経路のスポットを免除していたが、どのスポットが なぜ出ているのかを絞り込みから読めなくしていた。判定は本体と重ね表示で 同じ形の1式だけにした(重ね表示側にあった本体とのずれ——訪問済みの 扱い・下書きの欠落——も免除ごと無くなった)。 線の方は経由地が絞り込み・非表示で消えてもそのスポットを通る形のまま 描く(道のりが歪まないように)。ルートの線は route.points の座標から、 経路は spots 全件から解決していて、ピンを絞った集合とは無関係。 例外は「これだけを表示」だけで、これは絞り込みより優先する——重ねると 訪問状況の既定(未訪問のみ)では訪問順が1件も残らないため。 経路詳細に、何の線を見ているかのラベル(経路/訪問順/訪問予定リスト)と、 各地点のランク(シリーズ)のバッジを出すようにした。バッジはそのスポットが 属する種別のシリーズ設定で描く——経路には別種別のスポットが混じるので、 本体の設定を当てると色もラベルもずれる。 あわせて画面の呼称を「経路」に統一した。route の訳がそのまま「経路」で、 管理画面から入れる実体(ルート)と記録から引かれる線(経路)が同じ語に なっていたため。実体を「経路」、記録から引かれる線を「訪問順」「訪問予定 リスト」と呼び分ける。DB・CSV・コードの識別子は route のまま (travel-log-data の routes.csv と取り込み側を巻き込まないため)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 682bc99 commit 88e8dfa

6 files changed

Lines changed: 172 additions & 116 deletions

File tree

CLAUDE.md

Lines changed: 23 additions & 6 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
- **非表示スポット**。興味のない公開スポットを、ユーザーごとに自分の地図・一覧から非表示にできる(他のユーザーには影響しない)
1515
- **口コミ**(公開・本文のみのシンプルな投稿)
1616
- スポットには「種別」があり(観光地・郵便局・御朱印など)、種別ごとに独立したURL・独自のシリーズ/カテゴリ/対象地域を持てる。管理者が自由に追加・削除できる
17-
- **ルート(巡った順の矢印)**。スポットを巡った順に繋いだラインと進行方向の矢印を地図に表示できる(訪問順のある種別向け。CSVで取り込み、絞り込みモーダルの「ルートを表示」トグルでオン/オフする。シリーズ・カテゴリの絞り込みにも連動)。線をタップするとルート詳細(ルート名・説明・全経由地の一覧。経由地の間には区間ごとの説明=移動手段なども出せる)が開く。ルートはスポットと同じ公開/非公開の仕組みを持ち、公開ルートは公開スポットのダウンロード時に一緒に端末へ保存される
17+
- **経路(巡った順の矢印)**。スポットを巡った順に繋いだラインと進行方向の矢印を地図に表示できる(訪問順のある種別向け。CSVで取り込み、絞り込みモーダルの「経路を表示」トグルでオン/オフする。シリーズ・カテゴリの絞り込みにも連動)。線をタップするとルート詳細(ルート名・説明・全経由地の一覧。経由地の間には区間ごとの説明=移動手段なども出せる)が開く。ルートはスポットと同じ公開/非公開の仕組みを持ち、公開ルートは公開スポットのダウンロード時に一緒に端末へ保存される
1818
- **訪問日での絞り込み**。自分の訪問記録がある日を新しい順のドロップダウンから1日選ぶと、その日に訪問したスポットだけが残り、地図では訪問した順に矢印で結んだ「その日の軌跡」が表示される
1919
- 種別ごとに**対象地域**を選べる(既定は日本=都道府県、特定の国=州・県、世界全体=国ごと)
2020
- **PWA対応**(インストール可能)。スマホの「ホーム画面に追加」やPCブラウザのインストール機能で、アドレスバーなしの独立アプリとして起動できる(オフライン対応は未実装)
@@ -184,9 +184,9 @@ docker compose pull && docker compose up -d
184184

185185
| パス | 内容 |
186186
|---|---|
187-
| `/[type]/map` | 地図(ホーム)。シリーズ・訪問状態・カテゴリでフィルタ。ピンタップ→スポット詳細モーダルへ。別の種別のダウンロード済み公開スポットを半透明で重ねて表示することもできる(複数の種別を同時に重ねられる。タップで読み取り専用の詳細を表示し、そこから訪問記録と今の種別の訪問予定リストへの追加ができる)。ルートや経路の詳細からはGoogle マップの経路検索で開ける。左下に今表示中のスポット種別名を小さく表示 |
187+
| `/[type]/map` | 地図(ホーム)。シリーズ・訪問状態・カテゴリでフィルタ。ピンタップ→スポット詳細モーダルへ。別の種別のダウンロード済み公開スポットを半透明で重ねて表示することもできる(複数の種別を同時に重ねられる。タップで読み取り専用の詳細を表示し、そこから訪問記録と今の種別の訪問予定リストへの追加ができる)。経路・訪問順・訪問予定リストの詳細からはGoogle マップの経路検索で開ける。左下に今表示中のスポット種別名を小さく表示 |
188188
| `/[type]/spots` | 「都道府県から探す」(地域別ドリルダウン)と「シリーズから探す」(検索+絞り込み+ページング)の2タブ |
189-
| `/[type]/admin` | (管理者・スポット管理者専用)スポットの承認待ちキュー・追加・編集・削除・CSVインポート・ルート(巡った順の矢印)のインポート・travel-log-dataへの還元用エクスポート(手動追加した公開スポットと画面から削除したCSV由来スポットの一覧をMarkdownでダウンロード)。adminのみキー一覧を指定しての削除・GitHubリポジトリ(travel-log-data形式)からの一括取り込み・スポット種別の管理・ユーザー管理も可能 |
189+
| `/[type]/admin` | (管理者・スポット管理者専用)スポットの承認待ちキュー・追加・編集・削除・CSVインポート・経路(巡った順の矢印)のインポート・travel-log-dataへの還元用エクスポート(手動追加した公開スポットと画面から削除したCSV由来スポットの一覧をMarkdownでダウンロード)。adminのみキー一覧を指定しての削除・GitHubリポジトリ(travel-log-data形式)からの一括取り込み・スポット種別の管理・ユーザー管理も可能 |
190190
| `/[type]/account` | 自分のロール表示、ログアウト、他のスポット種別への切り替え |
191191
| `/login` | メールログイン、または Google でログイン(任意、要設定) |
192192

@@ -240,13 +240,13 @@ name,name_kana,lat,lng,region,series,categories,description,key
240240
- 必須列: `name`, `lat`, `lng`, `region``series`/`categories`は自由入力。
241241
`categories`は1スポットに複数付けられ、パイプ区切りで書く(列ごと省略した場合は
242242
既存スポットのカテゴリを変更しない)。`key`は省略可の種別内一意な参照キー
243-
(ルートCSVがスポットを指すのに使う)
243+
(経路のCSVがスポットを指すのに使う)
244244
- 上記以外の列がヘッダーにあるとインポートを中止する。綴り違いや旧フォーマットの
245245
CSVが、値の欠けた状態で黙って取り込まれるのを防ぐため
246246
- 差分更新(`key`一致を最優先、無ければ`name`+`lat`+`lng`の完全一致で同一判定)。
247247
一致した既存スポットは内容が違えばCSVの内容で上書きされるため、CSV側の修正も
248248
再アップロードだけで反映され、同じCSVを何度アップロードしても重複登録されない
249-
- スポットを巡った順に矢印で繋ぐルートは、別ファイル`routes.csv`(列:
249+
- スポットを巡った順に矢印で繋ぐ経路は、別ファイル`routes.csv`(列:
250250
`route,series,seq,spot_key,description,leg_description`)を同じ管理画面から
251251
スポットCSVの後に取り込む(スキーマの詳細はtravel-log-data/README.md参照)
252252
- **CSVから行を消してもDBからは消えない**(差分更新はCSVに無い行に触らないため)。

app/api/routes/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export async function POST(request: Request) {
126126
)
127127
) {
128128
return NextResponse.json(
129-
{ error: "各ルートには name と2件以上の points が必要です。" },
129+
{ error: "各経路には name と2件以上の points が必要です。" },
130130
{ status: 400 }
131131
);
132132
}
@@ -154,7 +154,7 @@ export async function POST(request: Request) {
154154
);
155155
if (validRows.length !== allSpotIds.length) {
156156
return NextResponse.json(
157-
{ error: "この種別に存在しないスポットがルートに含まれています。" },
157+
{ error: "この種別に存在しないスポットが経路に含まれています。" },
158158
{ status: 400 }
159159
);
160160
}

components/AdminView.tsx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,7 +1269,7 @@ export default function AdminView({
12691269
throw new Error("インポートに失敗しました: " + error.message);
12701270
}
12711271
return (
1272-
`${changed.length}本のルートを追加・更新しました` +
1272+
`${changed.length}本の経路を追加・更新しました` +
12731273
(unchangedCount > 0
12741274
? `(${unchangedCount}本は既存と同一のためスキップ)。`
12751275
: "。")
@@ -1489,7 +1489,7 @@ export default function AdminView({
14891489
if (
14901490
!confirm(
14911491
`「${repo}」から「${entry.label}」(${key})のデータを取得して適用します。` +
1492-
`スポット種別が無ければ作成し、あれば設定・スポット・ルートを上書きします。` +
1492+
`スポット種別が無ければ作成し、あれば設定・スポット・経路を上書きします。` +
14931493
`よろしいですか?`
14941494
)
14951495
)
@@ -1569,7 +1569,7 @@ export default function AdminView({
15691569
]);
15701570
if (spotsError || routesError) {
15711571
throw new Error(
1572-
"ルート検証用のデータ取得に失敗しました: " +
1572+
"経路の検証用のデータ取得に失敗しました: " +
15731573
(spotsError?.message ?? routesError?.message ?? "")
15741574
);
15751575
}
@@ -1605,7 +1605,7 @@ export default function AdminView({
16051605
const handleDeleteRoute = async (route: SpotRoute) => {
16061606
if (
16071607
!confirm(
1608-
`ルート${route.name}」(経由地${route.points.length}件)を削除しますか?` +
1608+
`経路${route.name}」(経由地${route.points.length}件)を削除しますか?` +
16091609
`スポット自体は削除されません。`
16101610
)
16111611
)
@@ -1996,7 +1996,7 @@ export default function AdminView({
19961996
{regionFieldLabel(currentRegionScope)})を入れる。
19971997
series/categoriesは自由入力で空でも可。categoriesは1スポットに複数
19981998
付けられ、パイプ区切りで書く(例: 自然|夜景|展望)。keyは省略可の
1999-
種別内一意な参照キーで、ルートCSVからスポットを指すのに使う)。
1999+
種別内一意な参照キーで、経路のCSVからスポットを指すのに使う)。
20002000
</HelpTip>
20012001
</h3>
20022002

@@ -2161,7 +2161,7 @@ export default function AdminView({
21612161
{currentTypeLabel}」({typeKey})の公開スポットを全件削除する
21622162
(承認待ち・却下・非公開のスポットは残る)。削除される公開スポットに
21632163
紐づく訪問記録・訪問予定・口コミ・写真は全ユーザー分まとめて削除され、
2164-
元に戻せない(ルートも全て削除される)。CSVインポート用データを外部で
2164+
元に戻せない(経路も全て削除される)。CSVインポート用データを外部で
21652165
作り直した際などに、一度空にしてから入れ直す用途を想定。
21662166
</HelpTip>
21672167
</h3>
@@ -2216,24 +2216,24 @@ export default function AdminView({
22162216

22172217
<div className="mt-3 border-t border-gray-100 pt-3">
22182218
<h3 className="mb-2 flex items-center gap-1.5 text-base font-bold">
2219-
ルート(巡った順の矢印)のインポート
2219+
経路(巡った順の矢印)のインポート
22202220
<HelpTip>
2221-
スポットを巡った順に矢印で繋ぐルートをCSVで取り込み、地図に表示する。
2221+
スポットを巡った順に矢印で繋ぐ経路をCSVで取り込み、地図に表示する。
22222222
CSV列は {ROUTE_CSV_COLUMNS.join(", ")}(series・description・
22232223
leg_descriptionは省略可)。
2224-
routeはルート名、seqは巡った順の番号(ルート内で一意なら飛び番でもよい)、
2224+
routeは経路名、seqは巡った順の番号(経路内で一意なら飛び番でもよい)、
22252225
spot_keyはスポットCSVのkey列の値。seriesにこの種別のシリーズ値を入れると、
22262226
矢印がそのシリーズの縁取り色で描かれ、地図のシリーズ絞り込みにも
2227-
連動する(表示中のルートの経由地は、スポット自体のシリーズが
2228-
絞り込みで外れていてもピンが表示される)。descriptionはルート全体の説明文で
2229-
地図でルートの線をタップすると出る詳細の先頭に表示される
2230-
series・descriptionはルート単位の値なので、同じrouteの行には
2227+
連動する(経由地のピンは絞り込みに従うが、線は絞り込みで消えた
2228+
経由地もそのまま通る)。descriptionは経路全体の説明文で
2229+
地図で経路の線をタップすると出る詳細の先頭に表示される
2230+
series・descriptionは経路単位の値なので、同じrouteの行には
22312231
すべて同じ値を書く(空欄なら既定色・説明なし)。
22322232
leg_descriptionは行単位の値で、その行のスポットから次のスポットへの
2233-
区間の説明(移動手段など)。ルート詳細の経由地一覧で2点の間に表示される
2233+
区間の説明(移動手段など)。経路詳細の経由地一覧で2点の間に表示される
22342234
(次の区間が無い最終地点の行は空欄にする)。
2235-
差分更新: 既存と同名のルートは
2236-
シリーズ・説明・経由地を丸ごと置き換え、CSVに無いルートには触らない
2235+
差分更新: 既存と同名の経路は
2236+
シリーズ・説明・経由地を丸ごと置き換え、CSVに無い経路には触らない
22372237
取り込みの前に、spot_keyが指すスポットをスポットCSVでインポートして
22382238
おくこと(key未設定のスポットは参照できない)。
22392239
</HelpTip>
@@ -2247,7 +2247,7 @@ export default function AdminView({
22472247

22482248
<div className="mb-3">
22492249
<label className="inline-block cursor-pointer rounded-lg border border-gray-300 bg-white px-3 py-1.5 text-sm">
2250-
{importingRoutes ? "インポート中…" : "ルートCSVインポート"}
2250+
{importingRoutes ? "インポート中…" : "経路CSVインポート"}
22512251
<input
22522252
type="file"
22532253
accept=".csv,text/csv"
@@ -2299,7 +2299,7 @@ export default function AdminView({
22992299
スポット種別の一覧を取得して表示する(mainブランチ)。一覧から
23002300
種別を選ぶと、そのフォルダの settings.json・spots.csv・
23012301
exclude.txt・routes.csv が順に適用される。スポット種別が
2302-
無ければ作成し、あれば設定・スポット・ルートを上書きする
2302+
無ければ作成し、あれば設定・スポット・経路を上書きする
23032303
(それぞれ個別インポートと同じ差分更新)。exclude.txtによる削除は、
23042304
削除件数の確認ダイアログにOKしたときだけ実行される。
23052305
</HelpTip>

components/FilterBar.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,14 @@ export default function FilterBar({
350350
{showRouteToggle && (
351351
<div className="border-t border-gray-100 pt-3">
352352
<span className="mb-1 flex items-center gap-1.5 text-xs font-medium text-gray-500">
353-
ルート
353+
経路
354354
<HelpTip>
355-
オンにすると、巡った順の矢印(ルート)を地図に表示します。シリーズ・カテゴリで絞り込み中は、該当するルートだけに絞られます
355+
オンにすると、巡った順の矢印(経路)を地図に表示します。シリーズ・カテゴリで絞り込み中は、該当する経路だけに絞られます
356356
</HelpTip>
357357
</span>
358358
<div className="flex flex-wrap gap-1.5">
359359
<Chip
360-
label="ルートを表示"
360+
label="経路を表示"
361361
active={filters.showRoutes}
362362
activeClassName={ALL_CHIP_ACTIVE_CLASS}
363363
onClick={() =>

0 commit comments

Comments
 (0)