========================================================================== 2026-05-19 (JST) ellio/printschedule 印刷進行予定表 改修 ========================================================================== 担当: Claude Code セッション 対象: zsystem.jp/ellio/printschedule/(index.php / printschedule.js / printschedule.html) 本番反映: 同日デプロイ済み(zadmin@zsystem.jp:/Users/zadmin/Sites/ellio/printschedule/、md5一致確認・chmod 644) -------------------------------------------------------------------------- 1. モード切替残骸の除去 -------------------------------------------------------------------------- 背景: 過去に「通常モード/管理モード」切替UIを廃止した際、切替コードが残存。 起動時 onload の changeMode() が存在しない #modebutt を参照し 「TypeError: null is not an object (evaluating 'field('modebutt')...')」 が発生していた。 対応: - printschedule.html: body onload を init();changeMode() → init();changeTarget() に変更(初期表示は changeTarget が同等処理)。 死蔵の #normalmode div(46行)を削除。残存していた [CONTENT] プレースホルダも除去(managecontent は JS が即描画するため不要)。 - printschedule.js: 未使用の var mode='normal'; と changeMode() 関数を削除。 - index.php: 未定義 $d を使う無駄クエリ $c=readPrintSchedule('1',$d); と [CONTENT] 置換を削除。 目的: 例外解消とデッドコード一掃。挙動は従来どおり(初期表示は維持)。 -------------------------------------------------------------------------- 2. 検索窓(findfield)が機能していなかった不具合の修正 -------------------------------------------------------------------------- 背景・原因: readPrintschedule(line,date) 先頭の var line=getToggle(...)+1; が 引数 line を上書きし、find() が渡す 'findmode' がサーバーへ届かず、 サーバーの findmode 分岐(orderno/customername の LIKE 検索)に 入らなかった。検索文字列が date パラメータに漏れ、通常一覧の 日付比較に流れて常に空振りしていた。 対応: - printschedule.js: readPrintschedule 先頭を if(line!='findmode') line=getToggle('linenotoggle')+1; に変更。 'findmode' がサーバーへ到達し検索が機能するようにした。 -------------------------------------------------------------------------- 3. ユーザ名(customername)の半角統一 -------------------------------------------------------------------------- 背景: 画面表示 nameCompress() は表示時のみ半角化(mb_convert_kana 'rnak') しており、DB の customername は全角格納が多数。半角キーワードで 検索しても全角格納行(例: YKK AP)に一致せず、検索結果が空に なる事象が判明(「YKK」検索 0件。本来候補739件)。 方針: ユーザ名は格納時に必ず半角化し、画面・検索・格納を rnaks(全角英数→半角・全角カナ→半角カナ・全角空白→半角)で統一。 対応(コード, index.php): - writeFullInfo(手動編集/受注登録保存): username の mb_convert_kana 'KVa'(カナを全角化=逆方向だった)→ 'rnaks'。 - writeScheduleLine(データ取込保存): 受信 customername を 'rnaks' で半角化してから UPDATE する処理を追加。 - nameCompress(表示): 'rnak' → 'rnaks'(格納値=表示形に一致)。 対応(既存データ移行, ellio.buisinessRawdata): - customername を rnaks で一括半角化。対象58,682件中 差分のあった 38,125件を更新(500件×77バッチ、CASE一括、冪等)。 - サーバー負荷確認(load 0.14、ディスク24%)後に実施。 - 移行後、非半角残 0件を確認。バックアップ済テーブル前提で実データ実行。 -------------------------------------------------------------------------- 4. findmode 検索ロジックの簡素化 -------------------------------------------------------------------------- 背景: 3 により customername は全件半角化済み、かつ取込/登録も半角化。 orderno の非ASCIIは3行のみで全て schedulesheetno 空(findmode対象外)。 対応: - index.php findmode: 全角キーワード比較(kwf/RNAKS, orderno/customername 各2 LIKE)を廃止。半角正規化キーワード1本に集約: $kw = mb_convert_kana($date,"rnaks","utf8"); WHERE (orderno LIKE '%$kw%' OR customername LIKE '%$kw%') AND schedulesheetno!='' 全角入力もキーワード側を半角化して一致するため機能・件数は不変 (YKK=739、三和シャッター=515 等で確認)。 -------------------------------------------------------------------------- 補足: 仕様確認事項 -------------------------------------------------------------------------- - findmode の AND schedulesheetno!='' (進行表番号を持つ行のみ検索)は ユーザー判断で「スケジュール済みのみ」を維持(変更せず)。 - 検索対象フィールドは orderno と customername の2つのみ(従来どおり)。 -------------------------------------------------------------------------- 保守メモ: MEMORY.md 棚卸し(同日) -------------------------------------------------------------------------- - reference_servers.md を呼称⇄IP対応表のみに整理(SSH接続詳細は各 ドメイン CLAUDE.md へ集約。重複・不整合を解消)。 - project_inventoryview.md を letip/salesstock/inventoryview/CLAUDE.md 化し memory から削除。 - 完了済 project_zsystem_kaishuu_renkei.md の再利用価値情報 (TZ4回収予定連携仕様)を zsystem.jp/CLAUDE.md へ移管し memory 削除。 ========================================================================== ========================================================================== 2026-05-19 (JST) 追補 ellio/printschedule 検索機能 拡張 ========================================================================== 対象: zsystem.jp/ellio/printschedule/index.php(findmode) 本番反映: 2026-05-19 16:02 JST デプロイ済み (zadmin@zsystem.jp:/Users/zadmin/Sites/ellio/printschedule/index.php、 md5=8ded5b21859622b4514cf1e9cf694681 一致確認・chmod 644) ※ printschedule.js / printschedule.html は前回デプロイから変更なし。 -------------------------------------------------------------------------- 5. 検索対象にサイズ(厚さ・幅・長さ)を追加(数値完全一致) -------------------------------------------------------------------------- 背景: 受注番号・ユーザ名だけでなく、サイズ値でも検索したい要望。 対応: - findmode: キーワードが数値のとき(is_numeric)のみ OR thickness=$kn OR width=$kn OR length=$kn を付与。$kn=$kw+0。thickness/width/length は double 型のため 数値完全一致。非数値キーワード時は付与しない (double='文字'→0 となる誤ヒットを防止)。 - 全角数字入力は rnaks 正規化で半角化してから比較(例 1.6→1.6)。 確認: 1.6→29件、2000→9件、YKK は従来どおり739件(影響なし)。 -------------------------------------------------------------------------- 6. 検索結果を「現在の表示範囲」+「完了フィルタ」に従わせる -------------------------------------------------------------------------- 背景: 従来 findmode は日付範囲・完了フィルタ無視の全期間検索だった。 画面の表示範囲(rangestart〜rangeend)と完了トグル (完了を非表示/すべて表示/完了のみ表示)を検索にも適用したい。 対応(findmode SQL に追加): - 日付範囲: planningdate>='$startdate'(rangestart指定時はその値)、 rangeend 指定時 AND planningdate<='$rangeend'。 境界式はリスト表示(else分岐)と同一表現を踏襲し挙動を一致。 - 完了フィルタ(リスト表示と同一定義): すべて表示(sc=1) → 条件なし 完了のみ(sc=2) → AND printCompleted=1 完了を非表示(既定) → AND (printCompleted=0 OR timestamp>='$today') ※直近完了分は残す(画面リストと同一挙動) - AND schedulesheetno!='' は従来どおり維持。 確認(範囲2026-05-12〜05-26): YKK 739→範囲内45、完了のみ10。 1.6 29→範囲内8、完了のみ6。範囲・完了とも正しく機能。 仕様メモ: 完了を非表示の定義はユーザー判断で「リスト表示と同一 (printCompleted=0 OR timestamp>=今日−15h)」を採用。 ========================================================================== ========================================================================== 2026-05-19 (JST) 追補2 検索窓キーワード保持 & timestamp 副作用是正 ========================================================================== -------------------------------------------------------------------------- 7. 検索中に設定バー操作でキーワードが無視される不具合の修正 -------------------------------------------------------------------------- 対象: zsystem.jp/ellio/printschedule/printschedule.js(changeTarget) 本番反映: 未デプロイ(ローカルのみ・要デプロイ) 背景・原因: 設定バーの期間変更(confirmRangeChange)・表示対象(setCompleted)・ ライン(clickLineNo)は全て changeTarget() を呼ぶが、changeTarget は 常に readPrintschedule('managementmode',今日)=通常一覧を実行し、 検索窓(findfield)のキーワードを見ていなかった。このため検索中に 設定バーを操作すると findmode を抜け通常一覧へ戻っていた。 対応: changeTarget() に「findfield に文字があれば findmode を再実行」を 追加(kw!='' なら readPrintschedule('findmode',encodeURI(kw)))。 設定バー操作は全て changeTarget 経由のため1か所修正で期間・完了・ ライン変更時も検索が維持される。サーバー findmode は表示範囲・完了 フィルタ反映済みのため、期間/完了変更がそのまま再検索に効く。 JS本体 node --check 構文OK。※printschedule.js 未デプロイ。 -------------------------------------------------------------------------- 8. 半角変換移行による timestamp 自動更新の副作用と是正 -------------------------------------------------------------------------- 対象データ: ellio.buisinessRawdata(コード変更なし・データ復元のみ) 事象: 項目3の customername 一括半角化UPDATE(38,125行)実行時、 buisinessRawdata.timestamp が `timestamp DEFAULT CURRENT_TIMESTAMP` (旧MySQL: 先頭TIMESTAMP列はUPDATE時に自動更新)のため、当該 38,125行の timestamp が移行時刻 2026-05-19 14:47 に書き換わった。 結果、findmode の「完了を非表示」条件 (printCompleted=0 OR timestamp>=今日−15h)の後半が真となり、 5/6・5/7 等の古い完了済みが検索結果に表示されていた。 原因切り分け(検証): - バックアップ表 `buisinessrawdata半角変換前` は live と同行数 58,863・PK=id の移行前完全鏡。 - customername が live≠backup の行=38,125(移行被害)。 そのうち timestamp 差異=38,125 / latestupdate 差異=0 (latestupdate はトリガー無し&移行SQLは customername のみSETの ため無傷)。 - customername 一致行の ts/lu 差異は両方0(他要因更新なし)。 是正(実データ実行・サーバー負荷低 load 0.14 環境): UPDATE buisinessRawdata L JOIN `buisinessrawdata半角変換前` B ON L.id=B.id SET L.timestamp=B.timestamp WHERE L.customername<>B.customername; - L.timestamp を明示セットし自動再バンプを回避。 - affected 38,125 / 復元漏れ 0 / timestamp 分布が旧値 (2024-11-23 等)へ回復。移行クラスタ 14:47 消失。 - latestupdate は無傷のため非対象(ユーザー判断: timestampのみ復元)。 是正後の状態: YKK・範囲5/1〜・完了非表示で完了済み表示 46件→3件。 残3件は ts=2026-05-18〜19 の実運用による直近完了で、選択済み定義 「リスト表示と同一」により意図どおり表示(バグではない)。5/6・5/7 の古い完了分は正しく非表示化。 教訓: buisinessRawdata への一括UPDATEは先頭TIMESTAMP列(timestamp)を 自動更新する。timestamp を保持したい一括処理では明示的に timestamp=timestamp 等で据え置くか、対象列を限定すること。 ========================================================================== ========================================================================== 2026-05-20 (JST) ellio/menu スマホ表示対応 + 累積デプロイ ========================================================================== -------------------------------------------------------------------------- 9. ellio/menu スマートフォン表示が小さすぎる不具合の修正 -------------------------------------------------------------------------- 対象: zsystem.jp/ellio/menu/index.php 背景・原因: index.php に が無く、モバイルブラウザが 仮想ビューポート(980px等)で描画→縮小表示となり文字・ボタンが 極端に小さく見えていた。さらに .contentpain { width:1280px } と .menulist { width:480px } が固定幅で、viewport を入れただけ だと逆に横スクロールが発生する状態だった。 対応: -
に viewport メタ追加: - .contentpain を max-width:1280px / width:100% / padding:0 8px / box-sizing:border-box にレスポンシブ化。 - .menulist を width:100% / max-width:480px に変更。 PC時の見た目(1280px中央寄せ・メニュー480px中央寄せ)は維持し、 狭い端末では端末幅に追従。横スクロールなし。 本番反映: 2026-05-20 デプロイ済み(md5=e8953b2f734a5bd39d0b5e6e72d49234 一致、chmod 644)。 -------------------------------------------------------------------------- 保守: ローカル残骸 ellio/menu/index.html を削除 -------------------------------------------------------------------------- menu/CLAUDE.md 記載のとおり ellio/menu は元 index.html → ログイン 機能追加で index.php へ移行済み。サーバーには既に存在せず、ローカル にだけ旧 index.html が残っていたため削除。 -------------------------------------------------------------------------- 追加デプロイ: 項目7(printschedule.js / 検索キーワード保持) -------------------------------------------------------------------------- 2026-05-19 追補2 項目7 として実装後ローカル保留だった printschedule.js(changeTarget で findfield 値がある時は findmode を 再実行する1関数修正)を本日まとめてデプロイ。 - 反映先: /Users/zadmin/Sites/ellio/printschedule/printschedule.js - md5=58a563b0b5bc7396fc3391c2f8b49847 一致、chmod 644 ========================================================================== ========================================================================== 2026-05-21 (JST) ellio/workreportd 「本日分から非表示」機構の修正 ========================================================================== 対象: zsystem.jp/ellio/workreportd/ 本番反映: 2026-05-21 デプロイ済み(md5 一致確認・chmod 644) /Users/zadmin/Sites/ellio/workreportd/index.php md5=03e8e205fc26fee185afe477c659751e /Users/zadmin/Sites/ellio/workreportd/workreport.html md5=27ac444aecf1c2ab7b7d9493de8dbaf5 /Users/zadmin/Sites/ellio/workreportd/workreport.js md5=2c3f2080f026bf151a8ffe2628a3803b -------------------------------------------------------------------------- 10. 利用者報告「手動で非表示にしても消えない」「自動の本日分選別が 機能していない」への調査と修正 -------------------------------------------------------------------------- 利用者報告: 「本日分の自動で表示、非表示を選別している部分が昨日分から、機能 してなさそうです。手動で非表示にする方も非表示になりません。」 調査結果: - 当初は workreport.timestamp の TIMESTAMP 自動更新(buisinessRawdata と同種)を疑ったが、実機検証で否定。DDL は `timestamp` timestamp NULL default CURRENT_TIMESTAMP で ON UPDATE 句なし、UPDATE 実行でもバンプ無しを確認(MySQL 5.0.92)。 - 旧 `hiddenReport()` の実装は UPDATE workreport SET displimit=NULL のみで、本日分 WHERE の `(timestamp>='$today' OR displimit>='$today')` のうち timestamp 起算 24時間条件で残ってしまう → 作成後24h以内の報告 を手動で外せない(=「消したいのに消えない」)。 - 自動非表示は実は動いていた。5/11〜5/18 等の古い投稿が本日分に残るのは 本文中の未来日付(5/22 等)から displimit が自動設定された仕様どおり。 - complete フラグは表示/非表示に一切影響しない(過去 else 分岐に "//complete=0" のコメントアウトが残るのみ)。 対応: hidden フィールドを新設して非表示制御を意味分離。 DB: ALTER TABLE workreport ADD COLUMN hidden TINYINT NOT NULL DEFAULT 0; (1,422行・全hidden=0で初期化、サーバー load 0.10 環境で即時完了) index.php: - 行レンダーループで $hidden を取得し、編集メニュー起動を editmenu($id,$hidden) に変更。 - 本日分(range=1) WHERE に AND hidden=0 を追加。 - hiddenReport() を UPDATE ... SET hidden=1 に変更(displimit は ピン留め用に保持=意味分離)。 - 新規 unhideReport()(SET hidden=0)と switch 分岐 'unhideReport' を追加。 workreport.html: - 編集メニューの「本日分から表示を消す」ボタンに id=hidebutt 付与。 workreport.js: - editmenu(id,hidden) で hidden=1 のときボタンを 「本日分に表示する」 + onclick=unhideReport() に切り替え。 - 新規 unhideReport() 関数(確認ダイアログ→AJAX→再描画→通知)。 挙動: - 本日分タブ: hidden=1 は除外。 - 月別/過去タブ: hidden=1 も表示。これらの行から「…」を開くと ボタン文言が反転し、本日分への再表示が可能。 仕様メモ: - 「非表示」適用範囲は本日分のみ(ユーザー判断)。月別/過去は履歴として そのまま見える。 - 旧 hiddenReport(displimit=NULL)は実効していなかったため、過去に 「外したつもり」の報告は単に自然な aging で消えており、データ修復は 不要。 ========================================================================== ========================================================================== 2026-05-22 (JST) letip/packviewer に Z入力ボタン追加 / letip/index.php セッション復元 ========================================================================== 担当: Claude Code セッション 対象: - zsystem.jp/letip/packviewer/find.php - zsystem.jp/letip/index.php 本番反映: 同日デプロイ済み(md5一致確認・chmod 644) -------------------------------------------------------------------------- 1. packviewer に Z入力ボタン追加 -------------------------------------------------------------------------- 目的: packviewer で表示中のpackをそのまま letip/ のZ入力画面に持ち込めるよう、 情報バー(2行目 #productinfo)に「Z入力」ボタンを設置。 変更: find.php: - 冒頭に session_start() を追加(personid を $_SESSION から取得するため) - buildProductInfo() 冒頭に float:right の Z入力ボタンを挿入。 URL: https://zsystem.jp/letip/?pid={SESSION.personid}&sendsrcpackno={packno} target=_blank で別ウィンドウ表示(window.open)。 - packno と pid は urlencode、URL は htmlspecialchars(ENT_QUOTES) で 属性安全化。 -------------------------------------------------------------------------- 2. letip/index.php セッション/Cookieからの自動ログイン -------------------------------------------------------------------------- 背景: 従来は ?pid= 無しでアクセスすると無条件に PersonForm(作業者コード入力)が 表示されていた。セッションに personid があってもスキップされず冗長。 packviewer 等から飛んできた際にもう一度コード入力させたくない。 変更(letip/index.php): - L19-26 の ?pid= 処理直後に、cookie の personid を $_SESSION に復元する フォールバックを追加。 条件: $_SESSION['personid'] が空 かつ $_COOKIE['personid'] あり かつ referer が空 / zsystem.jp / localhost のいずれか (C案: referer 空も許容、ブックマーク/直接URLも復元対象) - default 分岐を変更: $_SESSION['personid'] あり → SrcPackForm() なし → PersonForm() 仕様メモ(セッション/Cookie寿命): - サーバー設定: session.gc_maxlifetime=1440(24分), cookie_lifetime=0, gc_probability=1/1000 - personid cookie 寿命: 8時間(zcommon.php LoginCheck で setcookie) - cookie 切れ session 生存 → 問題なし(default は $_SESSION 参照) - session 切れ cookie 生存 → 今回追加した復元で再ログイン不要 - 両方切れ → PersonForm 表示(再ログイン必須、想定通り) 未対応(今回スコープ外): - mode=writeDB 等の処理系では personid 未確認のまま実行される懸念 (別途検討) - 操作のたびに cookie 寿命を延長するスライディング対応 ========================================================================== 2026-05-22 (JST) ellio/workreportd タグ機構拡張・カラーパレット改訂・UI調整 ========================================================================== 対象: zsystem.jp/ellio/workreportd/ 本番反映: 2026-05-22 15:47 JST デプロイ済み /Users/zadmin/Sites/ellio/workreportd/workreport.html md5=0110fc9ae3de30e110a5386be328de29 一致確認・chmod 644 ※ index.php は前回までに同 md5(b0e0cdfaab14ab46ffb41e926dca9ccd)反映済 -------------------------------------------------------------------------- 11. タグの表示順序を tagcode から独立した displayorder で制御 -------------------------------------------------------------------------- 背景: 従来 ORDER BY tagcode(文字列)で並べていたため、tagcode の桁数や 英字混在を導入すると並びが破綻する。色も先頭1文字に縛られていた。 対応: - DB: workreportTagList に displayorder INT NOT NULL DEFAULT 0 追加。 初期値は CAST(tagcode AS UNSIGNED) で既存並びを保持。 既存 tagcode 値は1件も変更せず(実データ移行なし)。 - index.php: line 117: ORDER BY tagtype,tagcode → ORDER BY tagtype,displayorder line 343: ORDER BY tagcode → ORDER BY displayorder - 色決定(substr(tagcode,0,1))と親判定(末尾=='0')は不変。3桁・英字 先頭の tagcode も既存ロジックで自然に当たる設計。 -------------------------------------------------------------------------- 12. 公式カラーパレット改訂(color0-9 微調整+colorA-G 新設) -------------------------------------------------------------------------- 背景: 既存10色だけでは新タグ追加時に区別が付きにくい色が混在。未使用候補色 と区別が付くよう既存7色を微調整し、未使用候補色を予約クラスとして 正式採用しパレット17色化。 対応: workreport.html の .colorN CSS を更新。 .color0: #666 → #555 (未使用) .color1: #46f → #69f (依頼対応) .color2: #e70 → #f50 (作業関連) .color3: #4ae → #5cf (連絡事項) .color5: #e6e → #f3f (社内依頼) .color7: #7b0 → #5a0 (知の習得) .color8: #cc0 → #fd0 (設備) .color4(#282 安全報告)/.color6(#e44 品質)/.color9(#a4e その他) は近接候補が無く据置。 新設 .colorA #888 / .colorB #0bc / .colorC #8c0 / .colorD #f80 .colorE #06c / .colorF #c39 / .colorG #a82 workreportd/CLAUDE.md に「## 公式カラーパレット」セクション保存。 -------------------------------------------------------------------------- 13. タグ「生産情報」を追加(両部門、displayorder=65、colorF) -------------------------------------------------------------------------- 対象データ: workreportTagList(コード変更なし、INSERT/UPDATE) 推移: - 初回: tagcode='31', displayorder=31(連絡事項と同色のサブ扱い)で挿入 - 方針変更により色独立を選択 → tagcode='B00'(colorB ティール)に変更 - さらに colorF(#c39 ピンク/ローズ)へ変更 → tagcode='F00' - 位置を「品質の後」に変更 → displayorder=65(不具合・事故61 と 知の習得70 の間) 最終状態: 梱包/シャーリング 両方に id=48(梱包), id=49(シャーリング) tagcode='F00' / displayorder=65 / tagtype=NULL(重要、下記参照) 仕様メモ(tagtype NULL の重要性): 既存タグ12件は全て tagtype IS NULL(NULL)格納。INSERT時に空文字'' で入れると ORDER BY tagtype,displayorder で NULL→'' の順になり、 '' を持つ行が末尾に押し出される(item 14 で発覚し UPDATE で NULL化)。 今後のタグ追加では tagtype は NULL を明示すること。 -------------------------------------------------------------------------- 14. 「生産情報」がソート末尾になる不具合の修正(tagtype NULL化) -------------------------------------------------------------------------- 事象: ローカル動作確認で、新規登録画面・一覧画面のソートセレクターとも 生産情報が末尾に表示される。displayorder=65 は正しいのに 90 の後に 来てしまう。 原因: 生産情報行の tagtype が空文字''で挿入されており、他既存タグ(tagtype IS NULL)と混在。ASCソートで NULL → '' の順に並ぶため、'' を持つ 生産情報が NULL 群の後に来て末尾化。 対応: UPDATE workreportTagList SET tagtype=NULL WHERE tagname='生産情報' 両部門 affected=2。 -------------------------------------------------------------------------- 15. シャーリング画面のソートセレクター2行化を1行に収める -------------------------------------------------------------------------- 背景: シャーリングはトップレベル10タグ+「全て」セレクター=11チップ。 従来 .sorttagarea div の width が calc(100%/10 - 1px) 固定で 10枠しか無く、11個目が改行されていた。 対応: workreport.html: width 計算を /10 → /11 に変更(既定値と @media (min-width:640px) の両方)。梱包(10チップ)も /11 で 各チップが約9%幅となり余裕。 -------------------------------------------------------------------------- 16. 過去全体/日付指定ボタンがモバイルで改行される問題の修正 -------------------------------------------------------------------------- 背景: #ymcap(calc(100% - 144px))内に 月ラベル+過去全体+日付指定 を flex で並べているが、ボタン padding 10px / gap 10px が狭幅で オーバーフロー→改行されていた。 対応: workreport.html: @media screen and (max-width: 639px) を追加し #ymcap の gap を 10px→4px、#allpastbutt/#datepickbutt の padding を 2px 10px → 2px 4px に縮小。 PC等 640px 以上では従来どおりの余白を維持。 ========================================================================== ========================================================================== 2026-05-27〜29 売上実績表(letip/salesreport)の罫線・スクロール表示改善 ========================================================================== -------------------------------------------------------------------------- 17. 年月変更時に chargerselect の選択が保持されない不具合 -------------------------------------------------------------------------- 背景: 画面上部の年・月を変更すると、担当者リストを再構築する過程で 個人担当者選択が「全体」にリセットされていた。 updateChargers() で sel.remove() により選択中の option が消えると ブラウザが sel.value を '' に戻す。新リスト追加後に found 判定で 「!found のときだけ '' を再設定」していたため、found=true でも 選択が復元されていなかった。 対応: salesreport.js: `sel.value = found ? current : '';` に変更し found=true の時も current 値を明示的に再設定。 -------------------------------------------------------------------------- 18. 合計カテゴリの構造拡張と罫線整理 -------------------------------------------------------------------------- 背景: 合計ブロックのカテゴリーラベルが rowspan=8(納品4+回収4)で 増減行・1日平均行に余分な空 cat-label が出ていた。 さらに 1日平均行の bottom が二重線、ネットや 増減 のグレー線 混在で見栄えが揃わない状態だった。 対応: index.php: 合計 cat-label を rowspan=10 に拡張し、増減・1日平均 行の空 cat-label を削除。1日平均行に `avg-row` クラスを付与。 salesreport.html: .avg-row td に border-bottom: 2px solid #000、 .sum-section td.cat-label の bottom も border-bottom: 2px に 実 border 化(box-shadow から変更し、y 位置ずれを解消)。 -------------------------------------------------------------------------- 19. 各種カテゴリブロック・pending セクションの罫線整列 -------------------------------------------------------------------------- 背景: cat-label / net-row / src-label / sub-label の box-shadow が グレー細線として残り、隣接 grp-start の太線と二重に見える、 新規件数行や section-title 行の上ボーダーが部分的に細い、等。 対応: salesreport.html: - .cat-label の bottom box-shadow(1px グレー)を削除 - .net-row td.net-label の box-shadow を none - .src-label / .sub-label の bottom box-shadow を実 border-bottom に置換(border-collapse で next 行の太線が確実に勝つ) - .newcount-row td に border-top: 2px solid #000 を追加し 新規件数行の上ボーダーを全幅で太く - .pending-section:not(.section-title) td.cat-label に border-bottom 1px グレーで cat 列の区切りを補完 - .sub-label の bottom を黒に変更(細線統一) -------------------------------------------------------------------------- 20. sticky 列(total-col / ytd-col)の左右罫線方針確立 -------------------------------------------------------------------------- 背景: sticky 列の左右罫線を box-shadow で描いていたが、inset では top/bottom が border 領域分欠ける、outset では隣接セル背景に 覆われて消える、両側に付けると幅 4px に重なる、など試行錯誤。 ボディとヘッダで描画位置(インセット内 vs アウトセット外)が 異なり 2px ずれて見える問題も発生。 方針確立: - 各 sticky 列の右ボーダーだけを担当 - 一番左のセルの左ボーダーは隣(title/資産元/src-label 等)が右で描画 - 横スクロール時の border 流れ対策で box-shadow を採用 - body は outset 左 + 最右セルは outset 両側(:has(+ td:not(.ytd-col))) - header は inset 右が基本、最右 ytd-col は :has で outset 右に切替 (body と x 位置を一致) 対応: salesreport.html: - .total-col / .ytd-col: 左右 border を none、box-shadow で描画 - .ytd-col 最右に `:has(+ td:not(.ytd-col))` で outset 右追加 - thead tr:first-child th:first-child(title)に inset 右 2px - thead tr:last-child th:nth-child(3)(資産元)に inset 右 2px - thead 月計に outset 右 2px、最右 ytd-col も同様 - thead ytd-col + th:not(.ytd-col) で day1 セルの左 inset 0.5px を消し、二重線を防止 -------------------------------------------------------------------------- 21. z-index 階層整理(横スクロール時の重なり問題) -------------------------------------------------------------------------- 背景: 横スクロール時に (a) 右側 body セルが thead に被る (b) 日付ヘッダが年度内月計セルの上に重なる という問題が発生。 要件: - 左3列(カテゴリ/区分/資産元)+ title + 月計 + ytd-cols: 最高 z - 日付ヘッダ: 中位 z - body cells: 最低 z 対応: salesreport.html: - thead th z-index 2 → 10(日付ヘッダ) - `#salesreporttable thead .ytd-col` で z-index 20(ID付きで specificity を上げ、thead th 10 を確実に上書き) index.php: - $sh / $sh2 の z-index を 4,5 → 20,20 に引き上げ -------------------------------------------------------------------------- 備考: 本シリーズ全体で「border は collapse の幅差をうまく扱える反面、 sticky 列で横スクロール時にちらつく」「box-shadow は安定だが inset/outset・描画順序・stacking context の制約が厳しい」という 両者のトレードオフを整理し、用途別の使い分けに落ち着けた。 ==========================================================================