You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Web应用中结合Tabulator实现Materialize模态框

解决方案

1. 定义Materialize模态框结构

先在页面中添加两个静态模态框,分别对应两种状态切换场景:

<!-- 可用转不可用模态框(带备注输入) -->
<div id="to-unavailable-modal" class="modal">
  <div class="modal-content">
    <h4>标记设备为不可用</h4>
    <p>请填写状态备注:</p>
    <input type="text" id="unavailable-note" placeholder="例如:维修中、已借出">
  </div>
  <div class="modal-footer">
    <a href="#!" class="modal-close btn-flat">取消</a>
    <a href="#!" id="confirm-unavailable" class="btn">确认</a>
  </div>
</div>

<!-- 不可用转可用模态框 -->
<div id="to-available-modal" class="modal">
  <div class="modal-content">
    <h4>标记设备为可用</h4>
    <p>确认将此设备恢复为可用状态?</p>
  </div>
  <div class="modal-footer">
    <a href="#!" class="modal-close btn-flat">取消</a>
    <a href="#!" id="confirm-available" class="btn">确认</a>
  </div>
</div>

2. 初始化Materialize模态框

页面加载完成后初始化模态框,确保组件能正常触发:

document.addEventListener('DOMContentLoaded', function() {
  const modalElems = document.querySelectorAll('.modal');
  M.Modal.init(modalElems);
});

3. 配置Tabulator单元格点击事件

在状态列的cellClick回调中,根据当前设备状态触发对应模态框,同时保存当前设备的唯一标识(比如设备ID),方便后续更新:

const inventoryTable = new Tabulator("#your-table-id", {
  columns: [
    // 其他列配置...
    {
      title: "设备状态",
      field: "status",
      formatter: cell => {
        // 自定义状态显示样式(可选)
        return cell.getValue() === "Available" 
          ? '<span class="green-text">可用</span>' 
          : '<span class="red-text">不可用</span>';
      },
      cellClick: (e, cell) => {
        const currentStatus = cell.getValue();
        const deviceId = cell.getRow().getData().id; // 假设数据中包含唯一ID字段
        
        // 暂存当前操作的设备ID,供模态框确认时使用
        window.activeDeviceId = deviceId;

        // 根据状态选择对应模态框并打开
        const targetModalId = currentStatus === "Available" 
          ? "to-unavailable-modal" 
          : "to-available-modal";
        const modalInstance = M.Modal.getInstance(document.getElementById(targetModalId));
        modalInstance.open();
      }
    }
  ],
  // 其他Tabulator配置...
});

4. 处理模态框确认逻辑

为两个确认按钮绑定事件,完成状态修改并同步到Google表格:

// 处理「标记为不可用」的确认操作
document.getElementById('confirm-unavailable').addEventListener('click', () => {
  const note = document.getElementById('unavailable-note').value;
  const deviceId = window.activeDeviceId;

  // 调用Google Apps Script接口更新表格数据
  // google.script.run.updateDeviceStatus(deviceId, "Not Available", note);

  // 同步更新Tabulator表格数据
  inventoryTable.updateData([{id: deviceId, status: "Not Available", note: note}]);

  // 关闭模态框并清空输入框
  const modal = M.Modal.getInstance(document.getElementById('to-unavailable-modal'));
  modal.close();
  document.getElementById('unavailable-note').value = "";
});

// 处理「标记为可用」的确认操作
document.getElementById('confirm-available').addEventListener('click', () => {
  const deviceId = window.activeDeviceId;

  // 调用Google Apps Script接口更新表格数据
  // google.script.run.updateDeviceStatus(deviceId, "Available", "");

  // 同步更新Tabulator表格数据
  inventoryTable.updateData([{id: deviceId, status: "Available", note: ""}]);

  // 关闭模态框
  const modal = M.Modal.getInstance(document.getElementById('to-available-modal'));
  modal.close();
});

关键注意事项

  • 确保已正确引入Materialize的CSS和JS文件
  • 调用Google Apps Script接口时,建议添加回调处理成功/失败场景:
google.script.run
  .withSuccessHandler(() => inventoryTable.setData(google.script.run.getInventoryData))
  .withFailureHandler(err => console.error("更新失败:", err))
  .updateDeviceStatus(deviceId, "Not Available", note);

内容的提问来源于stack exchange,提问作者Borgher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:53:23