r110/app.js · 约 3366 字符
1/* r110 家有账 · 公共交互(纯原生 JS,无任何依赖) */
2function $(s, r) { return (r || document).querySelector(s); }
3function $$(s, r) { return Array.prototype.slice.call((r || document).querySelectorAll(s)); }
4
5function money(n, sign) {
6 var v = Math.abs(Number(n) || 0).toFixed(2);
7 var p = v.split('.');
8 p[0] = p[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
9 var s = p[0] + '.' + p[1];
10 if (sign === 'pay') return '-' + s;
11 if (sign === 'inc') return '+' + s;
12 return s;
13}
14function money0(n) {
15 return (Math.round(Number(n) || 0)).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
16}
17function toast(msg, ms) {
18 var t = $('#toast'); if (!t) { return; }
19 t.textContent = msg; t.classList.add('on');
20 clearTimeout(t._tm); t._tm = setTimeout(function () { t.classList.remove('on'); }, ms || 1700);
21}
22function openSheet(id) {
23 var m = $('#mask'), s = $(id);
24 if (m) m.classList.add('on');
25 if (s) s.classList.add('on');
26}
27function closeSheet() {
28 var m = $('#mask');
29 if (m) m.classList.remove('on');
30 $$('.sheet').forEach(function (s) { s.classList.remove('on'); });
31}
32function bindMask() {
33 var m = $('#mask'); if (m) m.addEventListener('click', closeSheet);
34 $$('[data-close]').forEach(function (b) { b.addEventListener('click', closeSheet); });
35 $$('[data-sheet]').forEach(function (b) {
36 b.addEventListener('click', function () { openSheet(b.getAttribute('data-sheet')); });
37 });
38}
39/* 分段器 / chips 通用:回调 (value, el) */
40function segGroup(sel, cb) {
41 var box = $(sel); if (!box) return;
42 $$('span', box).forEach(function (s) {
43 s.addEventListener('click', function () {
44 $$('span', box).forEach(function (x) { x.classList.remove('on'); });
45 s.classList.add('on');
46 if (cb) cb(s.getAttribute('data-v') || s.textContent.trim(), s);
47 });
48 });
49}
50function segValue(sel) {
51 var on = $(sel + ' span.on');
52 return on ? (on.getAttribute('data-v') || on.textContent.trim()) : '';
53}
54/* 演示态占位提示 */
55function demoTip(msg) {
56 return function (e) { if (e) e.preventDefault(); toast(msg); };
57}
58function bindDemo() {
59 $$('[data-tip]').forEach(function (el) {
60 el.addEventListener('click', demoTip(el.getAttribute('data-tip')));
61 });
62}
63/* 环形进度 SVG */
64function ringSvg(pct, color, size, w) {
65 size = size || 118; w = w || 11;
66 var r = (size - w) / 2, c = 2 * Math.PI * r;
67 var off = c * (1 - Math.max(0, Math.min(1, pct)));
68 return '<svg width="' + size + '" height="' + size + '">' +
69 '<circle cx="' + size / 2 + '" cy="' + size / 2 + '" r="' + r + '" fill="none" stroke="#eef2f0" stroke-width="' + w + '"/>' +
70 '<circle cx="' + size / 2 + '" cy="' + size / 2 + '" r="' + r + '" fill="none" stroke="' + color + '" stroke-width="' + w +
71 '" stroke-linecap="round" stroke-dasharray="' + c.toFixed(1) + '" stroke-dashoffset="' + off.toFixed(1) + '"/></svg>';
72}
73/* 读取自定义流水(记一笔页写入) */
74function myBills() { return SG.get('bills', []); }
75function allBills() { return myBills().concat(BILLS); }
76
77document.addEventListener('DOMContentLoaded', function () {
78 bindMask(); bindDemo();
79 /* 底部购物式角标:显示本地新增笔数 */
80 var n = myBills().length, b = $('#tabBadge');
81 if (b && n > 0) { b.textContent = n; b.style.display = 'block'; }
82});
83