map.html 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. <!DOCTYPE html>
  2. <html lang="zh-CN" data-bs-theme="light">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>地图-SIMANC TCS</title>
  7. <!-- 在页面加载前应用保存的主题设置,避免闪烁 -->
  8. <script src="../js/themePreSet.js"></script>
  9. <!-- 预渲染导航栏,减少延迟 -->
  10. <script src="../js/headerPreRender.js"></script>
  11. <!-- Tabler Core CSS -->
  12. <link
  13. href="../assets/css/app.css"
  14. rel="stylesheet"
  15. />
  16. </head>
  17. <body>
  18. <div class="page">
  19. <!-- 顶部导航栏容器 -->
  20. <div id="tcs-header-container" class="tcs-header-container"></div>
  21. <header
  22. class="navbar navbar-expand-md tcs-container-space-x tcs-navbar-compact justify-content-between flex-column flex-md-row"
  23. >
  24. <div class="d-flex flex-column flex-md-row w-100 align-items-start align-items-md-center mb-2 mb-md-0">
  25. <div class="d-flex flex-wrap align-items-center me-md-auto">
  26. <div class="d-flex flex-wrap align-items-center">
  27. <!-- <div class="tcs-filter-group mb-2 mb-md-0 me-md-2">
  28. <label class="form-label mb-0 me-2 d-inline">开始:</label>
  29. <input
  30. type="date"
  31. class="form-control tcs-form-item"
  32. value="2025-03-16"
  33. id="date-start"
  34. />
  35. </div>
  36. <div class="tcs-filter-group mb-2 mb-md-0 me-md-2">
  37. <label class="form-label mb-0 me-2 d-inline">结束:</label>
  38. <input
  39. type="date"
  40. class="form-control tcs-form-item"
  41. value="2025-03-16"
  42. id="date-end"
  43. />
  44. </div> -->
  45. <div class="tcs-filter-group mb-2 mb-md-0">
  46. <label class="form-label mb-0 me-2 d-inline">区域:</label>
  47. <div>
  48. <select class="form-select tcs-form-item" id="status-filter">
  49. <option selected>全部</option>
  50. <option>A6</option>
  51. <option>A7</option>
  52. <option>A8</option>
  53. <option>A9</option>
  54. <option>A10</option>
  55. </select>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="d-flex align-items-center ms-md-auto mt-2 mt-md-0">
  61. <button class="btn btn-primary tcs-form-item" data-bs-toggle="modal" data-bs-target="#addMapModal">
  62. <i class="ti ti-plus me-1"></i>添加
  63. </button>
  64. <button class="btn btn-danger ms-2 tcs-form-item" data-bs-toggle="modal" data-bs-target="#updateCloudMapModal">
  65. <!-- <i class="ti ti-refresh me-1"></i> -->更新云地图
  66. </button>
  67. </div>
  68. </div>
  69. </header>
  70. <!-- 页面内容 -->
  71. <div
  72. class="page-wrapper"
  73. >
  74. <div class="card tcs-card-full border-0">
  75. <div class="card-body p-0">
  76. <div class="table-responsive">
  77. <table
  78. class="table table-vcenter card-table table-hover tcs-table-compact"
  79. id="data-table"
  80. >
  81. <thead>
  82. <tr>
  83. <!-- <th class="w-1" id="checkbox-header">
  84. </th> -->
  85. <th>编号</th>
  86. <th>区域</th>
  87. <th>名称</th>
  88. <th>描述</th>
  89. <th>类型</th>
  90. <th>版本</th>
  91. <th>创建时间</th>
  92. <th>当前地图</th>
  93. <th>操作</th>
  94. </tr>
  95. </thead>
  96. <tbody>
  97. <!-- 表格内容将由JavaScript动态生成 -->
  98. </tbody>
  99. </table>
  100. </div>
  101. </div>
  102. <div class="card-footer d-flex align-items-center tcs-card-footer-compact flex-column flex-md-row">
  103. <div class="d-flex flex-column flex-md-row align-items-start align-items-md-center mb-2 mb-md-0 w-100 w-md-auto">
  104. <span id="pagination-info" class="text-secondary mb-2 mb-md-0">
  105. <!-- 分页信息将由JavaScript动态生成 -->
  106. </span>
  107. <div class="ms-0 ms-md-3 d-flex align-items-center">
  108. <span class="me-2 text-secondary">每页显示</span>
  109. <div class="dropdown d-inline-block">
  110. <button
  111. class="btn dropdown-toggle px-2 tcs-form-item-pagiton"
  112. type="button"
  113. data-bs-toggle="dropdown"
  114. >
  115. <span id="current-page-size">10</span>
  116. <span class="ms-1 d-none d-sm-inline">条记录</span>
  117. </button>
  118. <div class="dropdown-menu dropdown-menu-end">
  119. <a
  120. class="dropdown-item page-size-item"
  121. href="#"
  122. data-size="10"
  123. >10</a
  124. >
  125. <a
  126. class="dropdown-item page-size-item"
  127. href="#"
  128. data-size="20"
  129. >20</a
  130. >
  131. <a
  132. class="dropdown-item page-size-item"
  133. href="#"
  134. data-size="50"
  135. >50</a
  136. >
  137. <a
  138. class="dropdown-item page-size-item"
  139. href="#"
  140. data-size="100"
  141. >100</a
  142. >
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147. <ul class="pagination m-0 ms-md-auto mt-2 mt-md-0" id="pagination-controls">
  148. <!-- 分页控件将由JavaScript动态生成 -->
  149. </ul>
  150. </div>
  151. </div>
  152. </div>
  153. <!-- 添加地图模态框 -->
  154. <div class="modal modal-blur fade" id="addMapModal" tabindex="-1" role="dialog" aria-hidden="true">
  155. <div class="modal-dialog modal-lg modal-dialog-scrollable" role="document">
  156. <div class="modal-content">
  157. <div class="modal-header">
  158. <h5 class="modal-title">添加新地图</h5>
  159. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  160. </div>
  161. <div class="modal-body">
  162. <form id="addMapForm" class="needs-validation" novalidate>
  163. <div class="mb-3 row">
  164. <label class="col-3 col-form-label required text-end">区域</label>
  165. <div class="col">
  166. <select class="form-select" name="area" required>
  167. <option value="" selected disabled>请选择区域</option>
  168. <option value="车间xxx">车间xxx</option>
  169. <option value="车间yyy">车间yyy</option>
  170. <option value="仓库A">仓库A</option>
  171. <option value="仓库B">仓库B</option>
  172. </select>
  173. <div class="invalid-feedback">请选择区域</div>
  174. </div>
  175. </div>
  176. <div class="mb-3 row">
  177. <label class="col-3 col-form-label required text-end">名称</label>
  178. <div class="col">
  179. <input type="text" class="form-control" name="name" placeholder="地图名称" required>
  180. <div class="invalid-feedback">请输入地图名称</div>
  181. </div>
  182. </div>
  183. <div class="mb-3 row">
  184. <label class="col-3 col-form-label required text-end">描述</label>
  185. <div class="col">
  186. <input type="text" class="form-control" name="description" placeholder="地图描述" required>
  187. <div class="invalid-feedback">请输入地图描述</div>
  188. </div>
  189. </div>
  190. <div class="mb-3 row">
  191. <label class="col-3 col-form-label required text-end">类型</label>
  192. <div class="col">
  193. <select class="form-select" name="type" required>
  194. <option value="" selected disabled>请选择类型</option>
  195. <option value="云">云</option>
  196. <option value="本地">本地</option>
  197. </select>
  198. <div class="invalid-feedback">请选择类型</div>
  199. </div>
  200. </div>
  201. <div class="mb-3 row">
  202. <label class="col-3 col-form-label required text-end">地图文件</label>
  203. <div class="col">
  204. <input type="file" class="form-control" name="mapFile" required>
  205. <div class="invalid-feedback">请上传地图文件</div>
  206. </div>
  207. </div>
  208. <div class="mb-3 row">
  209. <label class="col-3 col-form-label text-end">设为当前地图</label>
  210. <div class="col">
  211. <label class="form-check form-switch">
  212. <input class="form-check-input" type="checkbox" name="setCurrent">
  213. <span class="form-check-label">是</span>
  214. </label>
  215. </div>
  216. </div>
  217. </form>
  218. </div>
  219. <div class="modal-footer tcs-modal-footer">
  220. <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
  221. <button type="button" class="btn btn-primary" id="saveMapBtn">保存</button>
  222. </div>
  223. </div>
  224. </div>
  225. </div>
  226. <!-- 更新云地图确认模态框 -->
  227. <div class="modal modal-blur fade" id="updateCloudMapModal" tabindex="-1" role="dialog" aria-hidden="true">
  228. <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
  229. <div class="modal-content">
  230. <div class="modal-body">
  231. <div class="modal-title">确认更新云地图</div>
  232. <div>您确定要更新云地图吗?此操作可能需要一些时间。</div>
  233. </div>
  234. <div class="modal-footer tcs-modal-footer">
  235. <button type="button" class="btn btn-link link-secondary me-auto" data-bs-dismiss="modal">取消</button>
  236. <button type="button" class="btn btn-danger" id="confirmUpdateCloudMapBtn">确认</button>
  237. </div>
  238. </div>
  239. </div>
  240. </div>
  241. <!-- 设为当前地图确认模态框 -->
  242. <div class="modal modal-blur fade" id="setCurrentMapModal" tabindex="-1" role="dialog" aria-hidden="true">
  243. <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
  244. <div class="modal-content">
  245. <div class="modal-body">
  246. <div class="modal-title">确认设为当前地图</div>
  247. <div>您确定要将此地图设为当前地图吗?这将替换当前正在使用的地图。</div>
  248. </div>
  249. <div class="modal-footer tcs-modal-footer">
  250. <button type="button" class="btn btn-link link-secondary me-auto" data-bs-dismiss="modal">取消</button>
  251. <button type="button" class="btn btn-primary" id="confirmSetCurrentBtn">确认</button>
  252. </div>
  253. </div>
  254. </div>
  255. </div>
  256. <!-- 编辑地图模态框 -->
  257. <div class="modal modal-blur fade" id="editMapModal" tabindex="-1" role="dialog" aria-hidden="true">
  258. <div class="modal-dialog modal-lg modal-dialog-scrollable" role="document">
  259. <div class="modal-content">
  260. <div class="modal-header">
  261. <h5 class="modal-title">编辑地图</h5>
  262. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  263. </div>
  264. <div class="modal-body">
  265. <form id="editMapForm" class="needs-validation" novalidate>
  266. <input type="hidden" name="id" id="edit-map-id">
  267. <div class="mb-3 row">
  268. <label class="col-3 col-form-label required text-end">区域</label>
  269. <div class="col">
  270. <select class="form-select" name="area" id="edit-map-area" required>
  271. <option value="" disabled>请选择区域</option>
  272. <option value="车间xxx">车间xxx</option>
  273. <option value="车间yyy">车间yyy</option>
  274. <option value="仓库A">仓库A</option>
  275. <option value="仓库B">仓库B</option>
  276. </select>
  277. <div class="invalid-feedback">请选择区域</div>
  278. </div>
  279. </div>
  280. <div class="mb-3 row">
  281. <label class="col-3 col-form-label required text-end">名称</label>
  282. <div class="col">
  283. <input type="text" class="form-control" name="name" id="edit-map-name" placeholder="地图名称" required>
  284. <div class="invalid-feedback">请输入地图名称</div>
  285. </div>
  286. </div>
  287. <div class="mb-3 row">
  288. <label class="col-3 col-form-label required text-end">描述</label>
  289. <div class="col">
  290. <input type="text" class="form-control" name="description" id="edit-map-description" placeholder="地图描述" required>
  291. <div class="invalid-feedback">请输入地图描述</div>
  292. </div>
  293. </div>
  294. <div class="mb-3 row">
  295. <label class="col-3 col-form-label required text-end">类型</label>
  296. <div class="col">
  297. <select class="form-select" name="type" id="edit-map-type" required>
  298. <option value="" disabled>请选择类型</option>
  299. <option value="云">云</option>
  300. <option value="本地">本地</option>
  301. </select>
  302. <div class="invalid-feedback">请选择类型</div>
  303. </div>
  304. </div>
  305. <div class="mb-3 row">
  306. <label class="col-3 col-form-label text-end">地图文件</label>
  307. <div class="col">
  308. <input type="file" class="form-control" name="mapFile">
  309. <small class="form-text text-muted">如不更换地图文件,请留空</small>
  310. </div>
  311. </div>
  312. <div class="mb-3 row">
  313. <label class="col-3 col-form-label text-end">设为当前地图</label>
  314. <div class="col">
  315. <label class="form-check form-switch">
  316. <input class="form-check-input" type="checkbox" name="setCurrent" id="edit-map-set-current">
  317. <span class="form-check-label">是</span>
  318. </label>
  319. </div>
  320. </div>
  321. </form>
  322. </div>
  323. <div class="modal-footer tcs-modal-footer">
  324. <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
  325. <button type="button" class="btn btn-primary" id="updateMapBtn">保存</button>
  326. </div>
  327. </div>
  328. </div>
  329. </div>
  330. <!-- 删除地图确认模态框 -->
  331. <div class="modal modal-blur fade" id="deleteMapModal" tabindex="-1" role="dialog" aria-hidden="true">
  332. <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
  333. <div class="modal-content">
  334. <div class="modal-body">
  335. <div class="modal-title">确认删除</div>
  336. <div>您确定要删除此地图吗?此操作无法撤销。</div>
  337. </div>
  338. <div class="modal-footer tcs-modal-footer">
  339. <button type="button" class="btn btn-link link-secondary me-auto" data-bs-dismiss="modal">取消</button>
  340. <button type="button" class="btn btn-danger" id="confirmDeleteBtn">删除</button>
  341. </div>
  342. </div>
  343. </div>
  344. </div>
  345. <!-- Tabler Core JS -->
  346. <script src="../assets/js/tabler.min.js"></script>
  347. <script src="../assets/js/jquery-3.7.1.min.js"></script>
  348. <script src="../js/themePoc.js"></script>
  349. <!-- 表格组件JS -->
  350. <script src="../js/tcsTable.js"></script>
  351. <!-- 模态框组件JS -->
  352. <script src="../js/tcsModal.js"></script>
  353. <!-- 页面特定的JavaScript -->
  354. <script>
  355. document.addEventListener("DOMContentLoaded", function () {
  356. // 配置表格选项
  357. const tableOptions = {
  358. tableId: "data-table",
  359. paginationInfoId: "pagination-info",
  360. paginationControlsId: "pagination-controls",
  361. pageSizeId: "current-page-size",
  362. pageSizeItemClass: "page-size-item",
  363. defaultPageSize: 10,
  364. columns: [
  365. /* {
  366. field: "checkbox",
  367. title: "",
  368. className: "w-1",
  369. headerRenderer: "checkbox", // 使用内置的复选框表头渲染器
  370. formatter: function(value, row) {
  371. return `<input class="form-check-input m-0 align-middle row-checkbox" type="checkbox" data-id="${row.id}" aria-label="选择行">`;
  372. }
  373. }, */
  374. { field: "id", title: "编号" },
  375. { field: "area", title: "区域", className: "tcs-table-area-column" },
  376. { field: "name", title: "名称", className: "tcs-table-name-column" },
  377. { field: "description", title: "描述", className: "tcs-table-desc-column" },
  378. { field: "type", title: "类型", className: "tcs-table-type-column" },
  379. { field: "version", title: "版本", className: "tcs-table-version-column" },
  380. {
  381. field: "createTime",
  382. title: "创建时间",
  383. className: "tcs-table-time-column",
  384. formatter: function(value) {
  385. return formatDateTime(value);
  386. }
  387. },
  388. {
  389. field: "currentMap",
  390. title: "当前地图",
  391. formatter: function(value) {
  392. return value; // 直接返回HTML字符串,让表格组件使用innerHTML渲染
  393. }
  394. },
  395. {
  396. field: "actions",
  397. title: "操作",
  398. className: "tcs-table-action-column",
  399. formatter: function(value, row) {
  400. return `<div class="btn-list">
  401. <button class="btn btn-sm btn-outline-primary tcs-table-oper-btn set-current-btn" data-bs-toggle="modal" data-bs-target="#setCurrentMapModal" data-id="${row.id}" data-name="${row.name}">设为当前</button>
  402. <button class="btn btn-sm btn-outline-secondary tcs-table-oper-btn edit-map-btn" data-bs-toggle="modal" data-bs-target="#editMapModal" data-id="${row.id}">编辑</button>
  403. <button class="btn btn-sm btn-outline-danger tcs-table-oper-btn delete-map-btn" data-bs-toggle="modal" data-bs-target="#deleteMapModal" data-id="${row.id}" data-name="${row.name}">删除</button>
  404. </div>`;
  405. }
  406. }
  407. ]
  408. };
  409. // 生成地图数据
  410. const alarmData = generateAlarmData(109);
  411. // 初始化表格
  412. const alarmTable = new TcsTable(tableOptions, alarmData);
  413. // 添加日期时间筛选功能
  414. const dateStart = document.getElementById("date-start");
  415. const dateEnd = document.getElementById("date-end");
  416. // 日期变化时触发查询 - 只有当元素存在时才添加事件监听器
  417. if (dateStart && dateEnd) {
  418. dateStart.addEventListener("change", applyFilters);
  419. dateEnd.addEventListener("change", applyFilters);
  420. }
  421. // 应用筛选函数
  422. function applyFilters() {
  423. const startDate = dateStart && dateStart.value ? new Date(dateStart.value) : null;
  424. const endDate = dateEnd && dateEnd.value ? new Date(dateEnd.value) : null;
  425. alarmTable.filter(function(alarm) {
  426. // 检查日期范围
  427. const alarmDate = new Date(alarm.time.replace(" ", "T"));
  428. const dateInRange =
  429. (!startDate || alarmDate >= startDate) &&
  430. (!endDate || alarmDate <= endDate);
  431. return dateInRange;
  432. });
  433. }
  434. // 生成地图数据
  435. function generateAlarmData(count) {
  436. const data = [];
  437. const areas = ["车间xxx", "车间yyy", "仓库A", "仓库B"];
  438. const names = ["地图1", "地图2", "地图3", "地图4", "地图5"];
  439. const descriptions = ["一层", "二层", "三层", "四层"];
  440. const types = ["云", "本地"];
  441. for (let i = 1; i <= count; i++) {
  442. const date = new Date();
  443. date.setFullYear(Math.floor(Math.random() * 5) + 2020);
  444. date.setMonth(Math.floor(Math.random() * 12));
  445. date.setDate(Math.floor(Math.random() * 28) + 1);
  446. const id = i < 10 ? `S21312${i}` : `L21312${i-10}`;
  447. data.push({
  448. id: id,
  449. area: areas[Math.floor(Math.random() * areas.length)],
  450. name: names[Math.floor(Math.random() * names.length)],
  451. description: descriptions[Math.floor(Math.random() * descriptions.length)],
  452. type: types[Math.floor(Math.random() * types.length)],
  453. version: `${Math.floor(Math.random() * 9) + 1}25131${Math.floor(Math.random() * 9) + 1}`,
  454. createTime: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`,
  455. currentMap: Math.random() > 0.5 ? '<i class="ti ti-map-pin"></i>' : '',
  456. actions: ""
  457. });
  458. }
  459. return data;
  460. }
  461. // 时间格式化函数
  462. function formatDateTime(dateTimeStr) {
  463. if (!dateTimeStr || dateTimeStr === "-") return "-";
  464. const date = new Date(dateTimeStr.replace(" ", "T"));
  465. return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")} ${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
  466. }
  467. // ---------------------初始化模态框组件---------------------
  468. // 添加地图模态框
  469. const addMapModal = new TcsModal({
  470. modalId: 'addMapModal',
  471. confirmBtnId: 'saveMapBtn',
  472. formId: 'addMapForm',
  473. onConfirm: function(data) {
  474. // 这里添加保存地图的逻辑
  475. console.log('保存新地图', data);
  476. // 模拟添加新地图到表格
  477. const newId = `M${Math.floor(Math.random() * 10000)}`;
  478. const now = new Date();
  479. const newMap = {
  480. id: newId,
  481. area: data.area,
  482. name: data.name,
  483. description: data.description,
  484. type: data.type,
  485. version: `1.0.0`,
  486. createTime: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`,
  487. currentMap: data.setCurrent ? '<i class="ti ti-map-pin"></i>' : '',
  488. actions: ""
  489. };
  490. // 如果设为当前地图,需要更新其他地图的状态
  491. if (data.setCurrent) {
  492. // 这里可以添加更新其他地图状态的逻辑
  493. }
  494. // 显示成功提示
  495. TcsNotify.show('地图已添加成功!', 'success');
  496. }
  497. });
  498. // 更新云地图确认模态框
  499. const updateCloudMapModal = new TcsModal({
  500. modalId: 'updateCloudMapModal',
  501. confirmBtnId: 'confirmUpdateCloudMapBtn',
  502. onConfirm: function() {
  503. // 这里添加更新云地图的逻辑
  504. console.log('更新云地图');
  505. // 模拟更新进度
  506. const progressNotification = document.createElement('div');
  507. progressNotification.className = 'alert alert-info alert-dismissible';
  508. progressNotification.style.paddingTop = '0.5rem';
  509. progressNotification.style.paddingBottom = '0.5rem';
  510. // 设置通知内容
  511. progressNotification.innerHTML = `
  512. <div class="d-flex">
  513. <div>
  514. <i class="ti ti-cloud-download alert-icon"></i>
  515. </div>
  516. <div class="flex-fill">
  517. <div>正在更新云地图...</div>
  518. <div class="progress progress-sm mt-2">
  519. <div class="progress-bar progress-bar-indeterminate"></div>
  520. </div>
  521. </div>
  522. </div>
  523. `;
  524. // 创建通知容器
  525. let notifyContainer = document.getElementById('notify-container');
  526. if (!notifyContainer) {
  527. notifyContainer = document.createElement('div');
  528. notifyContainer.id = 'notify-container';
  529. notifyContainer.className = 'position-fixed top-0 start-50 translate-middle-x p-2';
  530. notifyContainer.style.zIndex = '9999';
  531. notifyContainer.style.paddingTop = '0.5rem';
  532. notifyContainer.style.paddingBottom = '0.5rem';
  533. document.body.appendChild(notifyContainer);
  534. }
  535. // 添加到容器
  536. notifyContainer.appendChild(progressNotification);
  537. // 模拟更新完成
  538. setTimeout(() => {
  539. // 移除进度通知
  540. if (progressNotification.parentNode) {
  541. progressNotification.parentNode.removeChild(progressNotification);
  542. }
  543. // 显示成功提示
  544. TcsNotify.show('云地图已成功更新!', 'success');
  545. }, 3000);
  546. }
  547. });
  548. // 设为当前地图模态框
  549. let currentMapId = null;
  550. let currentMapName = null;
  551. const setCurrentMapModal = new TcsModal({
  552. modalId: 'setCurrentMapModal',
  553. confirmBtnId: 'confirmSetCurrentBtn',
  554. onShow: function(relatedTarget) {
  555. // 获取地图ID和名称
  556. currentMapId = relatedTarget ? relatedTarget.getAttribute('data-id') : null;
  557. currentMapName = relatedTarget ? relatedTarget.getAttribute('data-name') : null;
  558. // 更新模态框内容
  559. const modalBody = document.querySelector('#setCurrentMapModal .modal-body div:nth-child(2)');
  560. if (modalBody && currentMapName) {
  561. modalBody.textContent = `您确定要将地图"${currentMapName}"设为当前地图吗?这将替换当前正在使用的地图。`;
  562. }
  563. },
  564. onConfirm: function() {
  565. // 这里添加设为当前地图的逻辑
  566. console.log('设为当前地图:', currentMapId);
  567. // 模拟设置当前地图
  568. const rows = document.querySelectorAll('#data-table tbody tr');
  569. rows.forEach(row => {
  570. const id = row.querySelector('.row-checkbox').getAttribute('data-id');
  571. const currentCell = row.querySelector('td:nth-child(9)'); // 当前地图列
  572. if (currentCell) {
  573. // 清除所有当前地图标记
  574. currentCell.innerHTML = '';
  575. // 设置新的当前地图
  576. if (id === currentMapId) {
  577. currentCell.innerHTML = '<i class="ti ti-map-pin"></i>';
  578. }
  579. }
  580. });
  581. // 显示成功提示
  582. TcsNotify.show(`地图"${currentMapName}"已设为当前地图`, 'success');
  583. // 重置变量
  584. currentMapId = null;
  585. currentMapName = null;
  586. }
  587. });
  588. // 编辑地图模态框
  589. let editMapData = null;
  590. const editMapModal = new TcsModal({
  591. modalId: 'editMapModal',
  592. confirmBtnId: 'updateMapBtn',
  593. formId: 'editMapForm',
  594. onShow: function(relatedTarget) {
  595. // 获取地图ID
  596. const mapId = relatedTarget ? relatedTarget.getAttribute('data-id') : null;
  597. if (mapId) {
  598. // 模拟获取地图数据
  599. // 在实际应用中,这里应该是从服务器获取数据
  600. const rows = document.querySelectorAll('#data-table tbody tr');
  601. rows.forEach(row => {
  602. const id = row.querySelector('.row-checkbox').getAttribute('data-id');
  603. if (id === mapId) {
  604. // 获取行数据
  605. const area = row.querySelector('td:nth-child(3)').textContent;
  606. const name = row.querySelector('td:nth-child(4)').textContent;
  607. const description = row.querySelector('td:nth-child(5)').textContent;
  608. const type = row.querySelector('td:nth-child(6)').textContent;
  609. const isCurrent = row.querySelector('td:nth-child(9)').innerHTML.includes('ti-map-pin');
  610. // 保存数据以便后续使用
  611. editMapData = { id, area, name, description, type, isCurrent };
  612. // 填充表单
  613. document.getElementById('edit-map-id').value = id;
  614. const areaSelect = document.getElementById('edit-map-area');
  615. for (let i = 0; i < areaSelect.options.length; i++) {
  616. if (areaSelect.options[i].value === area) {
  617. areaSelect.selectedIndex = i;
  618. break;
  619. }
  620. }
  621. document.getElementById('edit-map-name').value = name;
  622. document.getElementById('edit-map-description').value = description;
  623. const typeSelect = document.getElementById('edit-map-type');
  624. for (let i = 0; i < typeSelect.options.length; i++) {
  625. if (typeSelect.options[i].value === type) {
  626. typeSelect.selectedIndex = i;
  627. break;
  628. }
  629. }
  630. document.getElementById('edit-map-set-current').checked = isCurrent;
  631. }
  632. });
  633. }
  634. },
  635. onConfirm: function(data) {
  636. // 这里添加更新地图的逻辑
  637. console.log('更新地图:', data);
  638. // 模拟更新地图
  639. const rows = document.querySelectorAll('#data-table tbody tr');
  640. rows.forEach(row => {
  641. const id = row.querySelector('.row-checkbox').getAttribute('data-id');
  642. if (id === data.id) {
  643. // 更新行数据
  644. row.querySelector('td:nth-child(3)').textContent = data.area;
  645. row.querySelector('td:nth-child(4)').textContent = data.name;
  646. row.querySelector('td:nth-child(5)').textContent = data.description;
  647. row.querySelector('td:nth-child(6)').textContent = data.type;
  648. // 更新当前地图状态
  649. if (data.setCurrent) {
  650. // 清除所有当前地图标记
  651. rows.forEach(r => {
  652. r.querySelector('td:nth-child(9)').innerHTML = '';
  653. });
  654. // 设置新的当前地图
  655. row.querySelector('td:nth-child(9)').innerHTML = '<i class="ti ti-map-pin"></i>';
  656. } else if (editMapData && editMapData.isCurrent && !data.setCurrent) {
  657. // 如果原来是当前地图,但现在取消了,则清除标记
  658. row.querySelector('td:nth-child(9)').innerHTML = '';
  659. }
  660. // 更新按钮的data-name属性
  661. const buttons = row.querySelectorAll('button[data-name]');
  662. buttons.forEach(button => {
  663. button.setAttribute('data-name', data.name);
  664. });
  665. }
  666. });
  667. // 显示成功提示
  668. TcsNotify.show(`地图"${data.name}"已更新成功`, 'success');
  669. // 重置变量
  670. editMapData = null;
  671. }
  672. });
  673. // 删除地图模态框
  674. let deleteMapId = null;
  675. let deleteMapName = null;
  676. const deleteMapModal = new TcsModal({
  677. modalId: 'deleteMapModal',
  678. confirmBtnId: 'confirmDeleteBtn',
  679. onShow: function(relatedTarget) {
  680. // 获取地图ID和名称
  681. deleteMapId = relatedTarget ? relatedTarget.getAttribute('data-id') : null;
  682. deleteMapName = relatedTarget ? relatedTarget.getAttribute('data-name') : null;
  683. // 更新模态框内容
  684. const modalBody = document.querySelector('#deleteMapModal .modal-body div:nth-child(2)');
  685. if (modalBody && deleteMapName) {
  686. modalBody.textContent = `您确定要删除地图"${deleteMapName}"吗?此操作无法撤销。`;
  687. }
  688. },
  689. onConfirm: function() {
  690. // 这里添加删除地图的逻辑
  691. console.log('删除地图:', deleteMapId);
  692. // 模拟删除地图
  693. const rows = document.querySelectorAll('#data-table tbody tr');
  694. rows.forEach(row => {
  695. const id = row.querySelector('.row-checkbox').getAttribute('data-id');
  696. if (id === deleteMapId) {
  697. // 检查是否是当前地图
  698. const isCurrent = row.querySelector('td:nth-child(9)').innerHTML.includes('ti-map-pin');
  699. // 从表格中移除行
  700. row.parentNode.removeChild(row);
  701. // 如果是当前地图,显示警告
  702. if (isCurrent) {
  703. TcsNotify.show(`警告:您删除了当前正在使用的地图,请设置新的当前地图`, 'warning');
  704. }
  705. }
  706. });
  707. // 显示成功提示
  708. TcsNotify.show(`地图"${deleteMapName}"已删除`, 'success');
  709. // 重置变量
  710. deleteMapId = null;
  711. deleteMapName = null;
  712. }
  713. });
  714. });
  715. </script>
  716. </body>
  717. </html>