Newer
Older
admin_crud_pkg / resources / js / crud_table.js
var toggleNoticeShown = false;

// crud でのテキスト編集
function other_textchange(event) {
    // console.log(event.target.value); // selected option value
    // console.log(event.target.id); // select
    var tdid = event.target.id.replace("select__", "edit__");
    var text = $("#" + tdid).val();
    if (event.target.value == "remove_spaces_between_japanese") {
        var newtext = text.replace(/([一-龥ぁ-ゔァ-ヴー々〆〤.,。、])\s+([一-龥ぁ-ゔァ-ヴー々〆〤.,。、])/g, '$1$2');
        $("#" + tdid).val(newtext);
    } else if (event.target.value == "replace_kuten") {
        var newtext = text.replace(/、/g, ",").replace(/。/g, ".");
        $("#" + tdid).val(newtext);
    }
}

// x-toggle
function toggle(formid, id123) {
    console.log("id123: " + id123);
    var m = id123.match(/^(\w+)__(\d+)__([\w()]+)/);
    crudpost(m[1], m[2], "x", m[3].toLowerCase());
}

$(".clicktoedit").click(function (e) {
    var tdid = e.currentTarget.id;
    if (origData[tdid] != null) return;
    // tdidを分解する field__id__TYPE
    var m = tdid.match(/^(\w+)__(\d+)__([\w()]+)/);
    // グローバルにsizecols が定義されていれば、それを用いる。
    var localsizecols = (typeof sizecols !=='undefined') ? sizecols : 50;
    var txt = $('#' + tdid).text().trim();
    var inputType = "";
    if (/text$/.test(m[3].toLowerCase())) { // text, longtext, mediumtext...
        var attr = $('#' + tdid).data('orig');
        if (typeof attr !== 'undefined') txt = attr;
        $('#' + tdid).html("<textarea style=\"resize:both;\" cols=\""+localsizecols+"\" rows=\"6\" id=\"edit__" + tdid + "\">" + txt + "</textarea><div><span class=\"text-sm text-green-500\">hint: cmd(ctrl)+enter to save, esc to cancel. </span>"+
            "<select class=\"font-sans text-xs\" id='select__" + tdid + "' onchange=\"other_textchange(event);\"><option>【テキスト一括処理】</option>"+
            "<option value=\"remove_spaces_between_japanese\">日本語文字間の半角スペース・改行を削除</option>"+
            "<option value=\"replace_kuten\">、。を,.に変換</option>"+
            "</select>"+
            // "<button class=\"text-xs bg-gray-200 p-1\" onclick=\"saveText('edit__"+tdid + "');\">保存</input>"+
            "</div>");
        inputType = "textarea";
    } else if (m[3].toLowerCase() == "varchar" || m[3].toLowerCase() == "datetime" || m[3].toLowerCase() == "timestamp") {
        $('#' + tdid).html("<input type=\"text\" size=\""+localsizecols+"\" id=\"edit__" + tdid + "\"  value=\"" + txt + "\">");
        inputType = "text";
    } else if (m[3].toLowerCase() == "tinyint") {
        if (!toggleNoticeShown) {
            var ok = confirm("Press OK to change the value. \n値を変更する場合はOKを押してください。(一度OKを押すと、次回以降は確認しません。)");
            if (!ok) return;
            toggleNoticeShown = true;
        }
        crudpost(m[1], m[2], "x", m[3].toLowerCase());
        return;
    } else {
        $('#' + tdid).html("<input type=\"text\" size=\"5\" id=\"edit__" + tdid + "\"  value=\"" + txt + "\">");
        inputType = "text";
    }
    origData[tdid] = txt;
    // $('#'+tdid).removeClass('clicktoedit');
    $('#' + tdid).removeClass('hover:text-blue-600');
    var editelem = $('#edit__' + tdid);
    editelem.focus();
    // テキスト入力フィールドの最後の文字の位置を取得します
    var endPosition = editelem.val().length;
    // カーソルの位置を設定します
    editelem[0].selectionStart = endPosition;
    editelem[0].selectionEnd = endPosition;
});

