@feedmepos/mf-report 5.30.4-beta.0 → 5.31.0-beta.0

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 (37) hide show
  1. package/dist/{App-Bp2T86pd.js → App-CnVD_aRe.js} +4 -4
  2. package/dist/{DateRangeSelect-COoxXj-r.js → DateRangeSelect-DpKNUuKx.js} +1 -1
  3. package/dist/{Default.vue_vue_type_script_setup_true_lang-DCU8ehY7.js → Default.vue_vue_type_script_setup_true_lang-I4NO9UOX.js} +1 -1
  4. package/dist/{DynamicWidget.vue_vue_type_script_setup_true_lang-N5cxTr5h.js → DynamicWidget.vue_vue_type_script_setup_true_lang-Dz10heLt.js} +7 -7
  5. package/dist/{GlobalFilterSelect.vue_vue_type_script_setup_true_lang-B4uPv0Pp.js → GlobalFilterSelect.vue_vue_type_script_setup_true_lang-BRu0JrvS.js} +80 -80
  6. package/dist/{InsightView-EI3MZTiZ.js → InsightView-C8WZt__5.js} +5 -5
  7. package/dist/{Integration--zhnuAYf.js → Integration-C5tSrNLw.js} +3 -3
  8. package/dist/{Integrations-Cg2zVFJc.js → Integrations-C83LbzmE.js} +2 -2
  9. package/dist/{Layout-Ci4Zbsz6.js → Layout-Biqg7zFF.js} +1 -1
  10. package/dist/{LocationSelect.vue_vue_type_script_setup_true_lang-BnHDHWXN.js → LocationSelect.vue_vue_type_script_setup_true_lang-CS8NUqdN.js} +2 -2
  11. package/dist/{MenuTab.vue_vue_type_script_setup_true_lang-D4T_HYLY.js → MenuTab.vue_vue_type_script_setup_true_lang-Cfjoz1T0.js} +5 -5
  12. package/dist/{NavigationTab.vue_vue_type_script_setup_true_lang-C_GyUaKD.js → NavigationTab.vue_vue_type_script_setup_true_lang-B1_zlEav.js} +5 -5
  13. package/dist/{OverviewView-BbsFvXn5.js → OverviewView-CVaPccdT.js} +5 -5
  14. package/dist/{Report-CSvPRLxX.js → Report-rXclWVVt.js} +3 -3
  15. package/dist/{ReportCanvasView-7_7iDDMo.js → ReportCanvasView-C0dNeRU3.js} +2381 -1835
  16. package/dist/{ReportEditor-6VS6VVVo.js → ReportEditor-DXeVzgZe.js} +7 -7
  17. package/dist/{ReportView-D-FE2uvk.js → ReportView-BeJJj3gB.js} +6 -6
  18. package/dist/{ReportViewRoute-P3kY1pgh.js → ReportViewRoute-C-9WBFR_.js} +2 -2
  19. package/dist/{Setting-BTGjs8ef.js → Setting-C3vOe-Kl.js} +3 -3
  20. package/dist/{Template-BFsmogCz.js → Template-CDu1xXgE.js} +3 -3
  21. package/dist/{TileEditor-B1mD41so.js → TileEditor-BGUEYc-A.js} +6 -6
  22. package/dist/{TilePageStack.vue_vue_type_script_setup_true_lang-BxMJxsRs.js → TilePageStack.vue_vue_type_script_setup_true_lang-CanQQED6.js} +2 -2
  23. package/dist/{TransitionFade-DyVbdV16.js → TransitionFade-9mEtczb7.js} +5 -5
  24. package/dist/{app-DL6B8kX0.js → app-BIYwuRB4.js} +295 -27
  25. package/dist/app.js +1 -1
  26. package/dist/assets/formatChartData.worker-DdA-N536.js +507 -0
  27. package/dist/assets/processTableData.worker-B69y8rv8.js +507 -0
  28. package/dist/{currency-IE26CkEv.js → currency-BFVpOgJk.js} +1 -1
  29. package/dist/{index-C4HJJRwa.js → index-Cnj0Kacp.js} +5221 -5171
  30. package/dist/{report-DUmqY1C-.js → report-DjGCG50y.js} +1 -1
  31. package/dist/report-canvas-libs/components-1.js +181 -47
  32. package/dist/report-canvas-libs/fm-ui-1.js +43 -22
  33. package/dist/style.css +1 -1
  34. package/dist/{useRestaurantPermission-D4W9mFY1.js → useRestaurantPermission-BV526HlW.js} +1 -1
  35. package/package.json +1 -1
  36. package/dist/assets/formatChartData.worker-t4_wCRf0.js +0 -507
  37. package/dist/assets/processTableData.worker-JSjN8c44.js +0 -507
@@ -1,4 +1,4 @@
1
- import { u as p, F as m, r as v, p as be, a as ye, b as we, n as Se, h as Ie } from "./app-DL6B8kX0.js";
1
+ import { u as p, F as m, r as v, p as be, a as ye, b as we, n as Se, h as Ie } from "./app-BIYwuRB4.js";
2
2
  import { storeToRefs as l, defineStore as j } from "pinia";
3
3
  import { ref as i, computed as $, watch as Ae } from "vue";
4
4
  import { useSnackbar as W } from "@feedmepos/ui-library";
@@ -76,8 +76,36 @@
76
76
  return isFinite(parsed) ? parsed : 0
77
77
  }
78
78
 
