wwt-certificate-tool 1.2.31 → 1.2.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/app.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <title>WWT 金蝶凭证工具 · 纯前端版 P1.2.31</title>
6
+ <title>WWT 金蝶凭证工具 · 纯前端版 P1.2.32</title>
7
7
  <style>*{box-sizing:border-box;margin:0;padding:0}
8
8
  body{font-family:"Microsoft YaHei","PingFang SC",-apple-system,Segoe UI,sans-serif;font-size:13px;color:#1f2328;background:#f4f6f9;line-height:1.6}
9
9
  h1{font-size:17px;font-weight:600}
@@ -73,7 +73,8 @@ main{padding:14px 18px 60px}
73
73
 
74
74
  /* 卡片/栅格 */
75
75
  .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;margin-top:6px}
76
- .card{background:#fff;border:1px solid #dde2e8;border-radius:7px;padding:9px 11px;display:flex;justify-content:space-between;align-items:center}
76
+ .card{background:#fff;border:1px solid #dde2e8;border-radius:7px;padding:9px 11px;display:flex;justify-content:space-between;align-items:center;cursor:pointer;transition:all .15s ease}
77
+ .card:hover{border-color:#1677ff;box-shadow:0 2px 6px rgba(22,119,255,.15);transform:translateY(-1px)}
77
78
  .card.ok{border-left:3px solid #1a7f37}
78
79
  .card.empty{border-left:3px solid #d0d7de}
79
80
  .cname{font-size:12.5px;font-weight:500}
@@ -253,21 +254,22 @@ tr.bad:hover td{background:#fbe9e9}
253
254
  * 📋 数据浏览/编辑抽屉(P1.2.27 · 对齐后端 v2.17)
254
255
  * ============================================================ */
255
256
  .dv-mask{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:300;display:flex;align-items:stretch;justify-content:flex-start}
256
- .dv-panel{position:absolute;left:0;top:0;bottom:0;width:min(96vw,1100px);background:#fff;box-shadow:4px 0 16px rgba(0,0,0,.18);display:flex;flex-direction:column}
257
- .dv-header{padding:12px 18px;border-bottom:1px solid #eee;background:#fafafa;display:flex;align-items:center;gap:10px;font-size:14px}
257
+ .dv-panel{position:absolute;left:0;top:0;bottom:0;right:0;background:#fff;box-shadow:4px 0 16px rgba(0,0,0,.18);display:flex;flex-direction:column;width:auto}
258
+ .dv-header{padding:10px 18px;border-bottom:1px solid #eee;background:#fafafa;display:flex;align-items:center;gap:10px;font-size:14px;flex-shrink:0}
258
259
  .dv-hint{font-size:12px;color:#888}
259
260
  .dv-body{display:flex;flex:1;min-height:0}
260
- .dv-left{width:240px;border-right:1px solid #eee;overflow:auto;padding:6px;background:#fcfcfc}
261
+ .dv-left{width:260px;flex-shrink:0;border-right:1px solid #eee;overflow:auto;padding:6px;background:#fcfcfc}
261
262
  .dv-grp{padding:4px 10px;color:#888;font-size:11px;border-bottom:1px solid #eee;margin-top:4px}
262
- .dv-key-item{padding:6px 10px;cursor:pointer;border-radius:4px;font-size:12px;color:#333;display:flex;justify-content:space-between;align-items:center}
263
+ .dv-key-item{padding:7px 10px;cursor:pointer;border-radius:4px;font-size:12px;color:#333;display:flex;justify-content:space-between;align-items:center;gap:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
263
264
  .dv-key-item:hover{background:#f0f4f8}
264
265
  .dv-key-item.sel{background:#e6f4ff;color:#1677ff;font-weight:bold}
265
266
  .dv-key-item.empty{color:#aaa}
266
- .dv-key-meta{font-size:10px;color:#bbb;font-weight:normal}
267
+ .dv-key-meta{font-size:10px;color:#bbb;font-weight:normal;flex-shrink:0}
267
268
  .dv-key-item.sel .dv-key-meta{color:#1677ff}
269
+ .dv-key-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
268
270
  .dv-right{flex:1;display:flex;flex-direction:column;min-width:0}
269
- .dv-toolbar{padding:8px 14px;background:#fff;border-bottom:1px solid #f0f0f0;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
270
- .dv-filter{flex:1;min-width:160px;padding:4px 8px;border:1px solid #ccc;border-radius:4px;font-size:12px}
271
+ .dv-toolbar{padding:8px 14px;background:#fff;border-bottom:1px solid #f0f0f0;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;flex-shrink:0}
272
+ .dv-filter{flex:1;min-width:140px;padding:4px 8px;border:1px solid #ccc;border-radius:4px;font-size:12px}
271
273
  .dv-btn{padding:4px 10px;border:0;border-radius:4px;font-size:12px;cursor:pointer}
272
274
  .dv-btn.ghost{background:#f4f6f8;color:#333}
273
275
  .dv-btn.ghost:hover{background:#e8eaed}
@@ -275,13 +277,23 @@ tr.bad:hover td{background:#fbe9e9}
275
277
  .dv-btn.act:hover{background:#0e6ad6}
276
278
  .dv-btn.warn{background:#fa8c16;color:#fff}
277
279
  .dv-btn.warn:hover{background:#d97a14}
278
- .dv-grid{flex:1;overflow:auto;padding:6px 14px}
279
- .dv-table{width:100%;border-collapse:collapse;font-size:12px;background:#fff}
280
- .dv-table th{background:#fafafa;font-weight:600;padding:6px 8px;border-bottom:1px solid #e3e6ea;border-right:1px solid #f0f0f0;text-align:left;position:sticky;top:0;z-index:2;white-space:nowrap}
281
- .dv-table td{padding:0;border-bottom:1px solid #f0f0f0;border-right:1px solid #f7f7f7}
280
+ .dv-grid{flex:1;overflow:auto;padding:6px 14px;min-width:0}
281
+ .dv-grid-inner{display:inline-block;min-width:100%}
282
+ .dv-table{border-collapse:collapse;font-size:12px;background:#fff;table-layout:auto;width:max-content;min-width:100%}
283
+ .dv-table th{background:#fafafa;font-weight:600;padding:6px 10px;border-bottom:1px solid #e3e6ea;border-right:1px solid #f0f0f0;text-align:left;position:sticky;top:0;z-index:2;white-space:nowrap}
284
+ .dv-table td{padding:0;border-bottom:1px solid #f0f0f0;border-right:1px solid #f7f7f7;white-space:nowrap;max-width:360px;overflow:hidden;text-overflow:ellipsis}
282
285
  .dv-table input{width:100%;padding:4px 6px;border:0;background:transparent;font-size:12px;box-sizing:border-box}
283
286
  .dv-table input:focus{outline:2px solid #1677ff;background:#fff}
284
287
  .dv-table tr.sel{background:#f0f7ff}
288
+
289
+ /* 📤 上传 Excel 弹窗(P1.2.32) */
290
+ .uploadpanel{max-width:560px}
291
+ .up-row{display:flex;align-items:center;gap:12px;margin-bottom:14px}
292
+ .up-row label{width:80px;color:#555;font-size:13px;flex-shrink:0}
293
+ .up-row select,.up-row input[type=file]{flex:1;padding:6px 10px;border:1px solid #ccc;border-radius:4px;font-size:13px;min-width:0}
294
+ .up-row.up-actions{justify-content:flex-end;margin-bottom:0;gap:8px}
295
+ .up-tip{font-size:12px;color:#666;background:#f6f8fa;padding:10px 12px;border-radius:4px;margin-bottom:14px;line-height:1.7}
296
+ .up-tip b{color:#1677ff}
285
297
  .dv-cb{width:30px;text-align:center}
286
298
  .dv-cb input{cursor:pointer}
287
299
  .dv-num{width:40px;text-align:right;color:#888}
@@ -293,7 +305,7 @@ tr.bad:hover td{background:#fbe9e9}
293
305
  <div class="brand">
294
306
  <span class="logo">WWT</span>
295
307
  <div>
296
- <h1>金蝶凭证工具 <span class="ver">P1.2.31</span></h1>
308
+ <h1>金蝶凭证工具 <span class="ver">P1.2.32</span></h1>
297
309
  <div class="sub">纯前端离线版 · 双击即用 · 数据只存在本机,不上传任何服务器</div>
298
310
  </div>
299
311
  </div>
@@ -330,9 +342,8 @@ tr.bad:hover td{background:#fbe9e9}
330
342
  <br><b>业务数据表必须是 .xls 原文件,不要改名、不要另存为 .xlsx。</b>
331
343
  </div>
332
344
  <div class="rowacts">
333
- <button class="btn primary big" onclick="UI.openDataTree()">🌲 选择数据表 / 字段(树形导航)</button>
334
- <button class="btn ghost big" onclick="UI.openDataViewer()">📋 数据浏览/编辑(抽屉)</button>
335
- <span class="tip">也可以把 Excel 直接拖到下面的框里自动归位;点「🌲」可逐级展开查看每张表、每个字段;点「📋」打开抽屉,按左侧 key 列表切换表,右侧直接编辑单元格、改完点「保存到 xlsx」回写</span>
345
+ <button class="btn primary big" onclick="UI.openUploadDialog()">📤 上传 Excel 数据</button>
346
+ <span class="tip">点上面的按钮弹上传对话框(17 张表下拉选);或直接把 Excel <b>拖到下方对应区域</b>自动归位。点下方<b>已上传的卡片</b>打开「📋 数据浏览/编辑」抽屉,在那里改单元格、复制行、删行,最后点「💾 保存到 xlsx」回写到本地数据。</span>
336
347
  </div>
337
348
  <h3>基础数据(9 个 · 一次上传长期有效)<span class="tip" style="margin-left:8px">支持 <b>点击按钮</b> 或 <b>把 Excel 文件拖到这里</b></span></h3>
338
349
  <div class="grid dropzone" id="grpBase" data-kind="base"></div>
@@ -3311,7 +3322,7 @@ const S = window.__STATE__ = {
3311
3322
  };
3312
3323
 
3313
3324
  /* ---------------- 版本 & 框架自动更新(只更新程序本身,本地数据/规则不动) ---------------- */
3314
- const WWT_VER=(function(){const raw='P1.2.31';return raw.indexOf('__WVER__')>=0?'P1.2.10':raw;})();
3325
+ const WWT_VER=(function(){const raw='P1.2.32';return raw.indexOf('__WVER__')>=0?'P1.2.10':raw;})();
3315
3326
  const UPD_URL_KEY='wwt_fe_updurl';
3316
3327
  // 默认更新源:Gitee 上本项目的 version.json(API 接口,浏览器可直接跨域读)
3317
3328
  const DEFAULT_UPD_URL='https://gitee.com/api/v5/repos/wwtmrhu/certificate-generation/contents/dist/version.json';
@@ -3732,20 +3743,33 @@ const BASE_KEYWORD={'会计科目表':['科目'],'供应商表':['供应商'],'
3732
3743
 
3733
3744
  function renderUpload(){
3734
3745
  const gb=$('grpBase'),gbi=$('grpBiz');
3735
- // 卡片改为「只读展示」:所有数据选择(上传/预览/删除)统一走顶部「🌲 选择数据表」树形面板,
3736
- // 不再在每张卡片旁放独立按钮(避免按钮过多且不统一)。拖拽上传保留。
3746
+ // 卡片改为「可点击进入抽屉」:已上传表点一下打开抽屉浏览/编辑,未上传表点一下弹「上传 Excel」对话框
3737
3747
  gb.innerHTML=C.BASE_SLOTS.map(s=>{
3738
3748
  const rows=(S.base[s.key]||[]).length;
3739
- return '<div class="card '+(rows?'ok':'empty')+'" data-slot="'+esc(s.key)+'" data-kind="base">'+
3740
- '<div><div class="cname">'+esc(s.label)+'</div><div class="cmeta">'+(rows?'✅ 已上传 · '+rows+' 行':'⚪ 未上传')+'</div></div></div>';
3749
+ const cls='card '+(rows?'ok':'empty');
3750
+ return '<div class="'+cls+'" data-slot="'+esc(s.key)+'" data-kind="base" data-loaded="'+(rows?1:0)+'">'+
3751
+ '<div><div class="cname">'+esc(s.label)+'</div><div class="cmeta">'+(rows?'✅ 已上传 · '+rows+' 行':'⚪ 未上传 · 点此上传')+'</div></div></div>';
3741
3752
  }).join('');
3742
3753
  gbi.innerHTML=C.BIZ_SLOTS.map(s=>{
3743
3754
  const rows=(S.biz[s.key]||[]).length;
3744
3755
  const f=C.SOURCE_META[s.key]?C.SOURCE_META[s.key].file:'';
3745
- return '<div class="card '+(rows?'ok':'empty')+'" data-slot="'+esc(s.key)+'" data-kind="biz">'+
3746
- '<div><div class="cname">'+esc(s.label)+'</div><div class="cmeta">'+(rows?'✅ 已上传 · '+rows+'':'⚪ 未上传')+
3756
+ const cls='card '+(rows?'ok':'empty');
3757
+ return '<div class="'+cls+'" data-slot="'+esc(s.key)+'" data-kind="biz" data-loaded="'+(rows?1:0)+'">'+
3758
+ '<div><div class="cname">'+esc(s.label)+'</div><div class="cmeta">'+(rows?'✅ 已上传 · '+rows+' 行':'⚪ 未上传 · 点此上传')+
3747
3759
  (f?' · '+esc(f):'')+'</div></div></div>';
3748
3760
  }).join('');
3761
+ // 卡片点击:已上传 → 打开抽屉浏览/编辑;未上传 → 弹上传对话框
3762
+ // 用事件委托,一次挂到 grpBase / grpBiz 即可(renderUpload 时不重复挂)
3763
+ [['grpBase','base'],['grpBiz','biz']].forEach(([id,kind])=>{
3764
+ const box=$(id); if(!box || box._clickWired) return; box._clickWired=true;
3765
+ box.addEventListener('click', e=>{
3766
+ const c=e.target.closest&&e.target.closest('.card');
3767
+ if(!c || !box.contains(c)) return;
3768
+ const key=c.dataset.slot, loaded=c.dataset.loaded==='1';
3769
+ if(loaded) openDataViewer(kind, key);
3770
+ else openUploadDialog();
3771
+ });
3772
+ });
3749
3773
  // 拖拽上传:整个区域都能接文件,多文件按 autoAutoFill 逻辑自动归位(监听只挂一次)
3750
3774
  [['grpBase','base'],['grpBiz','biz']].forEach(([id,kind])=>{
3751
3775
  const box=$(id); if(!box || box._dragWired===kind) return; box._dragWired=kind;
@@ -3897,6 +3921,49 @@ function _treeOnClick(e){
3897
3921
  if(act==='refresh'){ refreshUpload(); _treeRefreshIfOpen(); return; }
3898
3922
  }
3899
3923
 
3924
+ // 📤 上传 Excel 数据弹窗(P1.2.32 · 替代旧的树形入口)
3925
+ // 17 张表分组下拉 + 文件 input + 名称自动校验 + 实时上传
3926
+ function openUploadDialog(){
3927
+ const m=$('modal');
3928
+ const optBiz = C.BIZ_SLOTS.map(s=>'<option value="'+esc(s.key)+'" data-kind="biz">'+esc(s.label)+'(业务)</option>').join('');
3929
+ const optBase = C.BASE_SLOTS.map(s=>'<option value="'+esc(s.key)+'" data-kind="base">'+esc(s.label)+'(基础)</option>').join('');
3930
+ m.innerHTML=
3931
+ '<div class="modalbox uploadpanel">'+
3932
+ '<div class="modalhd"><h3>📤 上传 Excel 数据</h3><button class="mini" data-act="close">✕ 关闭</button></div>'+
3933
+ '<div class="modalbd">'+
3934
+ '<div class="up-row"><label>目标表</label>'+
3935
+ '<select id="upSlot"><optgroup label="业务数据(每月重传)">'+optBiz+'</optgroup>'+
3936
+ '<optgroup label="基础数据(一次上传长期有效)">'+optBase+'</optgroup></select>'+
3937
+ '</div>'+
3938
+ '<div class="up-row"><label>选择文件</label><input type="file" id="upFile" accept=".xls,.xlsx"></div>'+
3939
+ '<div class="up-tip">业务数据请用本月原 <b>.xls</b> 文件,<b>不要改名、不要另存为 .xlsx</b>。文件名含表关键字可自动归位(如「入库已确认.xls」「客户表.xls」)。</div>'+
3940
+ '<div class="up-row up-actions">'+
3941
+ '<button class="btn primary" data-act="upload">📤 上传</button>'+
3942
+ '<button class="btn ghost" data-act="close">取消</button>'+
3943
+ '</div>'+
3944
+ '</div>'+
3945
+ '</div>';
3946
+ m.style.display='flex';
3947
+ const box=m.querySelector('.uploadpanel');
3948
+ const close=()=>{ m.style.display='none'; m.innerHTML=''; };
3949
+ box.addEventListener('click', async e=>{
3950
+ if(e.target.dataset && e.target.dataset.act==='close'){ close(); return; }
3951
+ if(e.target.dataset && e.target.dataset.act==='upload'){
3952
+ const sel=$('upSlot'), fileEl=$('upFile');
3953
+ const file=fileEl.files && fileEl.files[0];
3954
+ const opt=sel.options[sel.selectedIndex];
3955
+ const key=sel.value, kind=opt.dataset.kind;
3956
+ if(!file){ toast('请先选文件'); return; }
3957
+ // 业务表按 SOURCE_META.file 关键字校验;基础表按 key 关键字
3958
+ const stem = kind==='base' ? key : ((C.SOURCE_META[key]&&C.SOURCE_META[key].file)||'').replace(/\.xls$/i,'');
3959
+ if(stem && file.name.indexOf(stem)<0 && !confirm('文件名不含「'+stem+'」,可能不是该表对应文件,仍要上传吗?')) return;
3960
+ close();
3961
+ await handleOne(kind, key, file);
3962
+ renderUpload();
3963
+ }
3964
+ });
3965
+ }
3966
+
3900
3967
  function openDataTree(){
3901
3968
  const m=$('modal');
3902
3969
  m.innerHTML=
@@ -6233,12 +6300,12 @@ function _dvRenderLeft(){
6233
6300
  for(const s of C.BIZ_SLOTS){
6234
6301
  const loaded = (S.biz[s.key]||[]).length;
6235
6302
  const file = (C.SOURCE_META[s.key]&&C.SOURCE_META[s.key].file)||'';
6236
- html += `<div class="dv-key-item${loaded?'':' empty'}" data-key="${esc(s.key)}" data-kind="biz" onclick="UI._dvPickKey('${esc(s.key)}','biz')" title="${esc(file)} · ${loaded} 行">${esc(s.label)}<span class="dv-key-meta">${loaded?('✅ '+loaded):'未上传'}</span></div>`;
6303
+ html += `<div class="dv-key-item${loaded?'':' empty'}" data-key="${esc(s.key)}" data-kind="biz" onclick="UI._dvPickKey('${esc(s.key)}','biz')" title="${esc(file)} · ${loaded} 行"><span class="dv-key-name">${esc(s.label)}</span><span class="dv-key-meta">${loaded?('✅ '+loaded):'未上传'}</span></div>`;
6237
6304
  }
6238
6305
  html += '<div class="dv-grp" style="margin-top:8px">基础数据</div>';
6239
6306
  for(const s of C.BASE_SLOTS){
6240
6307
  const loaded = (S.base[s.key]||[]).length;
6241
- html += `<div class="dv-key-item${loaded?'':' empty'}" data-key="${esc(s.key)}" data-kind="base" onclick="UI._dvPickKey('${esc(s.key)}','base')" title="${esc(s.key)}.xls · ${loaded} 行">${esc(s.label)}<span class="dv-key-meta">${loaded?('✅ '+loaded):'未上传'}</span></div>`;
6308
+ html += `<div class="dv-key-item${loaded?'':' empty'}" data-key="${esc(s.key)}" data-kind="base" onclick="UI._dvPickKey('${esc(s.key)}','base')" title="${esc(s.key)}.xls · ${loaded} 行"><span class="dv-key-name">${esc(s.label)}</span><span class="dv-key-meta">${loaded?('✅ '+loaded):'未上传'}</span></div>`;
6242
6309
  }
6243
6310
  left.innerHTML = html;
6244
6311
  }
@@ -6296,7 +6363,7 @@ function _dvRenderBody(){
6296
6363
  const v = r[c]; return v!==null && v!==undefined && String(v).toLowerCase().indexOf(ft) >= 0;
6297
6364
  }));
6298
6365
  }
6299
- let html = '<table class="dv-table"><thead><tr>';
6366
+ let html = '<div class="dv-grid-inner"><table class="dv-table"><thead><tr>';
6300
6367
  const allPicked = displayRows.length > 0 && _dvState.picked.size === displayRows.length;
6301
6368
  html += `<th class="dv-cb"><input type="checkbox" onchange="UI._dvToggleAll(this.checked)" ${allPicked?'checked':''}></th>`;
6302
6369
  html += '<th class="dv-num">#</th>';
@@ -6311,14 +6378,14 @@ function _dvRenderBody(){
6311
6378
  const v = r[c];
6312
6379
  const isDate = _dvIsDateCol(c, v);
6313
6380
  const display = (v===null||v===undefined)?'':String(v);
6314
- html += `<td><input type="${isDate?'date':'text'}" data-r="${realIdx}" data-c="${esc(c)}" value="${esc(display)}" onblur="UI._dvCellBlur(this)"></td>`;
6381
+ html += `<td title="${esc(display)}"><input type="${isDate?'date':'text'}" data-r="${realIdx}" data-c="${esc(c)}" value="${esc(display)}" onblur="UI._dvCellBlur(this)"></td>`;
6315
6382
  }
6316
6383
  html += '</tr>';
6317
6384
  }
6318
6385
  if(!displayRows.length){
6319
6386
  html += `<tr><td colspan="${cols.length+2}" style="padding:20px;color:#999;text-align:center;">${ft?'没有匹配的':''}空表</td></tr>`;
6320
6387
  }
6321
- html += '</tbody></table>';
6388
+ html += '</tbody></table></div>';
6322
6389
  $('dvBody').innerHTML = html;
6323
6390
  }
6324
6391
  function _dvIsDateCol(head, v){
@@ -6455,6 +6522,7 @@ window.UI={
6455
6522
  DB:DB,
6456
6523
  // ①
6457
6524
  pickOne:pickOne, refreshUpload:refreshUpload, clearBiz:clearBiz,
6525
+ openUploadDialog:openUploadDialog,
6458
6526
  openDataTree:openDataTree, _treeRefreshIfOpen:_treeRefreshIfOpen,
6459
6527
  autoFillBase:()=>autoFill('base'), autoFillBiz:()=>autoFill('biz'),
6460
6528
  delSlot:async(kind,key)=>{
package/dist/version.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "ver": "P1.2.31",
3
- "npm": "1.2.31",
4
- "url": "https://cdn.jsdelivr.net/npm/wwt-certificate-tool@1.2.31/dist/app.html",
5
- "url_unpkg": "https://unpkg.com/wwt-certificate-tool@1.2.31/dist/app.html",
6
- "url_gh": "https://api.github.com/repos/huweipei745839/certificate-generation/contents/dist/WWT%E5%87%AD%E8%AF%81%E5%B7%A5%E5%85%B7_P1.2.31.html",
7
- "note": "修复「下载更新后打不开」:openApp 原先把入参无脑当 base64 解码,而 jsDelivr/unpkg 返回的是明文 HTML InvalidCharacterError(表现:下载成功却提示失败)。现自动识别(以 < 开头即明文)。另含 P1.2.30 的更新源改造:改走 npm 包 wwt-certificate-tool + jsDelivr CDN(npmmirror /files/ cnpm 白名单,新包不可用,仅用其 /latest 查版本号)。"
2
+ "ver": "P1.2.32",
3
+ "npm": "1.2.32",
4
+ "url": "https://cdn.jsdelivr.net/npm/wwt-certificate-tool@1.2.32/dist/app.html",
5
+ "url_unpkg": "https://unpkg.com/wwt-certificate-tool@1.2.32/dist/app.html",
6
+ "url_gh": "https://api.github.com/repos/huweipei745839/certificate-generation/contents/dist/WWT%E5%87%AD%E8%AF%81%E5%B7%A5%E5%85%B7_P1.2.32.html",
7
+ "note": "界面变大适配列宽:① 上传页移除「🌲」树形入口和卡片旁按钮,只保留一个「📤 上传 Excel 数据」按钮 + 拖拽 + 点卡片(已上传→抽屉,未上传→上传弹窗),避免入口太多混淆;② 数据浏览抽屉填满窗口(dv-panel left:0/right:0 锁死,去掉之前 max-width:1100px 上限,1920px 屏幕不再留大块灰色空白);③ 左列 240→260px 防止「收入类型确认(采购·已确认)」被截断;④ 抽屉表格列宽自适应(table-layout:auto + max-content,按付款方式/付款确认等长字段完整显示)。"
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wwt-certificate-tool",
3
- "version": "1.2.31",
3
+ "version": "1.2.32",
4
4
  "description": "WWT 金蝶凭证工具 · 纯前端版(离线单文件 HTML,双击即用)",
5
5
  "keywords": [
6
6
  "WWT",