// IME変換中はEnterは確定なので、送信しない。
var isIMEActive = false;
$(".clicktoedit").on('compositionstart', function (e) {
    isIMEActive = true;
});
$(".clicktoedit").on('compositionend', function (e) {
    isIMEActive = false;
});

function saveText(tdid) {
    var m = tdid.match(/^(\w+)__(\d+)__([\w()]+)/); // tdidを分解する field__id__TYPE
    if ($('#' + tdid).find("textarea").length > 0) {
        var text = $('#' + tdid).find("textarea").val();
        $('#' + tdid).data('orig', text);
        if (typeof mode_br !== 'undefined' && mode_br === true){
            var showtext = text.replaceAll("\n", "<br>");
            $('#' + tdid).html(showtext);
        } else {
            $('#' + tdid).text(text.replaceAll("\n", "\r\n"));
        }
    } else if ($('#' + tdid).find("input").length > 0) {
        var text = $('#' + tdid).find("input").val();
        $('#' + tdid).text(text);
    } else {
        alert("error saveText");
    }
    crudpost(m[1], m[2], text, m[3]);

    $('#' + tdid).addClass('hover:text-blue-600');
    origData[tdid] = null;
    delete origData[tdid];
}

$(".clicktoedit").keydown(function (e) {
    var tdid = e.currentTarget.id;
    if (e.key === "Enter") {
        if (isIMEActive) return; // IME変換中はEnterは確定なので、送信しない。
        if ($('#' + tdid).find("textarea").length > 0 && !e.ctrlKey && !e.metaKey) return; // textareaはCTRLorMetaが必要
        else {
            saveText(tdid);
            // if ($('#' + tdid).find("textarea").length > 0) {
            //     var text = $('#' + tdid).find("textarea").val();
            //     $('#' + tdid).data('orig', text);
            //     if (typeof mode_br !== 'undefined' && mode_br === true){
            //         var showtext = text.replaceAll("\n", "<br>");
            //         $('#' + tdid).html(showtext);
            //     } else {
            //         $('#' + tdid).text(text.replaceAll("\n", "\r\n"));
            //     }
            // }
            // if ($('#' + tdid).find("input").length > 0) {
            //     var text = $('#' + tdid).find("input").val();
            //     $('#' + tdid).text(text);
            // }
            // crudpost(m[1], m[2], text, m[3]);
        }
    } else if (e.key === "Escape" || e.key === "Esc") {
        if (typeof mode_br !== 'undefined' && mode_br === true){
            $('#' + tdid).html(origData[tdid].replaceAll("\n", "<br>"));
        } else {
            $('#' + tdid).text(origData[tdid]);
        }
        $('#' + tdid).addClass('hover:text-blue-600');
        origData[tdid] = null;
        delete origData[tdid];
    }
})

function crudpost(field, data_id, val, dtype) {
    var fd = new FormData();
    fd.append('table', table);
    fd.append('_token', $('meta[name="csrf-token"]').attr("content"));
    fd.append('field', field);
    fd.append('data_id', data_id);
    fd.append('dtype', dtype);
    fd.append('val', val);
    fd.append('tdid', field + "__" + data_id + "__" + dtype);
    var formDataObject = {};
    for (var pair of fd.entries()) {
        formDataObject[pair[0]] = pair[1];
    }
    var form = $("#admincrudpost");
    $.ajax({
        url: form.attr("action"),
        type: form.attr("method"),
        data: formDataObject,
        timeout: 10000,
        beforeSend: function (xhr, settings) { },
        complete: function (xhr, textStatus) { },
        success: function (result, textStatus, xhr) {
            if (/^TOGGLE/.test(result)) {
                var m = result.trim().match(/(TOGGLE) (\d+) (.+)$/); // resultを分解する TOGGLE val tdid
                var elem = $('#td__' + m[3]);
                // elem.text(m[2]);
            } else {
                var m = result.trim().match(/(OK) (.+)$/);
                var elem = $('#' + m[2]);
            }
            elem.addClass('flash');
            setTimeout(function () {
                elem.removeClass('flash');
            }, 1000);
        },
        error: function (xhr, textStatus, error) {
            alert("error crudpost");
        }
    });
}