web-mojo 2.1.1043 → 2.1.1087

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.
Files changed (119) hide show
  1. package/README.md +19 -16
  2. package/dist/admin.cjs.js +1 -1
  3. package/dist/admin.cjs.js.map +1 -1
  4. package/dist/admin.es.js +16 -14
  5. package/dist/admin.es.js.map +1 -1
  6. package/dist/auth.cjs.js +1 -1
  7. package/dist/auth.cjs.js.map +1 -1
  8. package/dist/auth.css +305 -266
  9. package/dist/auth.es.js +537 -2175
  10. package/dist/auth.es.js.map +1 -1
  11. package/dist/charts.cjs.js +1 -1
  12. package/dist/charts.cjs.js.map +1 -1
  13. package/dist/charts.css +319 -0
  14. package/dist/charts.es.js +555 -2
  15. package/dist/charts.es.js.map +1 -1
  16. package/dist/chunks/ChatView-BnC15uoD.js +2 -0
  17. package/dist/chunks/{ChatView-CGBaudUc.js.map → ChatView-BnC15uoD.js.map} +1 -1
  18. package/dist/chunks/{ChatView-DguKw-gR.js → ChatView-D-5lHZ5H.js} +7 -8
  19. package/dist/chunks/{ChatView-DguKw-gR.js.map → ChatView-D-5lHZ5H.js.map} +1 -1
  20. package/dist/chunks/{Collection-DD1_31eh.js → Collection-B64LJ92k.js} +2 -2
  21. package/dist/chunks/{Collection-DD1_31eh.js.map → Collection-B64LJ92k.js.map} +1 -1
  22. package/dist/chunks/{Collection-YRfGoT73.js → Collection-CsAk0UhA.js} +2 -2
  23. package/dist/chunks/{Collection-YRfGoT73.js.map → Collection-CsAk0UhA.js.map} +1 -1
  24. package/dist/chunks/ContextMenu-CfMAB33c.js +3 -0
  25. package/dist/chunks/ContextMenu-CfMAB33c.js.map +1 -0
  26. package/dist/chunks/{ContextMenu-B4_YS0G8.js → ContextMenu-Cvls3QC_.js} +350 -3
  27. package/dist/chunks/ContextMenu-Cvls3QC_.js.map +1 -0
  28. package/dist/chunks/DataView-DESqBxT-.js +2 -0
  29. package/dist/chunks/DataView-DESqBxT-.js.map +1 -0
  30. package/dist/chunks/{DataView-OUqaLmGB.js → DataView-QXyfcg2M.js} +3 -2
  31. package/dist/chunks/DataView-QXyfcg2M.js.map +1 -0
  32. package/dist/chunks/Dialog-BfXN-fFA.js +2 -0
  33. package/dist/chunks/Dialog-BfXN-fFA.js.map +1 -0
  34. package/dist/chunks/{Dialog-BiVgKzSK.js → Dialog-DHUsZ92-.js} +1375 -7
  35. package/dist/chunks/Dialog-DHUsZ92-.js.map +1 -0
  36. package/dist/chunks/{FormView-BClEkzmE.js → FormView-DGRmcKUG.js} +282 -123
  37. package/dist/chunks/FormView-DGRmcKUG.js.map +1 -0
  38. package/dist/chunks/FormView-KGvr68ju.js +3 -0
  39. package/dist/chunks/FormView-KGvr68ju.js.map +1 -0
  40. package/dist/chunks/{ListView-BMNhd5-B.js → ListView-BGJG4GYH.js} +3 -3
  41. package/dist/chunks/{ListView-BMNhd5-B.js.map → ListView-BGJG4GYH.js.map} +1 -1
  42. package/dist/chunks/{ListView-BRGiITfD.js → ListView-BpGEatee.js} +2 -2
  43. package/dist/chunks/{ListView-BRGiITfD.js.map → ListView-BpGEatee.js.map} +1 -1
  44. package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js → MetricsMiniChartWidget-BKbFGvXG.js} +4 -4
  45. package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js.map → MetricsMiniChartWidget-BKbFGvXG.js.map} +1 -1
  46. package/dist/chunks/MetricsMiniChartWidget-BNdGuSZV.js +2 -0
  47. package/dist/chunks/{MetricsMiniChartWidget-Esvv-lFp.js.map → MetricsMiniChartWidget-BNdGuSZV.js.map} +1 -1
  48. package/dist/chunks/{PDFViewer-NeL91Gon.js → PDFViewer-BIBNhuWY.js} +3 -3
  49. package/dist/chunks/{PDFViewer-NeL91Gon.js.map → PDFViewer-BIBNhuWY.js.map} +1 -1
  50. package/dist/chunks/{PDFViewer-D4uo3oiA.js → PDFViewer-nZAQQScE.js} +2 -2
  51. package/dist/chunks/{PDFViewer-D4uo3oiA.js.map → PDFViewer-nZAQQScE.js.map} +1 -1
  52. package/dist/chunks/Rest-BpDyhFfG.js +2 -0
  53. package/dist/chunks/Rest-BpDyhFfG.js.map +1 -0
  54. package/dist/chunks/{Rest-CS4jRCAs.js → Rest-DpbPbmra.js} +96 -5
  55. package/dist/chunks/Rest-DpbPbmra.js.map +1 -0
  56. package/dist/chunks/TokenManager-BWc_pRpg.js +2 -0
  57. package/dist/chunks/TokenManager-BWc_pRpg.js.map +1 -0
  58. package/dist/chunks/{TopNav-DC8oGpHp.js → TokenManager-N3e5wDu1.js} +369 -6
  59. package/dist/chunks/TokenManager-N3e5wDu1.js.map +1 -0
  60. package/dist/chunks/{WebSocketClient-D-5DJoMX.js → WebSocketClient-DghNkEyO.js} +2 -2
  61. package/dist/chunks/{WebSocketClient-D-5DJoMX.js.map → WebSocketClient-DghNkEyO.js.map} +1 -1
  62. package/dist/chunks/{WebSocketClient-DzcqAmho.js → WebSocketClient-E08hfP5f.js} +2 -2
  63. package/dist/chunks/{WebSocketClient-DzcqAmho.js.map → WebSocketClient-E08hfP5f.js.map} +1 -1
  64. package/dist/chunks/version-CKPqwcQJ.js +2 -0
  65. package/dist/chunks/version-CKPqwcQJ.js.map +1 -0
  66. package/dist/chunks/version-Dtwh-YkD.js +38 -0
  67. package/dist/chunks/version-Dtwh-YkD.js.map +1 -0
  68. package/dist/css/web-mojo.css +1 -17
  69. package/dist/docit.cjs.js +1 -1
  70. package/dist/docit.cjs.js.map +1 -1
  71. package/dist/docit.es.js +6 -8
  72. package/dist/docit.es.js.map +1 -1
  73. package/dist/index.cjs.js +1 -1
  74. package/dist/index.cjs.js.map +1 -1
  75. package/dist/index.es.js +34 -36
  76. package/dist/index.es.js.map +1 -1
  77. package/dist/lightbox.cjs.js +1 -1
  78. package/dist/lightbox.cjs.js.map +1 -1
  79. package/dist/lightbox.es.js +5 -4
  80. package/dist/lightbox.es.js.map +1 -1
  81. package/dist/map.cjs.js +1 -1
  82. package/dist/map.cjs.js.map +1 -1
  83. package/dist/map.es.js +82 -3
  84. package/dist/map.es.js.map +1 -1
  85. package/dist/timeline.cjs.js +1 -1
  86. package/dist/timeline.es.js +4 -4
  87. package/package.json +1 -1
  88. package/dist/chunks/ChatView-CGBaudUc.js +0 -2
  89. package/dist/chunks/ContextMenu-B4_YS0G8.js.map +0 -1
  90. package/dist/chunks/ContextMenu-DcLhcYMp.js +0 -3
  91. package/dist/chunks/ContextMenu-DcLhcYMp.js.map +0 -1
  92. package/dist/chunks/DataView-CdDY9ijM.js +0 -2
  93. package/dist/chunks/DataView-CdDY9ijM.js.map +0 -1
  94. package/dist/chunks/DataView-OUqaLmGB.js.map +0 -1
  95. package/dist/chunks/Dialog-BiVgKzSK.js.map +0 -1
  96. package/dist/chunks/Dialog-DmIPK_Bi.js +0 -2
  97. package/dist/chunks/Dialog-DmIPK_Bi.js.map +0 -1
  98. package/dist/chunks/FormView-BClEkzmE.js.map +0 -1
  99. package/dist/chunks/FormView-nulck4nL.js +0 -3
  100. package/dist/chunks/FormView-nulck4nL.js.map +0 -1
  101. package/dist/chunks/MetricsMiniChartWidget-Esvv-lFp.js +0 -2
  102. package/dist/chunks/Page-CvbwEoLv.js +0 -2
  103. package/dist/chunks/Page-CvbwEoLv.js.map +0 -1
  104. package/dist/chunks/Page-Deq4y2Kq.js +0 -351
  105. package/dist/chunks/Page-Deq4y2Kq.js.map +0 -1
  106. package/dist/chunks/Rest-BNYqGlnP.js +0 -2
  107. package/dist/chunks/Rest-BNYqGlnP.js.map +0 -1
  108. package/dist/chunks/Rest-CS4jRCAs.js.map +0 -1
  109. package/dist/chunks/TokenManager-CAZNcCMs.js +0 -366
  110. package/dist/chunks/TokenManager-CAZNcCMs.js.map +0 -1
  111. package/dist/chunks/TokenManager-CJBYcVqs.js +0 -2
  112. package/dist/chunks/TokenManager-CJBYcVqs.js.map +0 -1
  113. package/dist/chunks/TopNav-23B5R-dl.js +0 -2
  114. package/dist/chunks/TopNav-23B5R-dl.js.map +0 -1
  115. package/dist/chunks/TopNav-DC8oGpHp.js.map +0 -1
  116. package/dist/chunks/WebApp-C1vcdSuu.js +0 -1388
  117. package/dist/chunks/WebApp-C1vcdSuu.js.map +0 -1
  118. package/dist/chunks/WebApp-CpxtmTk0.js +0 -2
  119. package/dist/chunks/WebApp-CpxtmTk0.js.map +0 -1
