haori 0.41.4 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -940,6 +940,16 @@ export declare class Core {
940
940
  * DOM要素を表現し、子ノードを持つことができます。
941
941
  */
942
942
  declare class ElementFragment extends Fragment {
943
+ /**
944
+ * `<input type="number">` が値として受け付ける文字列の形。
945
+ *
946
+ * 省略可の `-`、数字列、省略可の小数部、省略可の指数部で、先頭が `.` の小数も
947
+ * 受け付けます(Chromium で実測した受理範囲)。`+5` / `5.` / `0x10` / `1_000` /
948
+ * 前後に空白のある数字 / `Infinity` はブラウザが空表示にするため受け付けません。
949
+ * ここを緩めると、画面に出ていない値が収集・送信されます(仕様「収集は DOM を
950
+ * 真とする」)。
951
+ */
952
+ private static readonly NUMBER_INPUT_PATTERN;
943
953
  /** HTML 真偽属性名のセット */
944
954
  private static readonly BOOLEAN_ATTRIBUTES;
945
955
  /** inputイベントを発生させるタイプ */
@@ -1728,8 +1738,10 @@ declare class ElementFragment extends Fragment {
1728
1738
  * 入力要素の種別に応じて値を正規化します。
1729
1739
  *
1730
1740
  * `type="number"` の input では、文字列の入力値・バインド値を数値へ変換します
1731
- * (DTO が数値型を期待する場合に文字列で送られるのを防ぐため)。空文字・null・
1732
- * 数値化できない値は `null` を返します。それ以外の要素では値をそのまま返します。
1741
+ * (DTO が数値型を期待する場合に文字列で送られるのを防ぐため)。数値として採用
1742
+ * するのは、ブラウザが `<input type="number">` の値として受け付ける文字列だけで
1743
+ * す(`NUMBER_INPUT_PATTERN`)。空文字・`null`・受け付けない文字列・有限でない数値
1744
+ * は `null` を返します。それ以外の要素では値をそのまま返します。
1733
1745
  *
1734
1746
  * @param element 対象の入力要素
1735
1747
  * @param value 正規化する値
@@ -2735,6 +2747,14 @@ export declare class Form {
2735
2747
  * 配列そのものを鍵にして控えます。参照が失われた場合は出現順の対応へ退きます。
2736
2748
  */
2737
2749
  private static readonly COLLECTED_ROW_IDENTITY;
2750
+ /**
2751
+ * 「集合として完結した値」の印。
2752
+ *
2753
+ * 同名チェックボックス・ラジオの群の選択集合は、1 つのキーに対する完全な値です。
2754
+ * 応答データへ重ねるときに位置合わせで混ぜると壊れるため、丸ごと置き換える対象で
2755
+ * あることを配列そのものを鍵にして控えます(`markCompleteSet()`)。
2756
+ */
2757
+ private static readonly COMPLETE_SET_VALUES;
2738
2758
  /**
2739
2759
  * 収集値の各階層で、`data-if-false` により収集から除外されたキー。
2740
2760
  *
@@ -2989,6 +3009,99 @@ export declare class Form {
2989
3009
  * @returns 反映完了の Promise
2990
3010
  */
2991
3011
  static restoreInitialValues(root: HTMLElement): Promise<void>;
3012
+ /**
3013
+ * 同名チェックボックス・ラジオの群を、群単位で収集します。
3014
+ *
3015
+ * 仕様「反映待ちの間に起きた変化」の「**同名チェックボックス・ラジオの群は、欄ごと
3016
+ * ではなく群単位で保護します**」「群のいずれかの欄が要求より後に操作されていれば、
3017
+ * その群の現在の選択集合をそのまま保護します」に対応します。群の値は 1 つのキーに
3018
+ * 対する選択の集合なので、操作された欄だけを取り出すと集合が壊れます。
3019
+ *
3020
+ * 群の範囲は仕様「反映待ちの間に起きた変化」の「群の範囲は、収集値の同じ階層です」
3021
+ * に従い、`resolveCollectionScope()` が返す階層の中だけを数えます。収集の対象外の
3022
+ * 部分木(`data-form-detach`・非表示分岐)と、別の階層(入れ子の `data-form-object` /
3023
+ * `data-form-list` の行)は数えません。同じ群かどうかは「群の同一性は**収集キー**で
3024
+ * 判断します」のとおり `resolveFieldName()` の結果で判定します(DOM の `name` で
3025
+ * 判定すると、`data-form-name` だけを宣言した別のキーの群と混ざる)。
3026
+ *
3027
+ * 走査は DOM 検索ではなくフラグメントの木で行います。収集(`getPartValues()`)と
3028
+ * 同じ木をたどることで階層と除外の判定を一致させ、Haori が管理していない要素
3029
+ * (外部ウィジェットの内部の入力欄など)へフラグメントを生やさないためです。
3030
+ * チェック状態と送信値は仕様「収集は DOM を真とする」のとおり DOM から読みます。
3031
+ *
3032
+ * @param fragment 群のいずれかの入力欄のフラグメント
3033
+ * @param isValueList `data-form-list` を併記しているかどうか
3034
+ * @param minUserEditSequence 編集の基準となる通し番号
3035
+ * @returns 基準より後の操作があったかどうかと、現在の選択集合
3036
+ */
3037
+ private static collectGroupSelection;
3038
+ /**
3039
+ * 収集値の新しい階層を始める要素かどうかを判定します。
3040
+ *
3041
+ * `getPartValues()` の分岐と同じ規則です。収集キー(`name` / `data-form-name`)を
3042
+ * 持つ要素は値そのものを表すため階層を作らず、`data-form-object` /
3043
+ * `data-form-list` に**属性値がある**ときだけ階層が変わります(属性値の無い
3044
+ * `data-form-list` は入力要素の値を配列として集める印で、階層は作りません)。
3045
+ *
3046
+ * @param fragment 判定するフラグメント
3047
+ * @returns 新しい階層を始める場合は true
3048
+ */
3049
+ private static startsCollectionLevel;
3050
+ /**
3051
+ * 収集値の階層(同じキーの集まる範囲)となるフラグメントを解決します。
3052
+ *
3053
+ * 仕様「反映待ちの間に起きた変化」の「群の範囲は、収集値の同じ階層です」
3054
+ * 「`data-form-list` の**行**、`data-form-object`、最近傍のフォーム(`<form>` または
3055
+ * `data-form`)のうち最も内側の範囲です」に対応します。`data-form-object` は自身が
3056
+ * 階層、`data-form-list` はその直下の要素(= 行)が階層です。フォームの外(どの
3057
+ * 階層にも囲まれていない構成)では、たどり着いた最上位の要素を範囲とします。
3058
+ *
3059
+ * ラジオの排他制御の範囲(`resolveGroupScope()`)とは別の概念です。あちらは HTML の
3060
+ * グループの範囲で `data-form-object` を境界としませんが、こちらは収集値のキーの
3061
+ * 範囲なので `data-form-object` も境界になります。
3062
+ *
3063
+ * @param fragment 起点のフラグメント
3064
+ * @returns 階層となるフラグメント
3065
+ */
3066
+ private static resolveCollectionScope;
3067
+ /**
3068
+ * フォームの範囲の根(`<form>` または `data-form`)かどうかを判定します。
3069
+ *
3070
+ * @param fragment 判定するフラグメント
3071
+ * @returns フォームの範囲の根であれば true
3072
+ */
3073
+ private static isFormScopeRoot;
3074
+ /**
3075
+ * 階層の中から、同じ収集キーを持つ群の欄を集めます。
3076
+ *
3077
+ * 収集(`getPartValues()`)と同じ判定で部分木を刈ります。別の階層(入れ子の
3078
+ * `data-form-object` / `data-form-list`)と、収集の対象外の部分木
3079
+ * (`data-form-detach`・非表示分岐の `data-if-false`)へは入りません。仕様
3080
+ * 「反映待ちの間に起きた変化」の「収集の対象外である部分木の欄も群に含めません」
3081
+ * に対応します。
3082
+ *
3083
+ * 入れ子のフォームはここでは刈りません。範囲の解決(`resolveCollectionScope()`)が
3084
+ * 最近傍のフォームで止まるため、内側の欄は内側のフォームを範囲として数え直され、
3085
+ * 同じキーへの書き込みはそちらが後に来ます(刈っても結果は変わらない)。
3086
+ *
3087
+ * @param fragment 走査するフラグメント(最初の呼び出しでは階層の根)
3088
+ * @param key 群の収集キー
3089
+ * @param members 集める先
3090
+ */
3091
+ private static collectGroupMembers;
3092
+ /**
3093
+ * 「集合として完結した値」として印を付けます。
3094
+ *
3095
+ * 群の選択集合は 1 つのキーに対する完全な値なので、応答データへ重ねるときに
3096
+ * 位置合わせで要素ごとに混ぜてはいけません(`data-form-list` の行の配列とは
3097
+ * 意味が違います)。印は `Procedure` の `mergeUserEdits()` が見て、丸ごと
3098
+ * 置き換えます。
3099
+ *
3100
+ * @param value 印を付ける配列
3101
+ * @returns 同じ配列
3102
+ */
3103
+ private static markCompleteSet;
3104
+ /* Excluded from this release type: isCompleteSetValue */
2992
3105
  /**
2993
3106
  * 値による上書きをグループ単位で扱うべき入力要素(boolean 型でない
2994
3107
  * チェックボックス、またはラジオボタン)かどうかを判定します。
@@ -3869,7 +3982,7 @@ declare interface ValueChangeOrigin {
3869
3982
  * リリース時に `package.json` と揃えて更新します(`tests/version.test.ts` が
3870
3983
  * 一致を検査します)。
3871
3984
  */
3872
- export declare const version = "0.41.4";
3985
+ export declare const version = "0.43.0";
3873
3986
 
3874
3987
  /**
3875
3988
  * すべてのレンダリングタスク(追従投入分を含む)の完了を待ちます。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "haori",
3
- "version": "0.41.4",
3
+ "version": "0.43.0",
4
4
  "description": "A lightweight HTML-first UI engine powered by declarative data bindings and expressions.",
5
5
  "scripts": {
6
6
  "dev": "vite",