@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.
- package/dist/{App-Bp2T86pd.js → App-CnVD_aRe.js} +4 -4
- package/dist/{DateRangeSelect-COoxXj-r.js → DateRangeSelect-DpKNUuKx.js} +1 -1
- package/dist/{Default.vue_vue_type_script_setup_true_lang-DCU8ehY7.js → Default.vue_vue_type_script_setup_true_lang-I4NO9UOX.js} +1 -1
- package/dist/{DynamicWidget.vue_vue_type_script_setup_true_lang-N5cxTr5h.js → DynamicWidget.vue_vue_type_script_setup_true_lang-Dz10heLt.js} +7 -7
- package/dist/{GlobalFilterSelect.vue_vue_type_script_setup_true_lang-B4uPv0Pp.js → GlobalFilterSelect.vue_vue_type_script_setup_true_lang-BRu0JrvS.js} +80 -80
- package/dist/{InsightView-EI3MZTiZ.js → InsightView-C8WZt__5.js} +5 -5
- package/dist/{Integration--zhnuAYf.js → Integration-C5tSrNLw.js} +3 -3
- package/dist/{Integrations-Cg2zVFJc.js → Integrations-C83LbzmE.js} +2 -2
- package/dist/{Layout-Ci4Zbsz6.js → Layout-Biqg7zFF.js} +1 -1
- package/dist/{LocationSelect.vue_vue_type_script_setup_true_lang-BnHDHWXN.js → LocationSelect.vue_vue_type_script_setup_true_lang-CS8NUqdN.js} +2 -2
- 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
- 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
- package/dist/{OverviewView-BbsFvXn5.js → OverviewView-CVaPccdT.js} +5 -5
- package/dist/{Report-CSvPRLxX.js → Report-rXclWVVt.js} +3 -3
- package/dist/{ReportCanvasView-7_7iDDMo.js → ReportCanvasView-C0dNeRU3.js} +2381 -1835
- package/dist/{ReportEditor-6VS6VVVo.js → ReportEditor-DXeVzgZe.js} +7 -7
- package/dist/{ReportView-D-FE2uvk.js → ReportView-BeJJj3gB.js} +6 -6
- package/dist/{ReportViewRoute-P3kY1pgh.js → ReportViewRoute-C-9WBFR_.js} +2 -2
- package/dist/{Setting-BTGjs8ef.js → Setting-C3vOe-Kl.js} +3 -3
- package/dist/{Template-BFsmogCz.js → Template-CDu1xXgE.js} +3 -3
- package/dist/{TileEditor-B1mD41so.js → TileEditor-BGUEYc-A.js} +6 -6
- package/dist/{TilePageStack.vue_vue_type_script_setup_true_lang-BxMJxsRs.js → TilePageStack.vue_vue_type_script_setup_true_lang-CanQQED6.js} +2 -2
- package/dist/{TransitionFade-DyVbdV16.js → TransitionFade-9mEtczb7.js} +5 -5
- package/dist/{app-DL6B8kX0.js → app-BIYwuRB4.js} +295 -27
- package/dist/app.js +1 -1
- package/dist/assets/formatChartData.worker-DdA-N536.js +507 -0
- package/dist/assets/processTableData.worker-B69y8rv8.js +507 -0
- package/dist/{currency-IE26CkEv.js → currency-BFVpOgJk.js} +1 -1
- package/dist/{index-C4HJJRwa.js → index-Cnj0Kacp.js} +5221 -5171
- package/dist/{report-DUmqY1C-.js → report-DjGCG50y.js} +1 -1
- package/dist/report-canvas-libs/components-1.js +181 -47
- package/dist/report-canvas-libs/fm-ui-1.js +43 -22
- package/dist/style.css +1 -1
- package/dist/{useRestaurantPermission-D4W9mFY1.js → useRestaurantPermission-BV526HlW.js} +1 -1
- package/package.json +1 -1
- package/dist/assets/formatChartData.worker-t4_wCRf0.js +0 -507
- 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-
|
|
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((
|
|
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((
|
|
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
|
|
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" ? (
|
|
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
|
-
|
|
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
|
|
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((
|
|
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
|
-
|
|
696
|
-
var
|
|
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
|
|
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
|
-
|
|
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 () {
|
|
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:
|
|
871
|
-
|
|
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
|
|
943
|
-
var
|
|
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[
|
|
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 =
|
|
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
|
-
|
|
955
|
-
if (config.rowTotals) grid.appendChild(heatLabel("Total", "right"))
|
|
956
|
-
|
|
957
|
-
grid.appendChild(heatLabel(
|
|
958
|
-
|
|
959
|
-
var value = cells[
|
|
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 =
|
|
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 =
|
|
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[
|
|
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 =
|
|
1116
|
-
|
|
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-
|
|
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
|
}
|