@@ -485,6 +485,7 @@ class DataFormatter {
485
485
  this.register("datatime_tz", this.datetime_tz.bind(this));
486
486
  this.register("relative", this.relative.bind(this));
487
487
  this.register("fromNow", this.relative.bind(this));
488
+ this.register("relative_short", this.relative_short.bind(this));
488
489
  this.register("iso", this.iso.bind(this));
489
490
  this.register("epoch", (v) => {
490
491
  if (v === null || v === void 0 || v === "") return v;
@@ -517,6 +518,7 @@ class DataFormatter {
517
518
  this.register("phone", this.phone.bind(this));
518
519
  this.register("url", this.url.bind(this));
519
520
  this.register("badge", this.badge.bind(this));
521
+ this.register("badgeClass", this.badgeClass.bind(this));
520
522
  this.register("status", this.status.bind(this));
521
523
  this.register("status_text", this.status_text.bind(this));
522
524
  this.register("status_icon", this.status_icon.bind(this));
@@ -528,6 +530,8 @@ class DataFormatter {
528
530
  this.register("avatar", this.avatar.bind(this));
529
531
  this.register("image", this.image.bind(this));
530
532
  this.register("tooltip", this.tooltip.bind(this));
533
+ this.register("linkify", this.linkify.bind(this));
534
+ this.register("clipboard", this.clipboard.bind(this));
531
535
  this.register("default", this.default.bind(this));
532
536
  this.register("equals", this.equals.bind(this));
533
537
  this.register("json", this.json.bind(this));
@@ -552,8 +556,64 @@ class DataFormatter {
552
556
  this.register("hash", this.hash.bind(this));
553
557
  this.register("stripHtml", this.stripHtml.bind(this));
554
558
  this.register("highlight", this.highlight.bind(this));
559
+ this.register("nl2br", this.nl2br.bind(this));
560
+ this.register("code", this.code.bind(this));
555
561
  this.register("pre", (v) => `<pre class="bg-light p-2 rounded border">${this.escapeHtml(String(v))}</pre>`);
556
562
  }
563
+ relative_short(value) {
564
+ return this.relative(value, true);
565
+ }
566
+ linkify(value, options = {}) {
567
+ if (value === null || value === void 0) return "";
568
+ const text = String(value);
569
+ const escaped = this.escapeHtml(text);
570
+ const defaults = { urls: true, emails: true, target: "_blank", rel: "noopener noreferrer" };
571
+ const opts = options && typeof options === "object" ? { ...defaults, ...options } : defaults;
572
+ let result = escaped;
573
+ if (opts.urls !== false) {
574
+ const urlRegex = /(^|\s)((?:https?:\/\/|www\.)[^\s<]+)/gi;
575
+ result = result.replace(urlRegex, (match, prefix, url) => {
576
+ const href = url.startsWith("www.") ? `https://${url}` : url;
577
+ return `${prefix}<a href="${href}" target="${opts.target}" rel="${opts.rel}">${url}</a>`;
578
+ });
579
+ }
580
+ if (opts.emails !== false) {
581
+ const emailRegex = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi;
582
+ result = result.replace(emailRegex, (email) => `<a href="mailto:${email}">${email}</a>`);
583
+ }
584
+ return result;
585
+ }
586
+ clipboard(value, mode = "text") {
587
+ if (value === null || value === void 0) return "";
588
+ const text = String(value);
589
+ const escapedText = this.escapeHtml(text);
590
+ const showText = mode !== "icon-only";
591
+ const buttonHtml = `
592
+ <button type="button"
593
+ class="btn btn-sm btn-outline-secondary ms-1 p-0 border-0 bg-transparent"
594
+ title="Copy"
595
+ data-bs-toggle="tooltip"
596
+ data-action="copy-to-clipboard"
597
+ data-clipboard="${escapedText}">
598
+ <i class="bi bi-clipboard"></i>
599
+ </button>`.trim();
600
+ return `
601
+ <span class="mojo-clipboard d-inline-flex align-items-center">
602
+ ${showText ? `<span class="font-monospace">${escapedText}</span>` : ""}
603
+ ${buttonHtml}
604
+ </span>
605
+ `;
606
+ }
607
+ nl2br(value) {
608
+ if (value === null || value === void 0) return "";
609
+ return this.escapeHtml(String(value)).replace(/\r\n|\r|\n/g, "<br>");
610
+ }
611
+ code(value, lang = "") {
612
+ if (value === null || value === void 0) return "";
613
+ const language = lang ? `language-${this.escapeHtml(String(lang))}` : "";
614
+ const content = this.escapeHtml(String(value));
615
+ return `<pre class="bg-light p-2 rounded border"><code class="${language}">${content}</code></pre>`;
616
+ }
557
617
  /**
558
618
  * Register a custom formatter
559
619
  * @param {string} name - Formatter name
@@ -1006,8 +1066,8 @@ class DataFormatter {
1006
1066
  value = this.normalizeEpoch(value);
1007
1067
  const date = value instanceof Date ? value : new Date(value);
1008
1068
  if (isNaN(date.getTime())) return String(value);
1009
- const now2 = /* @__PURE__ */ new Date();
1010
- const diffMs = now2 - date;
1069
+ const now = /* @__PURE__ */ new Date();
1070
+ const diffMs = now - date;
1011
1071
  const diffSecs = Math.floor(diffMs / 1e3);
1012
1072
  const diffMins = Math.floor(diffSecs / 60);
1013
1073
  const diffHours = Math.floor(diffMins / 60);
@@ -2854,6 +2914,7 @@ class View {
2854
2914
  }
2855
2915
  canRender() {
2856
2916
  if (this.isRendering) return false;
2917
+ const now = Date.now();
2857
2918
  if (this.options.renderCooldown > 0 && now - this.lastRenderTime < this.options.renderCooldown) {
2858
2919
  View._warn(`View ${this.id}: Render called too quickly, cooldown active`);
2859
2920
  return false;
@@ -2875,12 +2936,12 @@ class View {
2875
2936
  // Render flow
2876
2937
  // ---------------------------------------------
2877
2938
  async render(allowMount = true, container = null) {
2878
- const now2 = Date.now();
2939
+ const now = Date.now();
2879
2940
  if (!this.canRender()) {
2880
2941
  return this;
2881
2942
  }
2882
2943
  this.isRendering = true;
2883
- this.lastRenderTime = now2;
2944
+ this.lastRenderTime = now;
2884
2945
  try {
2885
2946
  if (!this.initialized) await this.onInitView();
2886
2947
  this.unbindEvents();
@@ -3312,6 +3373,36 @@ class View {
3312
3373
  }
3313
3374
  alert(`Warning: ${message}`);
3314
3375
  }
3376
+ // Default action: copy value from data-clipboard to clipboard
3377
+ async onActionCopyToClipboard(event, element) {
3378
+ try {
3379
+ const carrier = element?.closest("[data-clipboard]") || element;
3380
+ const text = carrier?.getAttribute("data-clipboard") || "";
3381
+ if (!text) return true;
3382
+ if (navigator.clipboard && window.isSecureContext) {
3383
+ await navigator.clipboard.writeText(text);
3384
+ } else {
3385
+ const textarea = document.createElement("textarea");
3386
+ textarea.value = text;
3387
+ document.body.appendChild(textarea);
3388
+ textarea.select();
3389
+ document.execCommand("copy");
3390
+ document.body.removeChild(textarea);
3391
+ }
3392
+ const icon = element.querySelector("i");
3393
+ const originalClass = icon && icon.className;
3394
+ if (icon) {
3395
+ icon.className = "bi bi-check";
3396
+ setTimeout(() => {
3397
+ icon.className = originalClass;
3398
+ }, 1e3);
3399
+ }
3400
+ return true;
3401
+ } catch (err) {
3402
+ console.warn("Copy to clipboard failed:", err);
3403
+ return true;
3404
+ }
3405
+ }
3315
3406
  static _genId() {
3316
3407
  return `view_${Math.random().toString(36).substr(2, 9)}`;
3317
3408
  }
@@ -4042,4 +4133,4 @@ export {
4042
4133
  dataFormatter as d,
4043
4134
  rest as r
4044
4135
  };
4045
- //# sourceMappingURL=Rest-CS4jRCAs.js.map
4136
+ //# sourceMappingURL=Rest-DpbPbmra.js.map