79
+ /**
80
+ * A string the viewer reads: the shell's translation for this id, else the English the code
81
+ * carries. `env.strings` arrives with the rest of env, so a frame without it still renders.
82
+ */
83
+ function text(id, english) {
84
+ var strings = window.env && window.env.strings
85
+ var value = strings && strings[id]
86
+ return typeof value === "string" && value ? value : english
87
+ }
88
+
89
+ function envOf(key, fallback) {
90
+ var value = window.env && window.env[key]
91
+ return value === undefined || value === null || value === "" ? fallback : value
92
+ }
93
+
94
+ function locale() {
95
+ return envOf("locale", "en-MY")
96
+ }
97
+
98
+ /**
99
+ * The zone a value is read in: the report's own, except for a value the query already bucketed
100
+ * to a plain day — that one is local already, and re-projecting it shifts it a day west.
101
+ */
102
+ function zoneFor(value) {
103
+ if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}$/.test(value)) return "UTC"
104
+ return envOf("timezone", undefined)
105
+ }
106
+
79
107
  function intl(digits) {
80
- return new Intl.NumberFormat((window.env && window.env.locale) || "en-MY", {
108
+ return new Intl.NumberFormat(locale(), {
81
109
  minimumFractionDigits: digits,
82
110
  maximumFractionDigits: digits
83
111
  })
@@ -97,24 +125,40 @@
97
125
  case "ratio":
98
126
  return intl(1).format(num(value) * 100) + "%"
99
127
  case "datetime":
100
- return new Date(value).toLocaleString((window.env && window.env.locale) || "en-MY", {
128
+ return new Date(value).toLocaleString(locale(), {
101
129
  dateStyle: "medium",
102
- timeStyle: "short"
130
+ timeStyle: "short",
131
+ timeZone: zoneFor(value)
103
132
  })
104
133
  default:
105
134
  return String(value)
106
135
  }
107
136
  }
108
137
 
109
- /** Axis ticks: RM 0, RM 2k, RM 10k — abbreviated, per the chart guide. */
138
+ /** Axis ticks: RM 0, RM 2K, RM 10K — the locale's own compact form, per the chart guide. */
110
139
  function abbrev(format) {
111
140
  return function (value) {
112
141
  var v = num(value)
113
- var currency = format === "money" ? ((window.env && window.env.currency) || "") + " " : ""
114
- if (Math.abs(v) >= 1000000) return currency + (v / 1000000).toFixed(1).replace(/\.0$/, "") + "m"
115
- if (Math.abs(v) >= 1000) return currency + (v / 1000).toFixed(1).replace(/\.0$/, "") + "k"
142
+ var currency = format === "money" ? envOf("currency", "") : ""
116
143
  // a tiny domain otherwise rounds every tick to the same label
117
- return currency + intl(Math.abs(v) > 0 && Math.abs(v) < 10 ? 2 : 0).format(v)
144
+ var small = Math.abs(v) > 0 && Math.abs(v) < 10
145
+ var spec = small
146
+ ? { minimumFractionDigits: 2, maximumFractionDigits: 2 }
147
+ : { notation: "compact", maximumFractionDigits: 1, minimumFractionDigits: 0 }
148
+ if (currency) {
149
+ spec.style = "currency"
150
+ spec.currency = currency
151
+ spec.currencyDisplay = "code"
152
+ }
153
+ try {
154
+ return new Intl.NumberFormat(locale(), spec).format(v)
155
+ } catch (err) {
156
+ // an unknown currency code is not a reason to draw no axis
157
+ delete spec.style
158
+ delete spec.currency
159
+ delete spec.currencyDisplay
160
+ return (currency ? currency + " " : "") + new Intl.NumberFormat(locale(), spec).format(v)
161
+ }
118
162
  }
119
163
  }
120
164
 
@@ -143,7 +187,7 @@
143
187
  }
144
188
 
145
189
  function emptyNote(config) {
146
- return el("p", "fmr-note", config.empty || "No data in this period.")
190
+ return el("p", "fmr-note", config.empty || text("empty", "No data in this period."))
147
191
  }
148
192
 
149
193
  /** '$row.col' / '$x' references resolve against the interaction; literals pass through. */
@@ -284,11 +328,13 @@
284
328
  options: items,
285
329
  multiple: multiple,
286
330
  value: current,
287
- placeholder: multiple && emptyMeansAll(name) ? "All" : null,
331
+ placeholder: multiple && emptyMeansAll(name) ? text("all", "All") : null,
288
332
  icon: outlets ? "store" : null,
289
333
  all: outlets
290
334
  ? {
291
- label: control.label ? "All " + control.label.toLowerCase() : "All",
335
+ label: control.label
336
+ ? text("allOf", "All {label}").replace("{label}", control.label.toLowerCase())
337
+ : text("all", "All"),
292
338
  active: FM.paramIntent(name) === "all",
293
339
  onSelect: function () {
294
340
  var patch = {}
@@ -516,9 +562,10 @@
516
562
  if (config.xType === "day") {
517
563
  var day = new Date(raw)
518
564
  if (!isNaN(day)) {
519
- return day.toLocaleDateString((window.env && window.env.locale) || "en-MY", {
565
+ return day.toLocaleDateString(locale(), {
520
566
  month: "short",
521
- day: "numeric"
567
+ day: "numeric",
568
+ timeZone: zoneFor(raw)
522
569
  })
523
570
  }
524
571
  }
@@ -683,6 +730,25 @@
683
730
  return denominator && typeof denominator === "object" ? denominator : null
684
731
  }
685
732
 
733
+ function compareCells(left, right) {
734
+ var ln = Number(left)
735
+ var rn = Number(right)
736
+ return isFinite(ln) && isFinite(rn) ? ln - rn : String(left ?? "").localeCompare(String(right ?? ""))
737
+ }
738
+
739
+ /** "desc" or "asc" when the rows already run that way in the column, with at least one step; null otherwise. */
740
+ function rowsFollow(rows, key) {
741
+ var dir = null
742
+ for (var i = 1; i < rows.length; i++) {
743
+ var compared = compareCells(rows[i - 1][key], rows[i][key])
744
+ if (compared === 0) continue
745
+ var step = compared > 0 ? "desc" : "asc"
746
+ if (dir && dir !== step) return null
747
+ dir = step
748
+ }
749
+ return dir
750
+ }
751
+
686
752
  function renderTable(root, config, base) {
687
753
  base = base || ""
688
754
  var card = tile(root, config.title, base)
@@ -692,8 +758,9 @@
692
758
  var mount = part(el("div"), base + "table")
693
759
  card.appendChild(mount)
694
760
 
695
- var sortKey = config.sort ? config.sort.key : null
696
- var sortDir = config.sort ? config.sort.dir : "desc"
761
+ // the query decides the order; a stored `sort` from an older canvas never re-orders on mount
762
+ var sortKey = null
763
+ var sortDir = "desc"
697
764
  var shareTotals = {}
698
765
 
699
766
  var columns = []
@@ -712,7 +779,7 @@
712
779
  columns.push({
713
780
  part: base + "columns." + index + ".share",
714
781
  key: column.key,
715
- label: "Share",
782
+ label: text("share", "Share"),
716
783
  align: "right",
717
784
  dim: true,
718
785
  format: function (value, row) {
@@ -757,12 +824,7 @@
757
824
  })
758
825
  if (!sortKey) return rows
759
826
  rows.sort(function (a, b) {
760
- var left = a[sortKey]
761
- var right = b[sortKey]
762
- var ln = Number(left)
763
- var rn = Number(right)
764
- var compared =
765
- isFinite(ln) && isFinite(rn) ? ln - rn : String(left ?? "").localeCompare(String(right ?? ""))
827
+ var compared = compareCells(a[sortKey], b[sortKey])
766
828
  return sortDir === "asc" ? compared : -compared
767
829
  })
768
830
  return rows
@@ -770,6 +832,10 @@
770
832
 
771
833
  // header click cycles the sort; thead persists across setRows, so bind once
772
834
  var headers = control.element.querySelectorAll("th")
835
+ function markSorted(th, dir) {
836
+ Array.prototype.forEach.call(headers, function (other) { other.removeAttribute("aria-sort") })
837
+ if (th) th.setAttribute("aria-sort", dir === "asc" ? "ascending" : "descending")
838
+ }
773
839
  Array.prototype.forEach.call(headers, function (th, index) {
774
840
  var column = columns[index]
775
841
  if (!column) return
@@ -777,20 +843,37 @@
777
843
  th.addEventListener("click", function () {
778
844
  if (sortKey === column.key) sortDir = sortDir === "desc" ? "asc" : "desc"
779
845
  else {
846
+ // a first click on the column the rows already run down reverses it, or nothing would move
847
+ sortDir = rowsFollow(ordered(), column.key) === "desc" ? "asc" : "desc"
780
848
  sortKey = column.key
781
- sortDir = "desc"
782
849
  }
783
- Array.prototype.forEach.call(headers, function (other) { other.removeAttribute("aria-sort") })
784
- th.setAttribute("aria-sort", sortDir === "asc" ? "ascending" : "descending")
850
+ markSorted(th, sortDir)
785
851
  control.setRows(ordered())
786
852
  })
787
853
  })
854
+ // before any click, the arrow shows the one column the query's order follows
855
+ function markFollowed(rows) {
856
+ if (sortKey) return
857
+ var followed = []
858
+ columns.forEach(function (column, index) {
859
+ if (column.format === "image" || /\.share$/.test(column.part)) return
860
+ var dir = rowsFollow(rows, column.key)
861
+ if (dir) followed.push({ th: headers[index], dir: dir })
862
+ })
863
+ markSorted(followed.length === 1 ? followed[0].th : null, followed.length === 1 ? followed[0].dir : null)
864
+ }
788
865
 
789
866
  var subscribed = {}
790
867
  function subscribe(queryId) {
791
868
  if (!queryId || subscribed[queryId]) return
792
869
  subscribed[queryId] = true
793
- FM.onRows(queryId, function () { control.setRows(ordered()) })
870
+ FM.onRows(queryId, function () {
871
+ var rows = ordered()
872
+ if (queryId === config.query) markFollowed(rows)
873
+ control.setRows(rows)
874
+ // the query bounded the ranking; the pager says how long the set behind it is
875
+ if (queryId === config.query && control.setTotal) control.setTotal(FM.total(queryId))
876
+ })
794
877
  }
795
878
  subscribe(config.query)
796
879
  ;(config.columns || []).forEach(function (column) {
@@ -867,8 +950,10 @@
867
950
  sync()
868
951
  }
869
952
 
870
- // --- heatmap: day-of-week × hour grid on one hue; grey where no row; its own legend
871
- var HEATMAP_DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
953
+ // --- heatmap: a grid on one hue; grey where no row; its own legend. The axes are the data's:
954
+ // weekday names come from Intl only when the y column really is 0-6, and 24 columns only when x
955
+ // really is an hour.
956
+ var WEEKDAY_ANCHOR = Date.UTC(2026, 2, 1) // a Sunday
872
957
  var HEAT_BANDS = [0.14, 0.32, 0.54, 0.78, 1]
873
958
  var NO_DATA = "var(--fm-border-default, #f0f0f0)"
874
959
  function rgba(hex, alpha) {
@@ -910,23 +995,58 @@
910
995
  row.style.marginTop = "10px"
911
996
  row.style.fontSize = "12px"
912
997
  row.style.color = "var(--fm-text-muted, #6b6c70)"
913
- row.appendChild(el("span", null, "Quieter"))
998
+ row.appendChild(el("span", null, text("heatmap.quieter", "Quieter")))
914
999
  HEAT_BANDS.forEach(function (alpha) { row.appendChild(heatSwatch(rgba(token("--fm-action-primary-bg", "#ff7823"), alpha))) })
915
- row.appendChild(el("span", null, "Busier"))
1000
+ row.appendChild(el("span", null, text("heatmap.busier", "Busier")))
916
1001
  var gap = el("span")
917
1002
  gap.style.width = "12px"
918
1003
  row.appendChild(gap)
919
1004
  row.appendChild(heatSwatch(NO_DATA))
920
- row.appendChild(el("span", null, "No data"))
1005
+ row.appendChild(el("span", null, text("heatmap.noData", "No data")))
921
1006
  return row
922
1007
  }
1008
+ /** Short weekday names in the report's locale, Sunday first. */
1009
+ function weekdayNames() {
1010
+ var names = []
1011
+ for (var i = 0; i < 7; i++) {
1012
+ names.push(
1013
+ new Date(WEEKDAY_ANCHOR + i * 86400000).toLocaleDateString(locale(), {
1014
+ weekday: "short",
1015
+ timeZone: "UTC"
1016
+ })
1017
+ )
1018
+ }
1019
+ return names
1020
+ }
1021
+
1022
+ /** The distinct values of one column, numbers before strings, each in its own order. */
1023
+ function axisValues(rows, column) {
1024
+ var seen = {}
1025
+ var values = []
1026
+ rows.forEach(function (row) {
1027
+ var key = String(row[column])
1028
+ if (seen[key]) return
1029
+ seen[key] = true
1030
+ values.push(row[column])
1031
+ })
1032
+ var numeric = values.every(function (value) { return value !== null && value !== "" && isFinite(Number(value)) })
1033
+ if (numeric) return values.map(Number).sort(function (a, b) { return a - b })
1034
+ return values.map(String).sort()
1035
+ }
1036
+
1037
+ var whole = function (values, max) {
1038
+ return values.every(function (value) {
1039
+ var n = Number(value)
1040
+ return isFinite(n) && n >= 0 && n <= max && Math.floor(n) === n
1041
+ })
1042
+ }
1043
+
923
1044
  function renderHeatmap(root, config, base) {
924
1045
  base = base || ""
925
1046
  var card = tile(root, config.title, base)
926
1047
  renderControls(card, config.controls, base)
927
1048
  var body = part(el("div", "fmr-tile-body"), base + "chart")
928
1049
  card.appendChild(body)
929
- var days = config.weekStart === "sunday" ? [0, 1, 2, 3, 4, 5, 6] : [1, 2, 3, 4, 5, 6, 0]
930
1050
  var format = config.format || "amount"
931
1051
  function refresh() {
932
1052
  body.innerHTML = ""
@@ -935,42 +1055,56 @@
935
1055
  body.appendChild(emptyNote(config))
936
1056
  return
937
1057
  }
1058
+ var ys = axisValues(rows, config.y)
1059
+ var xs = axisValues(rows, config.x)
1060
+ var weekdays = whole(ys, 6)
1061
+ var hours = whole(xs, 23)
1062
+ // a weekday row reads in the week's order whatever days the data holds; an hour column
1063
+ // shows the whole day, so a quiet hour reads as quiet rather than missing
1064
+ if (weekdays) ys = (config.weekStart === "sunday" ? [0, 1, 2, 3, 4, 5, 6] : [1, 2, 3, 4, 5, 6, 0])
1065
+ if (hours) xs = Array.apply(null, { length: 24 }).map(function (_, h) { return h })
1066
+ var names = weekdays ? weekdayNames() : null
1067
+ var yLabel = function (y) { return names ? names[y] : String(y) }
1068
+ var xLabel = function (x) { return hours ? String(x) + ":00" : String(x) }
938
1069
  var cells = {}
939
1070
  var totals = {}
940
1071
  var max = 0
941
1072
  rows.forEach(function (row) {
942
- var d = ((num(row[config.y]) % 7) + 7) % 7
943
- var key = d + ":" + num(row[config.x])
1073
+ var y = weekdays ? ((num(row[config.y]) % 7) + 7) % 7 : String(row[config.y])
1074
+ var x = hours ? num(row[config.x]) : String(row[config.x])
1075
+ var key = y + "\u0000" + x
944
1076
  cells[key] = (cells[key] || 0) + num(row[config.value])
945
- totals[d] = (totals[d] || 0) + num(row[config.value])
1077
+ totals[y] = (totals[y] || 0) + num(row[config.value])
946
1078
  if (cells[key] > max) max = cells[key]
947
1079
  })
948
1080
  var grid = el("div", "fmr-heatmap")
949
1081
  grid.style.display = "grid"
950
- grid.style.gridTemplateColumns = "44px repeat(24, minmax(0, 1fr))" + (config.rowTotals ? " 88px" : "")
1082
+ grid.style.gridTemplateColumns =
1083
+ "44px repeat(" + xs.length + ", minmax(0, 1fr))" + (config.rowTotals ? " 88px" : "")
951
1084
  grid.style.gap = "2px"
952
1085
  grid.style.alignItems = "center"
953
1086
  grid.appendChild(el("div"))
954
- for (var h = 0; h < 24; h++) grid.appendChild(heatLabel(String(h), "center"))
955
- if (config.rowTotals) grid.appendChild(heatLabel("Total", "right"))
956
- days.forEach(function (d) {
957
- grid.appendChild(heatLabel(HEATMAP_DAYS[d], "left"))
958
- for (var hh = 0; hh < 24; hh++) {
959
- var value = cells[d + ":" + hh]
1087
+ xs.forEach(function (x) { grid.appendChild(heatLabel(hours ? String(x) : xLabel(x), "center")) })
1088
+ if (config.rowTotals) grid.appendChild(heatLabel(text("heatmap.total", "Total"), "right"))
1089
+ ys.forEach(function (y) {
1090
+ grid.appendChild(heatLabel(yLabel(y), "left"))
1091
+ xs.forEach(function (x) {
1092
+ var value = cells[y + "\u0000" + x]
960
1093
  var cell = el("div", "fmr-heatmap-cell")
961
1094
  cell.style.minHeight = "26px"
962
1095
  cell.style.borderRadius = "var(--fm-radius-xs, 4px)"
1096
+ var where = yLabel(y) + " " + xLabel(x) + " — "
963
1097
  if (value === undefined) {
964
1098
  cell.className += " fmr-heatmap-cell-empty"
965
1099
  cell.style.background = NO_DATA
966
- cell.title = HEATMAP_DAYS[d] + " " + hh + ":00 — no data"
1100
+ cell.title = where + text("heatmap.noData", "No data")
967
1101
  } else {
968
1102
  cell.style.background = heatShade(max ? value / max : 0)
969
- cell.title = HEATMAP_DAYS[d] + " " + hh + ":00 — " + formatValue(format, value)
1103
+ cell.title = where + formatValue(format, value)
970
1104
  }
971
1105
  grid.appendChild(cell)
972
- }
973
- if (config.rowTotals) grid.appendChild(heatLabel(formatValue(format, totals[d] || 0), "right"))
1106
+ })
1107
+ if (config.rowTotals) grid.appendChild(heatLabel(formatValue(format, totals[y] || 0), "right"))
974
1108
  })
975
1109
  body.appendChild(grid)
976
1110
  body.appendChild(heatLegend())
@@ -986,7 +1120,7 @@
986
1120
  function renderPageHeader(root, config, base) {
987
1121
  base = base || ""
988
1122
  var head = el("div", "fmr-page-head")
989
- var back = part(el("button", "fmr-back", config.backLabel || "Back"), base + "back")
1123
+ var back = part(el("button", "fmr-back", config.backLabel || text("back", "Back")), base + "back")
990
1124
  back.type = "button"
991
1125
  back.addEventListener("click", function () { FM.setParams(config.back) })
992
1126
  var title = part(el("h2", "fmr-tile-title", config.title || ""), base + "title")
@@ -11,6 +11,16 @@
11
11
  var FM = (window.FM = window.FM || {})
12
12
  if (FM.ui) return
13
13
 
14
+ /**
15
+ * A string the viewer reads: the shell's translation for this id, else the English the code
16
+ * carries. `env.strings` arrives with the rest of env, so a frame without it still renders.
17
+ */
18
+ function text(id, english) {
19
+ var strings = window.env && window.env.strings
20
+ var value = strings && strings[id]
21
+ return typeof value === "string" && value ? value : english
22
+ }
23
+
14
24
  var STYLE_ID = "fm-ui-style"
15
25
  // Rebus v2 owns the look: each control renders the anatomy documented in
16
26
  // canvas-report-builder/guide/11-rebus-ui. The .fm-* rules below are behavior and test hooks,
@@ -372,14 +382,14 @@
372
382
  searchBar.appendChild(leading)
373
383
  var search = el("input", "fm-search fm-search-bar__control fm-text-body-md-400")
374
384
  search.type = "search"
375
- search.placeholder = "Search"
385
+ search.placeholder = text("search", "Search")
376
386
  search.setAttribute("aria-label", "Search options")
377
387
  searchBar.appendChild(search)
378
388
  var list = el("div", "fm-pop-list")
379
389
  var allRow = null
380
390
  if (all) {
381
391
  allRow = el("div", "fm-opt fm-opt-all")
382
- allRow.appendChild(el("span", null, all.label || "All"))
392
+ allRow.appendChild(el("span", null, all.label || text("all", "All")))
383
393
  var mark = el("span", "fm-opt-mark")
384
394
  mark.appendChild(icon("check", 2.2))
385
395
  allRow.appendChild(mark)
@@ -395,8 +405,8 @@
395
405
  panel.appendChild(list)
396
406
  if (multiple) {
397
407
  var foot = el("div", "fm-pop-foot")
398
- var cancel = actionButton("Cancel", "ghost", "fm-dd-cancel")
399
- var apply = actionButton("Apply", "primary", "fm-dd-apply")
408
+ var cancel = actionButton(text("cancel", "Cancel"), "ghost", "fm-dd-cancel")
409
+ var apply = actionButton(text("apply", "Apply"), "primary", "fm-dd-apply")
400
410
  cancel.addEventListener("click", function () { control.close() })
401
411
  apply.addEventListener("click", function () {
402
412
  committed = draft.slice()
@@ -417,12 +427,12 @@
417
427
  }
418
428
 
419
429
  function summary() {
420
- if (all && all.active) return all.label || "All"
430
+ if (all && all.active) return all.label || text("all", "All")
421
431
  if (multiple) {
422
- if (draft.length === 0) return config.placeholder || "None"
432
+ if (draft.length === 0) return config.placeholder || text("none", "None")
423
433
  // with a named All action beside it, a full list is a full list, never a claim of All
424
434
  if (!all && draft.length === items.length && items.length > 0)
425
- return config.allLabel || "All"
435
+ return config.allLabel || text("all", "All")
426
436
  if (draft.length === 1) {
427
437
  var one = items.filter(function (item) { return item.value === draft[0] })[0]
428
438
  return one ? one.label : String(draft[0])
@@ -460,7 +470,7 @@
460
470
  toggleAll.setAttribute("aria-selected", String(allShownSelected))
461
471
  toggleAll.appendChild(checkbox(allShownSelected, picked > 0 && !allShownSelected))
462
472
  toggleAll.appendChild(
463
- el("span", null, "Select all (" + picked + "/" + shown.length + ")")
473
+ el("span", null, text("selectAll", "Select all") + " (" + picked + "/" + shown.length + ")")
464
474
  )
465
475
  toggleAll.addEventListener("click", function () {
466
476
  draft = allShownSelected
@@ -471,7 +481,7 @@
471
481
  list.appendChild(toggleAll)
472
482
  }
473
483
  if (visible.length === 0) {
474
- list.appendChild(el("div", "fm-empty", "No matches"))
484
+ list.appendChild(el("div", "fm-empty", text("noMatches", "No matches")))
475
485
  return
476
486
  }
477
487
  visible.forEach(function (item) {
@@ -718,11 +728,11 @@
718
728
  var head = el("div", "fm-cal-head")
719
729
  var prev = el("button", "fm-cal-nav fm-cal-prev")
720
730
  prev.type = "button"
721
- prev.setAttribute("aria-label", "Previous month")
731
+ prev.setAttribute("aria-label", text("previousMonth", "Previous month"))
722
732
  prev.appendChild(icon("chevronLeft"))
723
733
  var next = el("button", "fm-cal-nav fm-cal-next")
724
734
  next.type = "button"
725
- next.setAttribute("aria-label", "Next month")
735
+ next.setAttribute("aria-label", text("nextMonth", "Next month"))
726
736
  next.appendChild(icon("chevronRight"))
727
737
  var title = el("div", "fm-cal-title fm-text-body-md-500")
728
738
  var grid = el("div", "fm-cal-grid")
@@ -735,8 +745,8 @@
735
745
  body.appendChild(calendar)
736
746
  panel.appendChild(body)
737
747
  var foot = el("div", "fm-pop-foot")
738
- var cancel = actionButton("Cancel", "ghost", "fm-dr-cancel")
739
- var apply = actionButton("Apply", "primary", "fm-dr-apply")
748
+ var cancel = actionButton(text("cancel", "Cancel"), "ghost", "fm-dr-cancel")
749
+ var apply = actionButton(text("apply", "Apply"), "primary", "fm-dr-apply")
740
750
  foot.appendChild(cancel)
741
751
  foot.appendChild(apply)
742
752
  panel.appendChild(foot)
@@ -764,7 +774,7 @@
764
774
  function renderPresets() {
765
775
  presetList.innerHTML = ""
766
776
  presets.forEach(function (preset) {
767
- var option = el("div", "fm-opt", preset.label)
777
+ var option = el("div", "fm-opt", text("preset." + preset.key, preset.label))
768
778
  option.setAttribute("aria-selected", String(preset.key === dPreset))
769
779
  option.addEventListener("click", function () {
770
780
  var range = preset.range(ymdIn(new Date(), timezone))
@@ -1007,7 +1017,7 @@
1007
1017
  config.reserveRows === undefined
1008
1018
  ? Math.min(pageSize || RESERVE_ROWS, RESERVE_ROWS)
1009
1019
  : Math.max(0, Number(config.reserveRows) || 0)
1010
- var emptyText = config.empty === undefined ? "No rows." : config.empty
1020
+ var emptyText = config.empty === undefined ? text("noRows", "No rows.") : config.empty
1011
1021
  var lastHeight = 0
1012
1022
  var onRowClick = typeof config.onRowClick === "function" ? config.onRowClick : null
1013
1023
  var keyOf =
@@ -1017,6 +1027,7 @@
1017
1027
  ? function (row) { return row[config.rowKey] }
1018
1028
  : null
1019
1029
  var page = 0
1030
+ var setSize = typeof config.total === "number" ? config.total : undefined
1020
1031
  var selectedIndex = -1
1021
1032
  var selectedKey
1022
1033
 
@@ -1035,8 +1046,8 @@
1035
1046
  var foot = el("div", "fmr-tile-foot fmr-pager")
1036
1047
  var note = el("span", "fmr-pager-note")
1037
1048
  var buttons = el("div", "fmr-pager-btns")
1038
- var prev = el("button", "fmr-link", "Previous")
1039
- var next = el("button", "fmr-link", "Next")
1049
+ var prev = el("button", "fmr-link", text("previous", "Previous"))
1050
+ var next = el("button", "fmr-link", text("next", "Next"))
1040
1051
  prev.type = "button"
1041
1052
  next.type = "button"
1042
1053
 
@@ -1101,6 +1112,8 @@
1101
1112
 
1102
1113
  // reserved only while the table actually pages; a single short page keeps its ragged bottom
1103
1114
  var paging = pageSize > 0 && rows.length > pageSize
1115
+ // the SQL bounded the ranking, so the page is a page of a longer set: say how long
1116
+ var whole = typeof setSize === "number" && setSize > rows.length ? setSize : rows.length
1104
1117
  // …and while a table is waiting on rows it holds the height it last had, so the panel
1105
1118
  // around it does not collapse and grow again between two drills
1106
1119
  wrap.style.minHeight =
@@ -1111,10 +1124,13 @@
1111
1124
  : ""
1112
1125
  if (rows.length) lastHeight = Math.round(wrap.getBoundingClientRect().height) || lastHeight
1113
1126
 
1114
- foot.hidden = !paging
1115
- note.textContent = paging
1116
- ? from + 1 + "–" + Math.min(from + pageSize, rows.length) + " of " + rows.length
1117
- : ""
1127
+ foot.hidden = !paging && whole === rows.length
1128
+ note.textContent =
1129
+ paging || whole > rows.length
1130
+ ? text("pageRange", "{shown} of {total}")
1131
+ .replace("{shown}", from + 1 + "–" + (pageSize ? Math.min(from + pageSize, rows.length) : rows.length))
1132
+ .replace("{total}", String(whole))
1133
+ : ""
1118
1134
  prev.disabled = page === 0
1119
1135
  next.disabled = page >= total - 1
1120
1136
  }
@@ -1157,6 +1173,11 @@
1157
1173
  selectedIndex = -1
1158
1174
  render()
1159
1175
  },
1176
+ /** How long the whole set is, when the server counted it past this table's own bound. */
1177
+ setTotal: function (next) {
1178
+ setSize = typeof next === "number" ? next : undefined
1179
+ render()
1180
+ },
1160
1181
  /** The empty copy is a claim about the data; a table awaiting rows has none to make. */
1161
1182
  setEmpty: function (next) {
1162
1183
  emptyText = next == null ? "" : String(next)
@@ -1255,7 +1276,7 @@
1255
1276
  subtitle.hidden = !config.subtitle
1256
1277
  var closeBtn = el("button", "fm-dlg-close", "✕")
1257
1278
  closeBtn.type = "button"
1258
- closeBtn.setAttribute("aria-label", "Close")
1279
+ closeBtn.setAttribute("aria-label", text("close", "Close"))
1259
1280
  var body = el("div", "fm-dlg-body")
1260
1281
  titles.appendChild(title)
1261
1282
  titles.appendChild(subtitle)
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- [data-v-e0ce1b3c] .report-date-access-disabled{color:var(--fm-color-typo-disabled, #a8a8a8);opacity:.45}[data-v-e0ce1b3c] .report-date-access-disabled .fm-calendar__cell__button{cursor:not-allowed;color:var(--fm-color-typo-disabled, #a8a8a8);text-decoration:line-through}.glassmorphism{background:linear-gradient(135deg,#fffffff5,#fffffff5);box-shadow:0 8px 24px #0f172a2e}.chart-legend-text[data-v-706fa016]{color:var(--legend-text-color);font-size:var(--legend-font-size)}.chart-legend-list[data-v-706fa016]{scrollbar-width:none;-ms-overflow-style:none}.chart-legend-list[data-v-706fa016]::-webkit-scrollbar{display:none;width:0;height:0}.circular.circular{flex:1 1 auto;min-height:0;min-width:0;max-height:100%;max-width:100%;overflow:hidden;padding:0;width:calc(100% - var(--legend-panel-width, 0px));height:calc(100% - var(--legend-panel-height, 0px))}.circular.circular .flex-col.gap-8{gap:0!important}.circular.circular .fm-color-typo-primary:empty,.circular.circular .fm-color-typo-secondary:empty{display:none}.circular.circular .grow{height:100%}.sparkline.sparkline{margin:0;padding:0}.sparkline.sparkline .grow{height:50px;flex-grow:1;min-height:0}.sparkline-chart>div:not(.grow){display:none}.sparkline-chart canvas{display:block}.scrollbar-hide-table>div{scrollbar-width:thin}.bar-chart.bar-chart{flex:1 1 auto;min-height:0;min-width:0;max-width:100%;max-height:100%;overflow:hidden;padding:0;width:calc(100% - var(--legend-panel-width, 0px));height:calc(100% - var(--legend-panel-height, 0px))}.bar-chart.bar-chart .grow{height:100%}.bar-chart.bar-chart .flex-col{gap:0}.widget-content{display:flex;flex-direction:column;width:100%;height:100%;min-height:0}.chart-layout{display:flex;flex-direction:column;flex:1 1 auto;width:100%;min-height:0}.chart-layout--side{flex-direction:row;align-items:stretch;gap:0;min-height:0}.line-chart.line-chart{flex:1 1 auto;min-height:0;min-width:0;max-width:100%;max-height:100%;overflow:hidden;margin:0;padding:8px 0 0;width:calc(100% - var(--legend-panel-width, 0px));height:calc(100% - var(--legend-panel-height, 0px))}.line-chart.line-chart .grow{height:100%}.line-chart.line-chart .flex-col{gap:0}.card-container[data-v-818eab25]{overflow-y:auto;overflow-x:hidden}.fm-progress-linear-custom span[data-v-2f6d52e6]{width:auto;height:100%;position:absolute;display:inline-block;top:0;left:0}.fm-progress-linear-custom span.dash-1[data-v-2f6d52e6]{left:-35%;animation:progress-linear-dash-1-2f6d52e6 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.fm-progress-linear-custom span.dash-2[data-v-2f6d52e6]{left:100%;animation:progress-linear-dash-2-2f6d52e6 2.1s cubic-bezier(.165,.84,.44,1) 1.15s infinite}@keyframes progress-linear-dash-1-2f6d52e6{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes progress-linear-dash-2-2f6d52e6{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes shimmer-2f6d52e6{0%{transform:translate(-100%)}to{transform:translate(400%)}}.progress-bar-fill[data-v-2f6d52e6]{position:relative;overflow:hidden}.progress-bar-fill[data-v-2f6d52e6]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;width:50%;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.12) 30%,rgba(255,255,255,.28) 50%,rgba(255,255,255,.12) 70%,transparent 100%);animation:shimmer-2f6d52e6 1.5s infinite linear}.pos-v8-switch .fm-switch__input--btn{width:40px;height:24px}.pos-v8-switch .fm-switch__input--knob,.pos-v8-switch .fm-switch__input--btn:checked~.fm-switch__input--knob{left:4px;width:16px;height:16px;padding:0}.pos-v8-switch .fm-switch__input--btn:checked~.fm-switch__input--knob{left:18px}.row:hover .show-actions{visibility:visible}.icon-btn{border-radius:100%}.overlay{background:#0006;position:absolute;top:0;left:0;height:100vh;width:100vw}.side-panel{position:fixed;right:0;top:0;height:100%;background:#fff}.fade-enter-active,.fade-leave-active{transition:opacity .2s ease}.fade-enter-from,.fade-leave-to{opacity:0}.slide-enter-active,.slide-leave-active{transition:all .3s ease-out}.slide-enter-from,.slide-leave-to{transform:translate(100%)}.selected-widget[data-v-0535b07b]{background-color:#fff4e6;border-color:#ff7823}.slide-fade-enter-active[data-v-fa67a3a4],.slide-fade-leave-active[data-v-fa67a3a4]{transition:all .3s ease-in-out}.slide-fade-enter-from[data-v-fa67a3a4],.slide-fade-leave-to[data-v-fa67a3a4]{transform:translateY(-50px);opacity:0}.slide-fade-right-enter-active[data-v-a98ca9bc],.slide-fade-right-leave-active[data-v-a98ca9bc]{transition:all .3s ease-in-out}.slide-fade-right-enter-from[data-v-a98ca9bc],.slide-fade-right-leave-to[data-v-a98ca9bc]{position:absolute;transform:translate(-50px);opacity:.4}.slide-fade-left-enter-active[data-v-a98ca9bc]{transition-delay:.3s;transition:all .3s ease-in-out}.slide-fade-left-leave-active[data-v-a98ca9bc]{transition:all .3s ease-in-out}.slide-fade-left-enter-from[data-v-a98ca9bc],.slide-fade-left-leave-to[data-v-a98ca9bc]{position:absolute;transform:translate(-50px);opacity:.1}.legend-color-input[data-v-0e072961]{-moz-appearance:none;appearance:none;-webkit-appearance:none;width:40px;height:24px;border:0;background:transparent;padding:0}.legend-color-input[data-v-0e072961]::-webkit-color-swatch-wrapper{padding:0}.legend-color-input[data-v-0e072961]::-webkit-color-swatch{border:1px solid rgb(var(--fm-color-neutral-gray-200));border-radius:4px}.legend-color-input[data-v-0e072961]::-moz-color-swatch{border:1px solid rgb(var(--fm-color-neutral-gray-200));border-radius:4px}.line-style-icon[data-v-f1c35513]{width:28px;border-top:2px solid currentColor;color:rgb(var(--fm-color-neutral-gray-300));flex-shrink:0}.line-style-icon--solid[data-v-f1c35513]{border-top-style:solid}.line-style-icon--dashed[data-v-f1c35513]{border-top-style:dashed}.line-style-icon--dotted[data-v-f1c35513]{border-top-style:dotted}.fm-top-sheet{height:100%}.integration-card[data-v-60c3aea9]{height:140px;width:140px;padding:0}.integration-card .logo-card[data-v-60c3aea9]{width:100%;padding:24px;background:#fff}.integration-card .title-card[data-v-60c3aea9]{height:36px;color:#fff}@keyframes project-mapping-highlight-5aaec20d{0%{box-shadow:0 0 0 0 transparent;border-color:transparent}20%{box-shadow:0 0 0 2px var(--fm-color-primary);border-color:var(--fm-color-primary)}35%{box-shadow:0 0 0 0 transparent;border-color:transparent}50%{box-shadow:0 0 0 2px var(--fm-color-primary);border-color:var(--fm-color-primary)}65%{box-shadow:0 0 0 0 transparent;border-color:transparent}70%{box-shadow:0 0 0 2px var(--fm-color-primary);border-color:var(--fm-color-primary)}to{box-shadow:0 0 0 0 transparent;border-color:transparent}}.animate-project-mapping-highlight[data-v-5aaec20d]{animation:project-mapping-highlight-5aaec20d 1.4s ease-out;border:1px solid transparent}.ap-project-shared-field[data-v-5aaec20d] .inline-flex>div:last-child{text-decoration:underline}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.chat-icon-button[data-v-0840b672],.chat-row[data-v-0840b672]{transition:background-color .12s ease}.chat-icon-button[data-v-0840b672]:hover:not(:disabled),.chat-row[data-v-0840b672]:hover:not(:disabled){background-color:var(--fm-color-neutral-gray-100)}.chat-icon-button[data-v-0840b672]:focus-visible,.chat-row[data-v-0840b672]:focus-visible{outline:2px solid var(--fm-color-primary);outline-offset:-2px}.chat-icon-button[data-v-0840b672]:disabled,.chat-row[data-v-0840b672]:disabled{cursor:not-allowed;opacity:.5}@media (prefers-reduced-motion: reduce){.chat-icon-button[data-v-0840b672],.chat-row[data-v-0840b672]{transition:none}}.history-dot[data-v-7df5ac71]{left:-21px}.history-button[data-v-7df5ac71]{transition:background-color .12s ease}.history-button[data-v-7df5ac71]:hover:not(:disabled){background-color:var(--fm-color-neutral-gray-100)}.history-button[data-v-7df5ac71]:focus-visible,.history-details[data-v-7df5ac71]:focus-visible{outline:2px solid var(--fm-color-primary);outline-offset:2px}.history-button[data-v-7df5ac71]:disabled{cursor:not-allowed;opacity:.5}@media (prefers-reduced-motion: reduce){.history-button[data-v-7df5ac71]{transition:none}}.remove-line-clamping[data-v-14b7e3fc] .line-clamp-1,.remove-line-clamping[data-v-14b7e3fc] .line-clamp-2{display:block!important;-webkit-line-clamp:unset!important;line-clamp:unset!important;-webkit-box-orient:unset!important;overflow:visible!important;white-space:normal!important}.remove-line-clamping[data-v-14b7e3fc] .flex.flex-col.flex-grow{min-width:0}.canvas-scrim[data-v-14b7e3fc]{background:var(--fm-color-neutral-gray-500);opacity:.4}@media (pointer: coarse){.canvas-comment-target[data-v-14b7e3fc]{width:40px;height:40px}}.remove-line-clamping[data-v-9c5593f0] .line-clamp-1,.remove-line-clamping[data-v-9c5593f0] .line-clamp-2{display:block!important;-webkit-line-clamp:unset!important;line-clamp:unset!important;-webkit-box-orient:unset!important;overflow:visible!important;white-space:normal!important}.remove-line-clamping[data-v-9c5593f0] .flex.flex-col.flex-grow{min-width:0}.remove-line-clamping[data-v-9c5593f0] .cursor-pointer.flex.items-center.justify-center.relative{min-width:0;max-width:100%;overflow:hidden}
1
+ [data-v-e0ce1b3c] .report-date-access-disabled{color:var(--fm-color-typo-disabled, #a8a8a8);opacity:.45}[data-v-e0ce1b3c] .report-date-access-disabled .fm-calendar__cell__button{cursor:not-allowed;color:var(--fm-color-typo-disabled, #a8a8a8);text-decoration:line-through}.glassmorphism{background:linear-gradient(135deg,#fffffff5,#fffffff5);box-shadow:0 8px 24px #0f172a2e}.chart-legend-text[data-v-706fa016]{color:var(--legend-text-color);font-size:var(--legend-font-size)}.chart-legend-list[data-v-706fa016]{scrollbar-width:none;-ms-overflow-style:none}.chart-legend-list[data-v-706fa016]::-webkit-scrollbar{display:none;width:0;height:0}.circular.circular{flex:1 1 auto;min-height:0;min-width:0;max-height:100%;max-width:100%;overflow:hidden;padding:0;width:calc(100% - var(--legend-panel-width, 0px));height:calc(100% - var(--legend-panel-height, 0px))}.circular.circular .flex-col.gap-8{gap:0!important}.circular.circular .fm-color-typo-primary:empty,.circular.circular .fm-color-typo-secondary:empty{display:none}.circular.circular .grow{height:100%}.sparkline.sparkline{margin:0;padding:0}.sparkline.sparkline .grow{height:50px;flex-grow:1;min-height:0}.sparkline-chart>div:not(.grow){display:none}.sparkline-chart canvas{display:block}.scrollbar-hide-table>div{scrollbar-width:thin}.bar-chart.bar-chart{flex:1 1 auto;min-height:0;min-width:0;max-width:100%;max-height:100%;overflow:hidden;padding:0;width:calc(100% - var(--legend-panel-width, 0px));height:calc(100% - var(--legend-panel-height, 0px))}.bar-chart.bar-chart .grow{height:100%}.bar-chart.bar-chart .flex-col{gap:0}.widget-content{display:flex;flex-direction:column;width:100%;height:100%;min-height:0}.chart-layout{display:flex;flex-direction:column;flex:1 1 auto;width:100%;min-height:0}.chart-layout--side{flex-direction:row;align-items:stretch;gap:0;min-height:0}.line-chart.line-chart{flex:1 1 auto;min-height:0;min-width:0;max-width:100%;max-height:100%;overflow:hidden;margin:0;padding:8px 0 0;width:calc(100% - var(--legend-panel-width, 0px));height:calc(100% - var(--legend-panel-height, 0px))}.line-chart.line-chart .grow{height:100%}.line-chart.line-chart .flex-col{gap:0}.card-container[data-v-818eab25]{overflow-y:auto;overflow-x:hidden}.fm-progress-linear-custom span[data-v-2f6d52e6]{width:auto;height:100%;position:absolute;display:inline-block;top:0;left:0}.fm-progress-linear-custom span.dash-1[data-v-2f6d52e6]{left:-35%;animation:progress-linear-dash-1-2f6d52e6 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.fm-progress-linear-custom span.dash-2[data-v-2f6d52e6]{left:100%;animation:progress-linear-dash-2-2f6d52e6 2.1s cubic-bezier(.165,.84,.44,1) 1.15s infinite}@keyframes progress-linear-dash-1-2f6d52e6{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes progress-linear-dash-2-2f6d52e6{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes shimmer-2f6d52e6{0%{transform:translate(-100%)}to{transform:translate(400%)}}.progress-bar-fill[data-v-2f6d52e6]{position:relative;overflow:hidden}.progress-bar-fill[data-v-2f6d52e6]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;width:50%;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.12) 30%,rgba(255,255,255,.28) 50%,rgba(255,255,255,.12) 70%,transparent 100%);animation:shimmer-2f6d52e6 1.5s infinite linear}.pos-v8-switch .fm-switch__input--btn{width:40px;height:24px}.pos-v8-switch .fm-switch__input--knob,.pos-v8-switch .fm-switch__input--btn:checked~.fm-switch__input--knob{left:4px;width:16px;height:16px;padding:0}.pos-v8-switch .fm-switch__input--btn:checked~.fm-switch__input--knob{left:18px}.row:hover .show-actions{visibility:visible}.icon-btn{border-radius:100%}.overlay{background:#0006;position:absolute;top:0;left:0;height:100vh;width:100vw}.side-panel{position:fixed;right:0;top:0;height:100%;background:#fff}.fade-enter-active,.fade-leave-active{transition:opacity .2s ease}.fade-enter-from,.fade-leave-to{opacity:0}.slide-enter-active,.slide-leave-active{transition:all .3s ease-out}.slide-enter-from,.slide-leave-to{transform:translate(100%)}.selected-widget[data-v-0535b07b]{background-color:#fff4e6;border-color:#ff7823}.slide-fade-enter-active[data-v-fa67a3a4],.slide-fade-leave-active[data-v-fa67a3a4]{transition:all .3s ease-in-out}.slide-fade-enter-from[data-v-fa67a3a4],.slide-fade-leave-to[data-v-fa67a3a4]{transform:translateY(-50px);opacity:0}.slide-fade-right-enter-active[data-v-a98ca9bc],.slide-fade-right-leave-active[data-v-a98ca9bc]{transition:all .3s ease-in-out}.slide-fade-right-enter-from[data-v-a98ca9bc],.slide-fade-right-leave-to[data-v-a98ca9bc]{position:absolute;transform:translate(-50px);opacity:.4}.slide-fade-left-enter-active[data-v-a98ca9bc]{transition-delay:.3s;transition:all .3s ease-in-out}.slide-fade-left-leave-active[data-v-a98ca9bc]{transition:all .3s ease-in-out}.slide-fade-left-enter-from[data-v-a98ca9bc],.slide-fade-left-leave-to[data-v-a98ca9bc]{position:absolute;transform:translate(-50px);opacity:.1}.legend-color-input[data-v-0e072961]{-moz-appearance:none;appearance:none;-webkit-appearance:none;width:40px;height:24px;border:0;background:transparent;padding:0}.legend-color-input[data-v-0e072961]::-webkit-color-swatch-wrapper{padding:0}.legend-color-input[data-v-0e072961]::-webkit-color-swatch{border:1px solid rgb(var(--fm-color-neutral-gray-200));border-radius:4px}.legend-color-input[data-v-0e072961]::-moz-color-swatch{border:1px solid rgb(var(--fm-color-neutral-gray-200));border-radius:4px}.line-style-icon[data-v-f1c35513]{width:28px;border-top:2px solid currentColor;color:rgb(var(--fm-color-neutral-gray-300));flex-shrink:0}.line-style-icon--solid[data-v-f1c35513]{border-top-style:solid}.line-style-icon--dashed[data-v-f1c35513]{border-top-style:dashed}.line-style-icon--dotted[data-v-f1c35513]{border-top-style:dotted}.fm-top-sheet{height:100%}.integration-card[data-v-60c3aea9]{height:140px;width:140px;padding:0}.integration-card .logo-card[data-v-60c3aea9]{width:100%;padding:24px;background:#fff}.integration-card .title-card[data-v-60c3aea9]{height:36px;color:#fff}@keyframes project-mapping-highlight-5aaec20d{0%{box-shadow:0 0 0 0 transparent;border-color:transparent}20%{box-shadow:0 0 0 2px var(--fm-color-primary);border-color:var(--fm-color-primary)}35%{box-shadow:0 0 0 0 transparent;border-color:transparent}50%{box-shadow:0 0 0 2px var(--fm-color-primary);border-color:var(--fm-color-primary)}65%{box-shadow:0 0 0 0 transparent;border-color:transparent}70%{box-shadow:0 0 0 2px var(--fm-color-primary);border-color:var(--fm-color-primary)}to{box-shadow:0 0 0 0 transparent;border-color:transparent}}.animate-project-mapping-highlight[data-v-5aaec20d]{animation:project-mapping-highlight-5aaec20d 1.4s ease-out;border:1px solid transparent}.ap-project-shared-field[data-v-5aaec20d] .inline-flex>div:last-child{text-decoration:underline}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.activity-shimmer[data-v-d9511bdd]{background-image:linear-gradient(90deg,var(--fm-color-neutral-gray-500) 0%,var(--fm-color-neutral-gray-500) 40%,var(--fm-color-neutral-gray-300) 50%,var(--fm-color-neutral-gray-500) 60%,var(--fm-color-neutral-gray-500) 100%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:activity-shimmer-d9511bdd 2s linear infinite}@keyframes activity-shimmer-d9511bdd{0%{background-position:100% 0}to{background-position:-100% 0}}.details-toggle[data-v-d9511bdd]{transition:background-color .12s ease}.details-toggle[data-v-d9511bdd]:hover{background-color:var(--fm-color-neutral-gray-100)}.details-toggle[data-v-d9511bdd]:focus-visible{outline:2px solid var(--fm-color-primary);outline-offset:-2px}@media (prefers-reduced-motion: reduce){.activity-shimmer[data-v-d9511bdd]{animation:none;background-image:none;color:var(--fm-color-neutral-gray-500)}.details-toggle[data-v-d9511bdd]{transition:none}}.chat-icon-button[data-v-7e36736a],.chat-row[data-v-7e36736a]{transition:background-color .12s ease}.chat-icon-button[data-v-7e36736a]:hover:not(:disabled),.chat-row[data-v-7e36736a]:hover:not(:disabled){background-color:var(--fm-color-neutral-gray-100)}.chat-icon-button[data-v-7e36736a]:focus-visible,.chat-row[data-v-7e36736a]:focus-visible{outline:2px solid var(--fm-color-primary);outline-offset:-2px}.chat-icon-button[data-v-7e36736a]:disabled,.chat-row[data-v-7e36736a]:disabled{cursor:not-allowed;opacity:.5}@media (prefers-reduced-motion: reduce){.chat-icon-button[data-v-7e36736a],.chat-row[data-v-7e36736a]{transition:none}}.history-dot[data-v-7df5ac71]{left:-21px}.history-button[data-v-7df5ac71]{transition:background-color .12s ease}.history-button[data-v-7df5ac71]:hover:not(:disabled){background-color:var(--fm-color-neutral-gray-100)}.history-button[data-v-7df5ac71]:focus-visible,.history-details[data-v-7df5ac71]:focus-visible{outline:2px solid var(--fm-color-primary);outline-offset:2px}.history-button[data-v-7df5ac71]:disabled{cursor:not-allowed;opacity:.5}@media (prefers-reduced-motion: reduce){.history-button[data-v-7df5ac71]{transition:none}}.remove-line-clamping[data-v-44470a1c] .line-clamp-1,.remove-line-clamping[data-v-44470a1c] .line-clamp-2{display:block!important;-webkit-line-clamp:unset!important;line-clamp:unset!important;-webkit-box-orient:unset!important;overflow:visible!important;white-space:normal!important}.remove-line-clamping[data-v-44470a1c] .flex.flex-col.flex-grow{min-width:0}.canvas-scrim[data-v-44470a1c]{background:var(--fm-color-neutral-gray-500);opacity:.4}@media (pointer: coarse){.canvas-comment-target[data-v-44470a1c]{width:40px;height:40px}}.remove-line-clamping[data-v-9c5593f0] .line-clamp-1,.remove-line-clamping[data-v-9c5593f0] .line-clamp-2{display:block!important;-webkit-line-clamp:unset!important;line-clamp:unset!important;-webkit-box-orient:unset!important;overflow:visible!important;white-space:normal!important}.remove-line-clamping[data-v-9c5593f0] .flex.flex-col.flex-grow{min-width:0}.remove-line-clamping[data-v-9c5593f0] .cursor-pointer.flex.items-center.justify-center.relative{min-width:0;max-width:100%;overflow:hidden}
@@ -2,7 +2,7 @@ import { computed as u } from "vue";
2
2
  import { u as c } from "./_plugin-vue_export-helper-C6QDExPN.js";
3
3
  import { useSnackbar as f } from "@feedmepos/ui-library";
4
4
  import { useCoreStore as d } from "@feedmepos/mf-common";
5
- import { U as l, V as i } from "./app-DL6B8kX0.js";
5
+ import { U as l, V as i } from "./app-BIYwuRB4.js";
6
6
  function g(t) {
7
7
  return Array.isArray(t) ? t : [];
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-report",
3
- "version": "5.30.4-beta.0",
3
+ "version": "5.31.0-beta.0",
4
4
  "files": [
5
5
  "dist"
6
6
  ],