diff --git a/bin/Release/assets/html/css/mystyle.css b/bin/Release/assets/html/css/mystyle.css index 944184b..7fb079e 100644 --- a/bin/Release/assets/html/css/mystyle.css +++ b/bin/Release/assets/html/css/mystyle.css @@ -452,4 +452,9 @@ tr.shown td.details-control { .btn-default:hover { background-color: #858585; +} + +/* 隐藏所有输入框的清除按钮 */ +input[type="date"]::-webkit-clear-button { + display: none; } \ No newline at end of file diff --git a/bin/Release/assets/html/js/common.js b/bin/Release/assets/html/js/common.js index e16becf..f3686e6 100644 --- a/bin/Release/assets/html/js/common.js +++ b/bin/Release/assets/html/js/common.js @@ -1,238 +1,261 @@ var G = { - user: { username: '' }, + user: { username: '' }, - loadPage: function (pagename) { - while (1) { - var script = document.querySelector("script[id='mytempfile']") - if (!script) break - script.remove() - } - var file = 'assets/html/pages/' + pagename + '.html' - G.cppNative.readFile(file).then(function (text) { - // 加载 html 页面内容文件 - document.getElementById('mypage').innerHTML = text - // 加载 js 脚本文件 - var jsUrl = './pages/' + pagename + '.js' - var element = document.createElement('script') - element.src = jsUrl + '?t=' + new Date().getTime() - element.async = false // 脚本按照加载先后顺序处理 - element.setAttribute('id', 'mytempfile') - document.body.appendChild(element) - }) - }, - - switchSetStatus: function (id1, id2, checked, callback) { - document.getElementById(id2).checked = !(document.getElementById(id1).checked = checked) - if (callback) callback(checked) - }, - switchGetStatus: function (id) { return document.getElementById(id).checked }, - - initTable: function (id, info) { - if (info.table) { - info.table.ajax.reload() - return; - } - var tableOption = G.tableGetOption() - tableOption.columns = info.columns - tableOption.ajax = function (req, callback, settings) { - G.cppNative.log('lxy=== table ajax start') - if (info.query) { - info.query(1, 10).then(res => { - var result = [] - res.data.forEach(function (item, index) { - var rowData = [] - info.header.forEach(function (key, index) { rowData.push(item[key]) }) - result.push(rowData) - }) - G.cppNative.log("table ajax: " + JSON.stringify(result)) - callback({ draw: req.draw, recordsTotal: result.length, recordsFiltered: result.length, data: result }) - }) - } else { - callback({ draw: req.draw, recordsTotal: 0, recordsFiltered: 0, data: [] }) - } - } - // 初始化表格 - info.table = $('#' + id + 'Table').DataTable(tableOption) - G.cppNative.log('lxy=== table init end') - //$('div.gotopage').html('跳转至 页') - }, - - updateTableData: function (queryFunc, params) { - if (queryFunc) { - } - }, - - cppCall: function (id) { - var cppfunc = G.cppNative[id] - if (cppfunc) { - G.cppNative.log('call cpp function [' + id + ']') - cppfunc() - } else { - G.cppNative.log('call cpp function [' + id + '] error: not exist') - } - }, - - cppSignal: function (id, callback) { - var signal = G.cppNative[id] - if (signal) { - G.cppNative.log('cpp signal [' + id + '] ') - signal.connect(callback) - } else { - G.cppNative.log('cpp signal [' + id + '] error: not exist') - } - }, - - initForm: function (id, funcPopConfirm) { - var form = document.getElementById(id + 'Form') - var formBtnOk = document.getElementById(id + 'FormOk') - if (form && formBtnOk) { - // 监听表单的输入事件,检查表单的必填项是否完成输入,如果未完成,则确认按钮不可用 - form.addEventListener('input', function () { formBtnOk.disabled = !form.checkValidity() }) - // 编辑弹窗的确定按钮监听点击事件 - formBtnOk.addEventListener('click', function () { if (funcPopConfirm) { funcPopConfirm(id) } }) - } - }, - - showElement: function (id, visible) { - var elemt = document.getElementById(id) - if (elemt) { elemt.style.display = visible ? 'block' : 'none' } - }, - - popSetParams: function (id, keys, rowdata, callback) { - keys.forEach(function (key, index) { - var val = '' - if (rowdata && rowdata.length > index) { val = rowdata[index] } - - if (key == 'is_open') { - G.switchSetStatus(id + 'Form_on', id + 'Form_off', parseInt(val)) - } else { - var myval = (callback) ? callback(id, key, val) : val - // 回调函数返回 undefined 时, 不需要设置参数值 - if (myval != undefined) { - val = myval - var element = $('#' + id + 'Form_' + key) - if (element) { - if (element.prop("tagName") == "SELECT" && val == '') { - element.get(0).selectedIndex = 0; - } else { - element.val(val) - } - } - } - } - }) - }, - - popGetParams: function (id, keys, rowdata, callback) { - var params = {} - keys.forEach(function (key, index) { - var val - if (key == 'is_open') { - val = G.switchGetStatus(id + 'Form_on') ? '1' : '0' - } else { - var myval = callback ? callback(id, key) : undefined - val = myval != undefined ? myval : $('#' + id + 'Form_' + key).val() - } - if (rowdata) { - if (rowdata.length > index && val != rowdata[index]) { params[key] = val } - } else { - if (val != '') { params[key] = val } - } - }) - G.cppNative.log('POP get params: id=' + id + ', params=' + JSON.stringify(params)) - return params - }, - - popSetParamReadonly: function (id, key, isReadonly) { - $('#' + id + 'Form_' + key).attr('readonly', isReadonly) - }, - - tableGetOption: function () { - return { - data: [], - columns: [], - bSort: false, - scollY: "600px", - //aLengthMenu: [10, 20, 50, 100], //设置每页显示数据条数的下拉选项 - //displayLength: 5, //每页初始显示最大记录数量 - // 设置:表格(t)、分页数据条数(l)、搜索框(f)、表格信息(i)、分页(p)、加载信息(r) - dom: 'rt<"mydt-ext"p<"item"<"gotopage">><"item"i><"item"f>>', - language: { - emptyTable: '无数据', - lengthMenu: '每页显示 _MENU_ 条记录', - zeroRecords: '对不起,查询不到任何相关数据', - info: '共有 _TOTAL_ 条记录', // '当前显示 _START_ 到 _END_ 条,共 _TOTAL_ 条记录', - infoEmpty: '共 0 页', - infoFiltered: '数据表中共为 _MAX_ 条记录)', - processing: '正在加载中...', - search: '结果中搜索', - paginate: { - previous: '上一页', next: '下一页', first: '首页', last: '尾页' - }, - }, - columnDefs: [{ targets: '_all', className: 'dt-head-left' }, { targets: '_all', className: 'dt-body-left' }], - //serverSide: true, - processing: false, - ajax: function (req, callback, settings) { - // 查询服务器获取数据, 同时获取总数据条数 - callback({ draw: req.draw, recordsTotal: 0, recordsFiltered: 0, data: [] }) - }, - - createdRow: function (row, data, dataIndex) { - if (dataIndex % 2 === 0) { - //$(row).css('background-color', '#ff000010') - } else { - //$(row).css('background-color', '#00ff0010') - } - - $(row).on('mouseenter', function () { - //if (curEditRow && myTableApi.row(curEditRow).index() == myTableApi.row($(this)).index()) return - $(this).css('background-color', '#ff808050') // 高亮颜色 - }) - $(row).on('mouseleave', function () { - //if (curEditRow && myTableApi.row(curEditRow).index() == myTableApi.row($(this)).index()) return - $(this).css('background-color', '') // 恢复默认 - }) - }, - } - }, - - clickSubpageBtn: function (id) { - if (G.curSubpageId == id) return - - if (G.curSubpageId) { - var oldBtn = document.getElementById(G.curSubpageId + 'Btn') - if (oldBtn) { oldBtn.className = 'btn btn-primary' } - var oldSubpage = $('#' + G.curSubpageId) - if (oldSubpage) { oldSubpage.hide() } - } - if (id) { - var curBtn = document.getElementById(id + 'Btn') - if (curBtn) { curBtn.className = 'btn btn-success btn-lg' } - var curSubpage = $('#' + id) - if (curSubpage) { curSubpage.show() } - } - - G.curSubpageId = id - }, - - - getRandDataDay: function (a, b, n) { - var data = [] - var t0 = Date.parse('2025-03-01 00:00:00') - if (!n) { n = 24 } - var step = 86400 / n - var y = a; - for (var i = 0; i < n; ++i) { - // data[i] = { x: t0 + i * step * 1000, y: Math.sin(i * 0.1) * (n - m) } - y = Math.floor((y + RAND(0, 50) - 25) * 100) / 100 - data[i] = { x: t0 + i * step * 1000, y: y } - } - return data + loadPage: function (pagename) { + while (1) { + var script = document.querySelector("script[id='mytempfile']") + if (!script) break + script.remove() } + var file = 'assets/html/pages/' + pagename + '.html' + G.cppNative.readFile(file).then(function (text) { + // 加载 html 页面内容文件 + document.getElementById('mypage').innerHTML = text + // 加载 js 脚本文件 + var jsUrl = './pages/' + pagename + '.js' + var element = document.createElement('script') + element.src = jsUrl + '?t=' + new Date().getTime() + element.async = false // 脚本按照加载先后顺序处理 + element.setAttribute('id', 'mytempfile') + document.body.appendChild(element) + }) + }, + + switchSetStatus: function (id1, id2, checked, callback) { + document.getElementById(id2).checked = !(document.getElementById(id1).checked = checked) + if (callback) callback(checked) + }, + switchGetStatus: function (id) { return document.getElementById(id).checked }, + + initTable: function (id, info) { + if (info.table) { + info.table.ajax.reload() + return; + } + var tableOption = G.tableGetOption() + tableOption.columns = info.columns + tableOption.ajax = function (req, callback, settings) { + G.cppNative.log('lxy=== table ajax start') + if (info.query) { + info.query(1, 10).then(res => { + var result = [] + res.data.forEach(function (item, index) { + var rowData = [] + info.header.forEach(function (key, index) { rowData.push(item[key]) }) + result.push(rowData) + }) + G.cppNative.log("table ajax: " + JSON.stringify(result)) + callback({ draw: req.draw, recordsTotal: result.length, recordsFiltered: result.length, data: result }) + }) + } else { + callback({ draw: req.draw, recordsTotal: 0, recordsFiltered: 0, data: [] }) + } + } + // 初始化表格 + info.table = $('#' + id + 'Table').DataTable(tableOption) + G.cppNative.log('lxy=== table init end') + //$('div.gotopage').html('跳转至 页') + }, + + updateTableData: function (queryFunc, params) { + if (queryFunc) { + } + }, + + cppCall: function (id) { + var cppfunc = G.cppNative[id] + if (cppfunc) { + G.cppNative.log('call cpp function [' + id + ']') + cppfunc() + } else { + G.cppNative.log('call cpp function [' + id + '] error: not exist') + } + }, + + cppSignal: function (id, callback) { + var signal = G.cppNative[id] + if (signal) { + G.cppNative.log('cpp signal [' + id + '] ') + signal.connect(callback) + } else { + G.cppNative.log('cpp signal [' + id + '] error: not exist') + } + }, + + initForm: function (id, funcPopConfirm) { + var form = document.getElementById(id + 'Form') + var formBtnOk = document.getElementById(id + 'FormOk') + if (form && formBtnOk) { + // 监听表单的输入事件,检查表单的必填项是否完成输入,如果未完成,则确认按钮不可用 + form.addEventListener('input', function () { formBtnOk.disabled = !form.checkValidity() }) + // 编辑弹窗的确定按钮监听点击事件 + formBtnOk.addEventListener('click', function () { if (funcPopConfirm) { funcPopConfirm(id) } }) + } + }, + + showElement: function (id, visible) { + var elemt = document.getElementById(id) + if (elemt) { elemt.style.display = visible ? 'block' : 'none' } + }, + + popSetParams: function (id, keys, rowdata, callback) { + keys.forEach(function (key, index) { + var val = '' + if (rowdata && rowdata.length > index) { val = rowdata[index] } + + if (key == 'is_open') { + G.switchSetStatus(id + 'Form_on', id + 'Form_off', parseInt(val)) + } else { + var myval = (callback) ? callback(id, key, val) : val + // 回调函数返回 undefined 时, 不需要设置参数值 + if (myval != undefined) { + val = myval + var element = $('#' + id + 'Form_' + key) + if (element) { + if (element.prop("tagName") == "SELECT" && val == '') { + element.get(0).selectedIndex = 0; + } else { + element.val(val) + } + } + } + } + }) + }, + + popGetParams: function (id, keys, rowdata, callback) { + var params = {} + keys.forEach(function (key, index) { + var val + if (key == 'is_open') { + val = G.switchGetStatus(id + 'Form_on') ? '1' : '0' + } else { + var myval = callback ? callback(id, key) : undefined + val = myval != undefined ? myval : $('#' + id + 'Form_' + key).val() + } + if (rowdata) { + if (rowdata.length > index && val != rowdata[index]) { params[key] = val } + } else { + if (val != '') { params[key] = val } + } + }) + G.cppNative.log('POP get params: id=' + id + ', params=' + JSON.stringify(params)) + return params + }, + + popSetParamReadonly: function (id, key, isReadonly) { + $('#' + id + 'Form_' + key).attr('readonly', isReadonly) + }, + + tableGetOption: function () { + return { + data: [], + columns: [], + bSort: false, + scollY: "600px", + //aLengthMenu: [10, 20, 50, 100], //设置每页显示数据条数的下拉选项 + //displayLength: 5, //每页初始显示最大记录数量 + // 设置:表格(t)、分页数据条数(l)、搜索框(f)、表格信息(i)、分页(p)、加载信息(r) + dom: 'rt<"mydt-ext"p<"item"<"gotopage">><"item"i><"item"f>>', + language: { + emptyTable: '无数据', + lengthMenu: '每页显示 _MENU_ 条记录', + zeroRecords: '对不起,查询不到任何相关数据', + info: '共有 _TOTAL_ 条记录', // '当前显示 _START_ 到 _END_ 条,共 _TOTAL_ 条记录', + infoEmpty: '共 0 页', + infoFiltered: '数据表中共为 _MAX_ 条记录)', + processing: '正在加载中...', + search: '结果中搜索', + paginate: { + previous: '上一页', next: '下一页', first: '首页', last: '尾页' + }, + }, + columnDefs: [{ targets: '_all', className: 'dt-head-left' }, { targets: '_all', className: 'dt-body-left' }], + //serverSide: true, + processing: false, + ajax: function (req, callback, settings) { + // 查询服务器获取数据, 同时获取总数据条数 + callback({ draw: req.draw, recordsTotal: 0, recordsFiltered: 0, data: [] }) + }, + + createdRow: function (row, data, dataIndex) { + if (dataIndex % 2 === 0) { + //$(row).css('background-color', '#ff000010') + } else { + //$(row).css('background-color', '#00ff0010') + } + + $(row).on('mouseenter', function () { + //if (curEditRow && myTableApi.row(curEditRow).index() == myTableApi.row($(this)).index()) return + $(this).css('background-color', '#ff808050') // 高亮颜色 + }) + $(row).on('mouseleave', function () { + //if (curEditRow && myTableApi.row(curEditRow).index() == myTableApi.row($(this)).index()) return + $(this).css('background-color', '') // 恢复默认 + }) + }, + } + }, + + clickSubpageBtn: function (id) { + if (G.curSubpageId == id) return + + if (G.curSubpageId) { + var oldBtn = document.getElementById(G.curSubpageId + 'Btn') + if (oldBtn) { oldBtn.className = 'btn btn-primary' } + var oldSubpage = $('#' + G.curSubpageId) + if (oldSubpage) { oldSubpage.hide() } + } + if (id) { + var curBtn = document.getElementById(id + 'Btn') + if (curBtn) { curBtn.className = 'btn btn-success btn-lg' } + var curSubpage = $('#' + id) + if (curSubpage) { curSubpage.show() } + } + + G.curSubpageId = id + }, + + + getRandDataDay: function (a, b, n) { + var data = [] + var t0 = Date.parse('2025-07-01 00:00:00') + if (!n) { n = 24 } + var step = 86400 / n + var y = a; + for (var i = 0; i < n; ++i) { + // data[i] = { x: t0 + i * step * 1000, y: Math.sin(i * 0.1) * (n - m) } + var x = t0 + i * step * 1000 + y = Math.floor((y + RAND(0, 50) - 25) * 100) / 100 + data[i] = { name: x, value: [x, y] } + } + return data + }, + + + // 格式化日期为YYYY-MM-DD + formatDateMD: function (date) { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + //return `${year}-${month}-${day}`; + return `${month}-${day}`; + }, + + alertMessage: function (type, message) { + const wrapper = document.createElement('div') + wrapper.innerHTML = [ + `
设备属性设置