在 Tabulator 中使用 jQuery 日期选择器时如何禁用未来日期?

How do I disable future dates when using jQuery datepicker inside Tabulator?

我试图禁用与 Tabulator 一起使用的 jQuery datepicker 的未来日期,但无济于事。

var table = new Tabulator("#MyDiv", {
    height: "100%",
    layout: "fitDataFill",
    columns: [
        { title: "Date Worked", field: "DateComp", hozAlign: "center", sorter: "date", editor: dateEditor },
        { title: "Memo", field: "Memo", width: 144, hozAlign: "left", editor: "input" },
    ]
});

var dateEditor = function (cell, onRendered, success, cancel) {
    var cellValue = moment(cell.getValue(), "MM/DD/YYYY").format("YYYY-MM-DD");
    input = document.createElement("input");
    input.setAttribute("type", "date");
    input.style.padding = "4px";
    input.style.width = "100%";
    input.style.boxSizing = "border-box";
    input.value = cellValue;

    onRendered(function () {
        input.style.height = "100%";
        //$(input).datepicker({ endDate: new Date() });
        $(input).datepicker({ maxDate: 0 });
        input.focus();
    });

    function onChange() {
        if (input.value != cellValue) {
            success(moment(input.value, "YYYY-MM-DD").format("MM/DD/YYYY"));
        } else {
            cancel();
        }
    };
    //submit new value on blur or change
    input.addEventListener("blur", onChange);
    //submit new value on enter
    input.addEventListener("keydown", function (e) {
        if (e.keyCode == 13) {
            onChange();
        }
        if (e.keyCode == 27) {
            cancel();
        }
    });
    return input;
};

我尝试通过调整 datepicker 选项列表(例如 maxDateendDate)来进行一些修复,但似乎没有任何效果。 datepicker 上的未来日期无论如何都是可选的。这是 Tabulator 问题吗?或者,一个 jQuery 问题?

我在其他论坛上发现了关于使用 jQuery datepicker 的类似问题,推荐的解决方案似乎总是围绕 maxDateendDate 选项的使用展开。

非常感谢任何帮助。

在单元格内使用日期选择器似乎有问题,我无法弄清楚。抛出实例数据丢失的错误。

这里是一个使用 flatpickr 而不是 jQuery 日期选择器的例子。 https://jsfiddle.net/nrayburn/65t1dp23/49/

最重要的两个部分包括验证器,这样用户就无法输入日期。 (我不认为他们可以,但如果他们以某种方式这样做将防止无效日期。)。另一个是在创建日期选择器实例时使用日期选择库中的 maxDate 或等效参数。

这是一个自定义验证器,用于防止将来出现任何日期。 (在此设置中可能无法正确处理时差。)

  function noFutureDate(cell, value){
    const cellValue = moment(new Date(value));
    const today = moment();
    if (cellValue.diff(today) > 0){
        return false;
    }
    return true;
  }

您还必须创建自定义编辑器。这是您对日期选择器实例特别需要的。您可以从 fiddle 中获取其余部分,但其他部分与具体的日期选择器并没有真正相关。

  const input = document.createElement("input");
  input.value = cell.getValue();
  onRendered(function(){
    flatpickr(input, {
      maxDate: moment().format('MM/DD/YYYY')
    })
    input.focus();
  });