From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。

---
 HotelPms.Client.Blazor/wwwroot/js/InputCore.js |  187 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 187 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Client.Blazor/wwwroot/js/InputCore.js b/HotelPms.Client.Blazor/wwwroot/js/InputCore.js
new file mode 100644
index 0000000..2b5972e
--- /dev/null
+++ b/HotelPms.Client.Blazor/wwwroot/js/InputCore.js
@@ -0,0 +1,187 @@
+class JValidField {
+    constructor(el) {
+        this.Guid = el.dataset.guid;
+        this.Index = parseInt(el.dataset.validIndex);
+        this.Name = el.dataset.validName;
+        this.OrgText = el.dataset.validOrgText;
+        this.Text = el.dataset.validText;
+        this.InputChar = parseInt(el.dataset.validInputChar);
+        this.ShowStyle = parseInt(el.dataset.validShowStyle);
+        this.ThousandFormat = el.dataset.validThousandFormat;
+    }
+};
+
+/*
+*画面(部品)単位のViewModel管理
+*想定シナリオ
+*1.C# Blazor側でViewModelにViewModel生成、GuidやValidFieldを<input>の属性にセットする
+*2.OnAfterRenderAsyncのfirstRenderでInputCoreのinit(Guid)を呼出し
+*3.InputCoreのinit(Guid)に、JViewModelを生成し、<input>の属性よりValidFieldを生成し、入力制御を行う
+*4.C# Blazor側Page OR 部品 Dispose時に、InputCoreのdispose(Guid)を呼出し、廃棄する
+*/
+class JViewModel {
+    constructor(guid) {
+        this.Guid = guid
+        this.Fields = [];
+        this.FieldMap = new Map();
+    }
+
+    add(field) {
+        this.Fields.push(field);
+        this.FieldMap.set(field.Name, field);
+    }
+
+    static create(guid) {
+        return new JViewModel(guid);
+    }
+};
+
+/*
+* IMEモードなし状態:
+* 通常文字入力:keydown⇒keypress⇒input⇒keyup
+* Enter:keydown⇒keypress⇒change(※文字変更あった場合)⇒keyup
+* Tab:keydown⇒blur⇒focus(次)⇒keyup
+* ※その場合、入力文字毎制限はinputに行う
+* IMEモード状態:ひらがな
+* 通常文字入力:compositionstart⇒複数回keydown⇒input⇒keyup⇒compositionend
+* ※その場合、入力文字毎制限はcompositionendに行う
+* 全部入力内容のチェックタイミングはblurで行う
+* Up、End、Enterの判断はKeyUpの信頼度は一番高い、又Enterのみはkeypressでも可能です。
+* 
+* フォーカス移動、全部チェックのため、viewFieldsの配列が必要です。
+*/
+class InputCore {
+    constructor() {
+        this.viewModelMap = new Map();
+    }
+
+    static filter(e) {
+        let index = parseInt(e.target.dataset.validIndex);
+        let field = window.inputCore.viewModelMap.get(e.target.dataset.guid).Fields[index];
+
+        if (field.InputChar == 1) { return; }
+
+        let v = e.target.value;
+        
+        // 全角数字変換
+        if ((field.InputChar & 0x02) == 0x02) {
+            v = v.replace(/[0-9]/g, function (x) { return String.fromCharCode(x.charCodeAt(0) - 0xFEE0) });
+        }
+
+        let limitChar = '[^';        
+        if ((field.InputChar & 0x02) == 0x02) { limitChar += '0-9'; }  //数字      
+        if ((field.InputChar & 0x04) == 0x04) { limitChar += 'a-z'; }  //小アルファベット
+        if ((field.InputChar & 0x08) == 0x08) { limitChar += 'A-Z'; }  //大アルファベット
+        if ((field.InputChar & 0x10) == 0x10) { limitChar += 'ヲ-゚'; }  //カナ
+        if ((field.InputChar & 0x200) == 0x200) { limitChar += ' '; }  // [space]
+        if ((field.InputChar & 0x400) == 0x400) { limitChar += ':'; }  // :        
+        if ((field.InputChar & 0x800) == 0x800) { limitChar += '-'; }  // -        
+        if ((field.InputChar & 0x2000) == 0x2000) { limitChar += '.'; } // .         
+        if ((field.InputChar & 0x4000) == 0x4000) { limitChar += '/'; } // /
+        if ((field.InputChar & 0x8000) == 0x8000) { limitChar += ','; } // ,
+        limitChar += ']';
+        var re = new RegExp(limitChar,'g');
+        v = v.replace(re, '');
+
+        //let v = e.target.value
+        //    .replace(/[0-9]/g, function (x) { return String.fromCharCode(x.charCodeAt(0) - 0xFEE0) })
+        //    .replace(/[^0-9,.-]/g, '');
+        //.replace(/[0-9a-zA-Z]/g, function(x){ return String.fromCharCode(x.charCodeAt(0) - 0xFEE0) })
+        //.replace(/[^0-9a-zA-Z]/g, '');
+
+        //.replace(/[^0-9]/g, '')
+        e.target.value = v;
+    }
+
+    dispose(guid) {
+        try {
+            viewModelMap.delete(guid);
+        } catch(err) {
+            console.log(err);
+        }
+    }
+
+    init(guid) {
+        let viewModel = new JViewModel(guid);
+        let key = `[data-guid="${guid}"]`;
+        var list = document.querySelectorAll(key);
+        list.forEach(item => {
+            let field = new JValidField(item);
+            viewModel.add(field);
+        });
+        this.viewModelMap.set(guid, viewModel);
+
+        viewModel.Fields.forEach(item => {
+            let id = `${guid}-${item.Index}`;
+            var obj = document.getElementById(id);
+            obj.addEventListener('focus', function (e) {
+                console.log('focus', e.target.value, e.target.dataset.validName);
+                let index = parseInt(e.target.dataset.validIndex);
+                let field = window.inputCore.viewModelMap.get(e.target.dataset.guid).Fields[index];
+                field.OrgText = e.target.value;
+                if (((field.ShowStyle & 0x04) == 0x04) && e.target.value.length > 0) {
+                    e.target.value = e.target.value.replace(",", "");
+                }
+
+                DotNet.invokeMethodAsync('HotelPms.Client.Blazor', 'InputCoreEvent', { ID: e.target.dataset.guid, Index: index, Name: e.target.dataset.validName, EventName: "focus", Key: "", OrgText: field.OrgText, Text: e.target.value })
+                    .then(data => {
+                        console.log(JSON.stringify(data)); 
+                    });
+            });
+            obj.addEventListener('blur', function (e) {
+                console.log('blur', e.target.value, e.target.dataset.validName);
+                let index = parseInt(e.target.dataset.validIndex);
+                var field = window.inputCore.viewModelMap.get(e.target.dataset.guid).Fields[index];
+                DotNet.invokeMethodAsync('HotelPms.Client.Blazor', 'InputCoreEvent', { ID: e.target.dataset.guid, Index: index, Name: e.target.dataset.validName, EventName: "blur", Key: "", OrgText: field.OrgText, Text: e.target.value })
+                    .then(data => {
+                        console.log(JSON.stringify(data));
+                        e.target.value = data.text; 
+                    });
+
+            });
+            obj.addEventListener('keyup', function (e) {
+                console.log('keyup', e.target.value, e.key, e.target.dataset.validName);
+
+                if (e.key === "Enter" || e.key === "ArrowUp" || e.key === "End") {
+                    e.preventDefault();
+                    e.stopPropagation();
+                    let index = parseInt(e.target.dataset.validIndex);
+                    var field = window.inputCore.viewModelMap.get(e.target.dataset.guid).Fields[index];
+                    DotNet.invokeMethodAsync('HotelPms.Client.Blazor', 'InputCoreEvent', { ID: e.target.dataset.guid, Index: index, Name: e.target.dataset.validName, EventName: "keyup", Key: e.key, OrgText: field.OrgText, Text: e.target.value })
+                        .then(data => {
+                            console.log(JSON.stringify(data));  
+
+                            field.OrgText = data.orgText;
+                            e.target.value = data.text; 
+                            if (data.nextFocus.length > 0) {
+                                let nextInput = document.getElementById(data.nextFocus);
+                                nextInput.focus();
+                                nextInput.select();
+                            }
+                        });
+                } 
+            });
+            obj.addEventListener('keypress', function (e) {
+                console.log('keypress', e.target.value, e.key, e.target.dataset.validName);
+            });
+            obj.addEventListener('keydown', function (e) {
+                console.log('keydown', e.target.value, e.key, e.target.dataset.validName);
+            });
+            obj.addEventListener('change', function (e) {
+                console.log('change', e.target.value, e.key, e.target.dataset.validName);
+            });
+            obj.addEventListener('input', function (e) {
+                console.log('input', e.target.value, e.key, e.target.dataset.validName, e.isComposing);
+                if (!e.isComposing) { InputCore.filter(e); }
+            });
+            obj.addEventListener('compositionstart', function (e) {
+                console.log('compositionstart', e.target.value, e.target.dataset.validName);
+            });
+            obj.addEventListener('compositionend', function (e) {
+                console.log('compositionend', e.target.value, e.target.dataset.validName);
+                InputCore.filter(e);
+            });
+        });       
+    }
+};
+window.inputCore = new InputCore();

--
Gitblit v1.10.0