@activecollab/components 2.0.418 → 2.0.419
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/cjs/components/Icons/collection/Portfolio.js +61 -0
- package/dist/cjs/components/Icons/collection/Portfolio.js.map +1 -0
- package/dist/cjs/components/Icons/collection/PortfolioPlus.js +62 -0
- package/dist/cjs/components/Icons/collection/PortfolioPlus.js.map +1 -0
- package/dist/cjs/components/Icons/collection/Target.js +65 -0
- package/dist/cjs/components/Icons/collection/Target.js.map +1 -0
- package/dist/cjs/components/Icons/collection/index.js +21 -0
- package/dist/cjs/components/Icons/collection/index.js.map +1 -1
- package/dist/cjs/presentation/shared/PortfolioOptionsMenu.js +64 -0
- package/dist/cjs/presentation/shared/PortfolioOptionsMenu.js.map +1 -0
- package/dist/cjs/presentation/shared/ProjectOptionsMenu.js +367 -0
- package/dist/cjs/presentation/shared/ProjectOptionsMenu.js.map +1 -0
- package/dist/cjs/presentation/shared/dashboardWidgets.js +726 -0
- package/dist/cjs/presentation/shared/dashboardWidgets.js.map +1 -0
- package/dist/cjs/presentation/shared/headers.js +25 -360
- package/dist/cjs/presentation/shared/headers.js.map +1 -1
- package/dist/cjs/presentation/shared/index.js +108 -0
- package/dist/cjs/presentation/shared/index.js.map +1 -1
- package/dist/esm/components/Icons/collection/Portfolio.d.ts +32 -0
- package/dist/esm/components/Icons/collection/Portfolio.d.ts.map +1 -0
- package/dist/esm/components/Icons/collection/Portfolio.js +54 -0
- package/dist/esm/components/Icons/collection/Portfolio.js.map +1 -0
- package/dist/esm/components/Icons/collection/PortfolioPlus.d.ts +32 -0
- package/dist/esm/components/Icons/collection/PortfolioPlus.d.ts.map +1 -0
- package/dist/esm/components/Icons/collection/PortfolioPlus.js +55 -0
- package/dist/esm/components/Icons/collection/PortfolioPlus.js.map +1 -0
- package/dist/esm/components/Icons/collection/Target.d.ts +32 -0
- package/dist/esm/components/Icons/collection/Target.d.ts.map +1 -0
- package/dist/esm/components/Icons/collection/Target.js +58 -0
- package/dist/esm/components/Icons/collection/Target.js.map +1 -0
- package/dist/esm/components/Icons/collection/index.d.ts +3 -0
- package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
- package/dist/esm/components/Icons/collection/index.js +3 -0
- package/dist/esm/components/Icons/collection/index.js.map +1 -1
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.d.ts +12 -0
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.d.ts.map +1 -0
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.js +46 -0
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.js.map +1 -0
- package/dist/esm/presentation/shared/ProjectOptionsMenu.d.ts +31 -0
- package/dist/esm/presentation/shared/ProjectOptionsMenu.d.ts.map +1 -0
- package/dist/esm/presentation/shared/ProjectOptionsMenu.js +311 -0
- package/dist/esm/presentation/shared/ProjectOptionsMenu.js.map +1 -0
- package/dist/esm/presentation/shared/dashboardWidgets.d.ts +203 -0
- package/dist/esm/presentation/shared/dashboardWidgets.d.ts.map +1 -0
- package/dist/esm/presentation/shared/dashboardWidgets.js +665 -0
- package/dist/esm/presentation/shared/dashboardWidgets.js.map +1 -0
- package/dist/esm/presentation/shared/headers.d.ts +0 -11
- package/dist/esm/presentation/shared/headers.d.ts.map +1 -1
- package/dist/esm/presentation/shared/headers.js +23 -315
- package/dist/esm/presentation/shared/headers.js.map +1 -1
- package/dist/esm/presentation/shared/index.d.ts +6 -0
- package/dist/esm/presentation/shared/index.d.ts.map +1 -1
- package/dist/esm/presentation/shared/index.js +3 -0
- package/dist/esm/presentation/shared/index.js.map +1 -1
- package/dist/index.js +666 -508
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,726 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.WidgetRankedList = exports.WidgetGroupBy = exports.WidgetGrid = exports.StatWidget = exports.StackedBarChartWidget = exports.PeriodPicker = exports.PERIOD_OPTIONS = exports.OverviewWidget = exports.OVERVIEW_SECTION_COLORS = exports.LeaderboardWidget = exports.DailyDeltaChartWidget = exports.CHART_SERIES_COLORS = exports.AreaChartWidget = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
|
+
var _tokens = require("./tokens");
|
|
10
|
+
var _IconButton = require("../../components/IconButton");
|
|
11
|
+
var _Icons = require("../../components/Icons");
|
|
12
|
+
var _ProgressBar = require("../../components/ProgressBar");
|
|
13
|
+
var _ProgressRing = require("../../components/ProgressRing");
|
|
14
|
+
var _Select = require("../../components/Select");
|
|
15
|
+
var _Tooltip = require("../../components/Tooltip");
|
|
16
|
+
var _Typography = require("../../components/Typography");
|
|
17
|
+
var _ValueButton = require("../../components/ValueButton");
|
|
18
|
+
var _colors = require("../../utils/colors");
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
21
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
22
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
23
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
24
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
25
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
26
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
27
|
+
/*
|
|
28
|
+
Reusable dashboard widgets for the Presentation mock-ups.
|
|
29
|
+
|
|
30
|
+
These mirror the REAL report widgets in new-activecollab-front
|
|
31
|
+
(src/pages/Reports/Widgets/*): Widget.js (the stat card), WidgetList.js
|
|
32
|
+
(the striped ranked list), ProjectsOverview.js (accent-line sections +
|
|
33
|
+
nested ProgressRings), DailyOpenTasksWidget.js (area line chart),
|
|
34
|
+
DailyCreatedAndCompletedTasksWidget.js (daily +/- bars),
|
|
35
|
+
LeaderboardWidget.js and TotalTrackedHoursChart.js (stacked columns).
|
|
36
|
+
Dimensions, type sizes and colours are copied from that code so any
|
|
37
|
+
dashboard mock built from these reads exactly like the app; the charts are
|
|
38
|
+
plain SVG/CSS here (no chart.js in this Storybook).
|
|
39
|
+
|
|
40
|
+
Data colours (chart palette, tick grey #89898e) are hardcoded on purpose —
|
|
41
|
+
they are data, not theme — while all structure uses var(--…) tokens.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/* Raw (non-Typography) text needs an explicit font — no global reset here. */
|
|
45
|
+
var FONT_STACK = '-apple-system, BlinkMacSystemFont, "Roboto", "Helvetica Neue", Arial, sans-serif';
|
|
46
|
+
|
|
47
|
+
/** Axis-tick grey, same literal the real chart widgets use. */
|
|
48
|
+
var TICK_COLOR = "#89898e";
|
|
49
|
+
|
|
50
|
+
/** Stacked-chart series palette, same order as TotalTrackedHoursChart.js. */
|
|
51
|
+
var CHART_SERIES_COLORS = exports.CHART_SERIES_COLORS = [_colors.colors.blueSky.color, _colors.colors.coral.color, _colors.colors.greenPale.color, _colors.colors.orange.color, _colors.colors.purple.color, _colors.colors.pink.color];
|
|
52
|
+
|
|
53
|
+
/** Ring/section colour pairs used by the app's Projects Overview widget. */
|
|
54
|
+
var OVERVIEW_SECTION_COLORS = exports.OVERVIEW_SECTION_COLORS = {
|
|
55
|
+
tasks: {
|
|
56
|
+
color: _colors.colors.purple.color,
|
|
57
|
+
track: "rgba(190, 172, 249, 0.2)"
|
|
58
|
+
},
|
|
59
|
+
time: {
|
|
60
|
+
color: _colors.colors.blueSky.color,
|
|
61
|
+
track: "rgba(163, 205, 255, 0.2)"
|
|
62
|
+
},
|
|
63
|
+
budget: {
|
|
64
|
+
color: _colors.colors.greenPale.color,
|
|
65
|
+
track: "rgba(195, 231, 153, 0.2)"
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/* ------------------------------------------------------------------ */
|
|
70
|
+
/* Widget grid (mirrors AssignmentsDashboardGrid.js) */
|
|
71
|
+
/* ------------------------------------------------------------------ */
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
The dashboard grid: 24px gaps, 192px rows, 1/2/3/4 columns by breakpoint.
|
|
75
|
+
Put DS <Paper type="paper-2"> cells directly inside and size them with:
|
|
76
|
+
.cell-overview — the big overview card (2×2 on desktop)
|
|
77
|
+
.cell-tall — a 1×2 card (ranked lists)
|
|
78
|
+
.cell-wide — a full-width row (charts)
|
|
79
|
+
Plain cells are 1×1 (stat cards).
|
|
80
|
+
*/
|
|
81
|
+
var WidgetGrid = exports.WidgetGrid = _styledComponents.default.div.withConfig({
|
|
82
|
+
displayName: "dashboardWidgets__WidgetGrid",
|
|
83
|
+
componentId: "sc-lm5ek4-0"
|
|
84
|
+
})(["display:grid;gap:24px;width:100%;max-width:1440px;margin:0 auto 32px;grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:192px;@media (min-width:", "){grid-template-columns:repeat(2,minmax(0,1fr));}@media (min-width:", "){grid-template-columns:repeat(3,minmax(0,1fr));}@media (min-width:", "){grid-template-columns:repeat(4,minmax(0,1fr));}> .cell-overview{grid-row:span 3;@media (min-width:", "){grid-row:span 2;grid-column:span 2;}@media (min-width:", "){grid-column:span 3;}@media (min-width:", "){grid-column:span 2;}}> .cell-tall{grid-row:span 2;}> .cell-wide{@media (min-width:", "){grid-column:span 2;}@media (min-width:", "){grid-column:span 3;}@media (min-width:", "){grid-column:span 4;}}"], _tokens.SM, _tokens.MD, _tokens.LG, _tokens.SM, _tokens.MD, _tokens.LG, _tokens.SM, _tokens.MD, _tokens.LG);
|
|
85
|
+
WidgetGrid.displayName = "WidgetGrid";
|
|
86
|
+
|
|
87
|
+
/* ------------------------------------------------------------------ */
|
|
88
|
+
/* Group-by picker (mirrors WidgetTarget in Widget.js) */
|
|
89
|
+
/* ------------------------------------------------------------------ */
|
|
90
|
+
|
|
91
|
+
/** The sort-lines icon button + radio list every widget corner uses. */
|
|
92
|
+
var WidgetGroupBy = exports.WidgetGroupBy = function WidgetGroupBy(_ref) {
|
|
93
|
+
var _options$;
|
|
94
|
+
var options = _ref.options,
|
|
95
|
+
initial = _ref.initial,
|
|
96
|
+
_onChange = _ref.onChange;
|
|
97
|
+
var _useState = (0, _react.useState)(initial !== null && initial !== void 0 ? initial : (_options$ = options[0]) === null || _options$ === void 0 ? void 0 : _options$.id),
|
|
98
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
99
|
+
selected = _useState2[0],
|
|
100
|
+
setSelected = _useState2[1];
|
|
101
|
+
var _useState3 = (0, _react.useState)(false),
|
|
102
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
103
|
+
open = _useState4[0],
|
|
104
|
+
setOpen = _useState4[1];
|
|
105
|
+
return /*#__PURE__*/_react.default.createElement(_Select.Select, {
|
|
106
|
+
options: options,
|
|
107
|
+
selected: selected,
|
|
108
|
+
onChange: function onChange(value) {
|
|
109
|
+
setSelected(String(value));
|
|
110
|
+
_onChange === null || _onChange === void 0 || _onChange(String(value));
|
|
111
|
+
},
|
|
112
|
+
onSelectOpen: function onSelectOpen() {
|
|
113
|
+
return setOpen(true);
|
|
114
|
+
},
|
|
115
|
+
onSelectClose: function onSelectClose() {
|
|
116
|
+
return setOpen(false);
|
|
117
|
+
},
|
|
118
|
+
position: "bottom-end",
|
|
119
|
+
forceCloseMenu: true,
|
|
120
|
+
disableSearch: true,
|
|
121
|
+
keepSameOptionsOrder: true,
|
|
122
|
+
disabledInternalSort: true,
|
|
123
|
+
target: /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
|
|
124
|
+
type: "button",
|
|
125
|
+
variant: "text gray",
|
|
126
|
+
active: open
|
|
127
|
+
}, /*#__PURE__*/_react.default.createElement(_Icons.SortListIcon, {
|
|
128
|
+
fill: "var(--color-theme-800)"
|
|
129
|
+
}))
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
WidgetGroupBy.displayName = "WidgetGroupBy";
|
|
133
|
+
|
|
134
|
+
/* ------------------------------------------------------------------ */
|
|
135
|
+
/* Time-period picker (the completed widgets' shared control) */
|
|
136
|
+
/* ------------------------------------------------------------------ */
|
|
137
|
+
|
|
138
|
+
/** The app's completed-widget periods (CompletedWidgetTarget radio list). */
|
|
139
|
+
var PERIOD_OPTIONS = exports.PERIOD_OPTIONS = [{
|
|
140
|
+
id: "this_week",
|
|
141
|
+
name: "This Week"
|
|
142
|
+
}, {
|
|
143
|
+
id: "last_week",
|
|
144
|
+
name: "Last Week"
|
|
145
|
+
}, {
|
|
146
|
+
id: "this_month",
|
|
147
|
+
name: "This Month"
|
|
148
|
+
}, {
|
|
149
|
+
id: "last_month",
|
|
150
|
+
name: "Last Month"
|
|
151
|
+
}, {
|
|
152
|
+
id: "this_quarter",
|
|
153
|
+
name: "This Quarter"
|
|
154
|
+
}, {
|
|
155
|
+
id: "last_quarter",
|
|
156
|
+
name: "Last Quarter"
|
|
157
|
+
}, {
|
|
158
|
+
id: "this_year",
|
|
159
|
+
name: "This Year"
|
|
160
|
+
}, {
|
|
161
|
+
id: "last_year",
|
|
162
|
+
name: "Last Year"
|
|
163
|
+
}];
|
|
164
|
+
/** One labelled period control (ValueButton + radio list) that a whole
|
|
165
|
+
* section of period-scoped widgets can share. */
|
|
166
|
+
var PeriodPicker = exports.PeriodPicker = function PeriodPicker(_ref2) {
|
|
167
|
+
var _PERIOD_OPTIONS$find$, _PERIOD_OPTIONS$find;
|
|
168
|
+
var selected = _ref2.selected,
|
|
169
|
+
_onChange2 = _ref2.onChange;
|
|
170
|
+
var _useState5 = (0, _react.useState)(false),
|
|
171
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
172
|
+
open = _useState6[0],
|
|
173
|
+
setOpen = _useState6[1];
|
|
174
|
+
var value = (_PERIOD_OPTIONS$find$ = (_PERIOD_OPTIONS$find = PERIOD_OPTIONS.find(function (option) {
|
|
175
|
+
return option.id === selected;
|
|
176
|
+
})) === null || _PERIOD_OPTIONS$find === void 0 ? void 0 : _PERIOD_OPTIONS$find.name) !== null && _PERIOD_OPTIONS$find$ !== void 0 ? _PERIOD_OPTIONS$find$ : "";
|
|
177
|
+
return /*#__PURE__*/_react.default.createElement(_Select.Select, {
|
|
178
|
+
options: PERIOD_OPTIONS,
|
|
179
|
+
selected: selected,
|
|
180
|
+
onChange: function onChange(next) {
|
|
181
|
+
return _onChange2(String(next));
|
|
182
|
+
},
|
|
183
|
+
onSelectOpen: function onSelectOpen() {
|
|
184
|
+
return setOpen(true);
|
|
185
|
+
},
|
|
186
|
+
onSelectClose: function onSelectClose() {
|
|
187
|
+
return setOpen(false);
|
|
188
|
+
},
|
|
189
|
+
position: "bottom-end",
|
|
190
|
+
forceCloseMenu: true,
|
|
191
|
+
disableSearch: true,
|
|
192
|
+
keepSameOptionsOrder: true,
|
|
193
|
+
disabledInternalSort: true,
|
|
194
|
+
target: /*#__PURE__*/_react.default.createElement(_ValueButton.ValueButton, {
|
|
195
|
+
active: open,
|
|
196
|
+
label: "Period",
|
|
197
|
+
value: value
|
|
198
|
+
})
|
|
199
|
+
});
|
|
200
|
+
};
|
|
201
|
+
PeriodPicker.displayName = "PeriodPicker";
|
|
202
|
+
|
|
203
|
+
/* ------------------------------------------------------------------ */
|
|
204
|
+
/* Stat widget (mirrors Widget.js) */
|
|
205
|
+
/* ------------------------------------------------------------------ */
|
|
206
|
+
|
|
207
|
+
var StyledWidget = _styledComponents.default.div.withConfig({
|
|
208
|
+
displayName: "dashboardWidgets__StyledWidget",
|
|
209
|
+
componentId: "sc-lm5ek4-1"
|
|
210
|
+
})(["position:relative;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.widget-top{display:flex;justify-content:space-between;gap:8px;}.widget-corner{display:flex;align-items:center;gap:4px;flex-shrink:0;}.widget-total{display:flex;width:100%;height:56px;margin-bottom:8px;font-family:", ";font-size:52px;font-weight:700;line-height:1;color:var(--color-theme-900);}.widget-total.alert{color:var(--red-alert);}.widget-total.success{color:", ";}.widget-total .widget-unit{align-self:center;margin-left:10px;font-size:20px;font-weight:600;line-height:1;color:var(--color-theme-600);}.widget-title{margin-bottom:8px;}.widget-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;height:40px;margin-bottom:8px;}.widget-link{display:inline-flex;cursor:pointer;text-decoration:none;}"], FONT_STACK, _colors.colors.greenSuccess.color);
|
|
211
|
+
var StatWidget = exports.StatWidget = function StatWidget(_ref3) {
|
|
212
|
+
var value = _ref3.value,
|
|
213
|
+
unit = _ref3.unit,
|
|
214
|
+
title = _ref3.title,
|
|
215
|
+
description = _ref3.description,
|
|
216
|
+
linkText = _ref3.linkText,
|
|
217
|
+
alert = _ref3.alert,
|
|
218
|
+
success = _ref3.success,
|
|
219
|
+
groupBy = _ref3.groupBy,
|
|
220
|
+
cornerControl = _ref3.cornerControl,
|
|
221
|
+
children = _ref3.children;
|
|
222
|
+
return /*#__PURE__*/_react.default.createElement(StyledWidget, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
223
|
+
className: "widget-top"
|
|
224
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
225
|
+
className: alert ? "widget-total alert" : success ? "widget-total success" : "widget-total"
|
|
226
|
+
}, value, unit ? /*#__PURE__*/_react.default.createElement("span", {
|
|
227
|
+
className: "widget-unit"
|
|
228
|
+
}, unit) : null), cornerControl || groupBy ? /*#__PURE__*/_react.default.createElement("span", {
|
|
229
|
+
className: "widget-corner"
|
|
230
|
+
}, cornerControl, groupBy ? /*#__PURE__*/_react.default.createElement(WidgetGroupBy, groupBy) : null) : null), /*#__PURE__*/_react.default.createElement(_Typography.Body1, {
|
|
231
|
+
weight: "bold",
|
|
232
|
+
color: alert ? "alert" : "primary",
|
|
233
|
+
overflow: "truncate",
|
|
234
|
+
whitespace: "no-wrap",
|
|
235
|
+
className: "widget-title"
|
|
236
|
+
}, title), /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
237
|
+
color: "tertiary",
|
|
238
|
+
className: "widget-desc"
|
|
239
|
+
}, description), children, linkText ? /*#__PURE__*/_react.default.createElement("a", {
|
|
240
|
+
className: "widget-link"
|
|
241
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
242
|
+
color: "theme-primary",
|
|
243
|
+
weight: "medium"
|
|
244
|
+
}, linkText)) : null);
|
|
245
|
+
};
|
|
246
|
+
StatWidget.displayName = "StatWidget";
|
|
247
|
+
|
|
248
|
+
/* ------------------------------------------------------------------ */
|
|
249
|
+
/* Ranked list (mirrors WidgetList.js) */
|
|
250
|
+
/* ------------------------------------------------------------------ */
|
|
251
|
+
|
|
252
|
+
var StyledRankedList = _styledComponents.default.div.withConfig({
|
|
253
|
+
displayName: "dashboardWidgets__StyledRankedList",
|
|
254
|
+
componentId: "sc-lm5ek4-2"
|
|
255
|
+
})(["height:216px;overflow-y:auto;padding:4px 0;.ranked-row{display:flex;align-items:center;justify-content:space-between;gap:4px;height:24px;padding:0 6px;margin-bottom:4px;border-radius:2px;box-sizing:border-box;}.ranked-row:nth-child(odd){background-color:var(--color-theme-200);}.ranked-name{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.ranked-value{flex-shrink:0;}"]);
|
|
256
|
+
|
|
257
|
+
/** The striped name/count rows inside a tall stat widget. */
|
|
258
|
+
var WidgetRankedList = exports.WidgetRankedList = function WidgetRankedList(_ref4) {
|
|
259
|
+
var items = _ref4.items;
|
|
260
|
+
return /*#__PURE__*/_react.default.createElement(StyledRankedList, null, items.map(function (item) {
|
|
261
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
262
|
+
className: "ranked-row",
|
|
263
|
+
key: item.name
|
|
264
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
265
|
+
color: "secondary",
|
|
266
|
+
className: "ranked-name"
|
|
267
|
+
}, item.name), /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
268
|
+
color: "secondary",
|
|
269
|
+
className: "ranked-value"
|
|
270
|
+
}, item.value));
|
|
271
|
+
}));
|
|
272
|
+
};
|
|
273
|
+
WidgetRankedList.displayName = "WidgetRankedList";
|
|
274
|
+
|
|
275
|
+
/* ------------------------------------------------------------------ */
|
|
276
|
+
/* Overview widget (mirrors ProjectsOverview.js) */
|
|
277
|
+
/* ------------------------------------------------------------------ */
|
|
278
|
+
|
|
279
|
+
var RING_RADII = [121, 93, 63];
|
|
280
|
+
var RING_STROKE = 20;
|
|
281
|
+
var StyledOverview = _styledComponents.default.div.withConfig({
|
|
282
|
+
displayName: "dashboardWidgets__StyledOverview",
|
|
283
|
+
componentId: "sc-lm5ek4-3"
|
|
284
|
+
})(["position:relative;display:flex;flex-direction:column;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.overview-head{display:flex;justify-content:space-between;gap:8px;}.overview-body{display:flex;flex-direction:column-reverse;justify-content:space-between;gap:4px;height:100%;@media (min-width:", "){flex-direction:row;margin-top:48px;}}.overview-sections{display:flex;flex-direction:column;gap:24px;width:100%;height:fit-content;@media (min-width:", "){height:100%;}}.overview-section{display:flex;width:fit-content;height:fit-content;}.overview-line{width:2px;margin-right:12px;align-self:stretch;flex-shrink:0;}.overview-value{height:28px;margin-bottom:2px;}.overview-value-row{display:flex;align-items:flex-end;gap:4px;}.overview-desc{display:flex;align-items:center;gap:8px;}.overview-desc svg{cursor:help;flex-shrink:0;}.overview-link{display:inline-flex;margin-top:4px;cursor:pointer;text-decoration:none;}.overview-rings{display:flex;align-self:center;@media (min-width:", "){align-self:flex-end;}}@media (max-width:639px){.overview-rings{transform:scale(0.6);transform-origin:center;margin:-48px 0;}}"], _tokens.SM, _tokens.SM, _tokens.SM);
|
|
285
|
+
var ringColor = function ringColor(section, hovered) {
|
|
286
|
+
var active = !hovered || hovered === section.id;
|
|
287
|
+
if (section.progress > 100) {
|
|
288
|
+
return active ? "var(--red-alert)" : "rgba(237, 97, 97, 0.25)";
|
|
289
|
+
}
|
|
290
|
+
return active ? section.color : "var(--color-theme-200)";
|
|
291
|
+
};
|
|
292
|
+
var ringTrack = function ringTrack(section, hovered) {
|
|
293
|
+
var active = !hovered || hovered === section.id;
|
|
294
|
+
return active ? section.trackColor : "var(--color-theme-200)";
|
|
295
|
+
};
|
|
296
|
+
var OverviewSection = function OverviewSection(_ref5) {
|
|
297
|
+
var section = _ref5.section,
|
|
298
|
+
onHover = _ref5.onHover;
|
|
299
|
+
var alert = section.progress > 100;
|
|
300
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
301
|
+
className: "overview-section",
|
|
302
|
+
onMouseEnter: function onMouseEnter() {
|
|
303
|
+
return onHover(section.id);
|
|
304
|
+
},
|
|
305
|
+
onMouseLeave: function onMouseLeave() {
|
|
306
|
+
return onHover(null);
|
|
307
|
+
}
|
|
308
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
309
|
+
className: "overview-line",
|
|
310
|
+
style: {
|
|
311
|
+
backgroundColor: alert ? "var(--red-alert)" : section.color
|
|
312
|
+
}
|
|
313
|
+
}), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
|
|
314
|
+
className: "overview-value"
|
|
315
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Title2, {
|
|
316
|
+
lineHeight: "tight",
|
|
317
|
+
weight: "bold",
|
|
318
|
+
color: alert ? "alert" : "primary"
|
|
319
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
320
|
+
className: "overview-value-row"
|
|
321
|
+
}, section.value, section.unit ? /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
322
|
+
color: "tertiary"
|
|
323
|
+
}, section.unit) : null))), /*#__PURE__*/_react.default.createElement("div", {
|
|
324
|
+
className: "overview-desc"
|
|
325
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
326
|
+
color: "tertiary"
|
|
327
|
+
}, section.description), section.explainer ? /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
|
|
328
|
+
title: section.explainer
|
|
329
|
+
}, /*#__PURE__*/_react.default.createElement(_Icons.InfoSmallIcon, null)) : null), /*#__PURE__*/_react.default.createElement("a", {
|
|
330
|
+
className: "overview-link"
|
|
331
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
332
|
+
color: "theme-primary",
|
|
333
|
+
weight: "medium"
|
|
334
|
+
}, section.linkText))));
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
/** The big overview card: accent-line metric sections + nested rings.
|
|
338
|
+
* Hovering a section highlights its ring and mutes the other rings,
|
|
339
|
+
* exactly like the app's Projects Overview. */
|
|
340
|
+
var OverviewWidget = exports.OverviewWidget = function OverviewWidget(_ref6) {
|
|
341
|
+
var title = _ref6.title,
|
|
342
|
+
subtitle = _ref6.subtitle,
|
|
343
|
+
sections = _ref6.sections,
|
|
344
|
+
headerRight = _ref6.headerRight;
|
|
345
|
+
var _useState7 = (0, _react.useState)(null),
|
|
346
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
347
|
+
hovered = _useState8[0],
|
|
348
|
+
setHovered = _useState8[1];
|
|
349
|
+
var _nestRings = function nestRings(index) {
|
|
350
|
+
var section = sections[index];
|
|
351
|
+
if (!section) {
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
return /*#__PURE__*/_react.default.createElement(_ProgressRing.ProgressRing, {
|
|
355
|
+
roundStroke: true,
|
|
356
|
+
progress: section.progress,
|
|
357
|
+
stroke: RING_STROKE,
|
|
358
|
+
radius: RING_RADII[index],
|
|
359
|
+
progressColor: ringColor(section, hovered),
|
|
360
|
+
backgroundColor: ringTrack(section, hovered)
|
|
361
|
+
}, _nestRings(index + 1));
|
|
362
|
+
};
|
|
363
|
+
return /*#__PURE__*/_react.default.createElement(StyledOverview, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
364
|
+
className: "overview-head"
|
|
365
|
+
}, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Typography.Body1, {
|
|
366
|
+
weight: "bold"
|
|
367
|
+
}, title), /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
368
|
+
color: "secondary"
|
|
369
|
+
}, subtitle)), headerRight), /*#__PURE__*/_react.default.createElement("div", {
|
|
370
|
+
className: "overview-body"
|
|
371
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
372
|
+
className: "overview-sections"
|
|
373
|
+
}, sections.map(function (section) {
|
|
374
|
+
return /*#__PURE__*/_react.default.createElement(OverviewSection, {
|
|
375
|
+
key: section.id,
|
|
376
|
+
section: section,
|
|
377
|
+
onHover: setHovered
|
|
378
|
+
});
|
|
379
|
+
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
380
|
+
className: "overview-rings"
|
|
381
|
+
}, _nestRings(0))));
|
|
382
|
+
};
|
|
383
|
+
OverviewWidget.displayName = "OverviewWidget";
|
|
384
|
+
|
|
385
|
+
/* ------------------------------------------------------------------ */
|
|
386
|
+
/* Chart scaffolding shared by the chart widgets */
|
|
387
|
+
/* ------------------------------------------------------------------ */
|
|
388
|
+
|
|
389
|
+
var PLOT_HEIGHT = 116;
|
|
390
|
+
var StyledChartWidget = _styledComponents.default.div.withConfig({
|
|
391
|
+
displayName: "dashboardWidgets__StyledChartWidget",
|
|
392
|
+
componentId: "sc-lm5ek4-4"
|
|
393
|
+
})(["position:relative;height:100%;padding:16px 20px 0;box-sizing:border-box;overflow:hidden;.chart-head{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;}.chart-link{display:inline-flex;cursor:pointer;text-decoration:none;flex-shrink:0;}.chart-row{display:flex;gap:10px;}.chart-y-axis{position:relative;width:30px;height:", "px;flex-shrink:0;}.chart-y-tick{position:absolute;right:0;transform:translateY(-50%);font-family:", ";font-size:11px;color:", ";white-space:nowrap;}.chart-plot{position:relative;flex:1;min-width:0;height:", "px;}.chart-x-axis{display:flex;justify-content:space-between;margin-top:6px;padding-left:40px;font-family:", ";font-size:11px;color:", ";}.chart-x-axis span{white-space:nowrap;}"], PLOT_HEIGHT, FONT_STACK, TICK_COLOR, PLOT_HEIGHT, FONT_STACK, TICK_COLOR);
|
|
394
|
+
var ChartHead = function ChartHead(_ref7) {
|
|
395
|
+
var title = _ref7.title,
|
|
396
|
+
linkText = _ref7.linkText;
|
|
397
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
398
|
+
className: "chart-head"
|
|
399
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body1, {
|
|
400
|
+
weight: "bold",
|
|
401
|
+
overflow: "truncate",
|
|
402
|
+
whitespace: "no-wrap"
|
|
403
|
+
}, title), linkText ? /*#__PURE__*/_react.default.createElement("a", {
|
|
404
|
+
className: "chart-link"
|
|
405
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
406
|
+
color: "theme-primary",
|
|
407
|
+
weight: "medium"
|
|
408
|
+
}, linkText)) : null);
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
/* ------------------------------------------------------------------ */
|
|
412
|
+
/* Area line chart (mirrors DailyOpenTasksWidget.js) */
|
|
413
|
+
/* ------------------------------------------------------------------ */
|
|
414
|
+
|
|
415
|
+
/** Line + gradient fill colours from the real widget. */
|
|
416
|
+
var AREA_LINE = "#A3CDFF";
|
|
417
|
+
/** Sharp-edged line with a soft gradient below, like "Number of Open Tasks". */
|
|
418
|
+
var AreaChartWidget = exports.AreaChartWidget = function AreaChartWidget(_ref8) {
|
|
419
|
+
var title = _ref8.title,
|
|
420
|
+
linkText = _ref8.linkText,
|
|
421
|
+
points = _ref8.points,
|
|
422
|
+
xLabels = _ref8.xLabels,
|
|
423
|
+
yTicks = _ref8.yTicks;
|
|
424
|
+
var min = Math.min(...yTicks);
|
|
425
|
+
var max = Math.max(...yTicks);
|
|
426
|
+
var range = max - min || 1;
|
|
427
|
+
var W = 1000;
|
|
428
|
+
var toXY = function toXY(value, index) {
|
|
429
|
+
var x = index / Math.max(points.length - 1, 1) * W;
|
|
430
|
+
var y = (max - value) / range * PLOT_HEIGHT;
|
|
431
|
+
return "".concat(x.toFixed(1), ",").concat(y.toFixed(1));
|
|
432
|
+
};
|
|
433
|
+
var linePoints = points.map(toXY).join(" ");
|
|
434
|
+
var areaPoints = "0,".concat(PLOT_HEIGHT, " ").concat(linePoints, " ").concat(W, ",").concat(PLOT_HEIGHT);
|
|
435
|
+
return /*#__PURE__*/_react.default.createElement(StyledChartWidget, null, /*#__PURE__*/_react.default.createElement(ChartHead, {
|
|
436
|
+
title: title,
|
|
437
|
+
linkText: linkText
|
|
438
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
439
|
+
className: "chart-row"
|
|
440
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
441
|
+
className: "chart-y-axis"
|
|
442
|
+
}, yTicks.map(function (tick) {
|
|
443
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
444
|
+
key: tick,
|
|
445
|
+
className: "chart-y-tick",
|
|
446
|
+
style: {
|
|
447
|
+
top: "".concat((max - tick) / range * PLOT_HEIGHT, "px")
|
|
448
|
+
}
|
|
449
|
+
}, tick);
|
|
450
|
+
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
451
|
+
className: "chart-plot"
|
|
452
|
+
}, /*#__PURE__*/_react.default.createElement("svg", {
|
|
453
|
+
width: "100%",
|
|
454
|
+
height: PLOT_HEIGHT,
|
|
455
|
+
viewBox: "0 0 ".concat(W, " ").concat(PLOT_HEIGHT),
|
|
456
|
+
preserveAspectRatio: "none",
|
|
457
|
+
style: {
|
|
458
|
+
display: "block"
|
|
459
|
+
}
|
|
460
|
+
}, /*#__PURE__*/_react.default.createElement("defs", null, /*#__PURE__*/_react.default.createElement("linearGradient", {
|
|
461
|
+
id: "ac-area-gradient",
|
|
462
|
+
x1: "0",
|
|
463
|
+
y1: "0",
|
|
464
|
+
x2: "0",
|
|
465
|
+
y2: "1"
|
|
466
|
+
}, /*#__PURE__*/_react.default.createElement("stop", {
|
|
467
|
+
offset: "0%",
|
|
468
|
+
stopColor: "rgba(163, 205, 255, 0.4)"
|
|
469
|
+
}), /*#__PURE__*/_react.default.createElement("stop", {
|
|
470
|
+
offset: "100%",
|
|
471
|
+
stopColor: "rgba(163, 205, 255, 0)"
|
|
472
|
+
}))), /*#__PURE__*/_react.default.createElement("polygon", {
|
|
473
|
+
points: areaPoints,
|
|
474
|
+
fill: "url(#ac-area-gradient)"
|
|
475
|
+
}), /*#__PURE__*/_react.default.createElement("polyline", {
|
|
476
|
+
points: linePoints,
|
|
477
|
+
fill: "none",
|
|
478
|
+
stroke: AREA_LINE,
|
|
479
|
+
strokeWidth: 2.5,
|
|
480
|
+
vectorEffect: "non-scaling-stroke"
|
|
481
|
+
})))), /*#__PURE__*/_react.default.createElement("div", {
|
|
482
|
+
className: "chart-x-axis"
|
|
483
|
+
}, xLabels.map(function (label) {
|
|
484
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
485
|
+
key: label
|
|
486
|
+
}, label);
|
|
487
|
+
})));
|
|
488
|
+
};
|
|
489
|
+
AreaChartWidget.displayName = "AreaChartWidget";
|
|
490
|
+
|
|
491
|
+
/* ------------------------------------------------------------------ */
|
|
492
|
+
/* Daily +/- bars (mirrors DailyCreatedAndCompletedTasksWidget.js) */
|
|
493
|
+
/* ------------------------------------------------------------------ */
|
|
494
|
+
|
|
495
|
+
/** Bar colours from the real widget: new above, completed below. */
|
|
496
|
+
var DELTA_UP = "#A3CDFF";
|
|
497
|
+
var DELTA_DOWN = "#FF9C9C";
|
|
498
|
+
var StyledDeltaBars = _styledComponents.default.div.withConfig({
|
|
499
|
+
displayName: "dashboardWidgets__StyledDeltaBars",
|
|
500
|
+
componentId: "sc-lm5ek4-5"
|
|
501
|
+
})(["display:flex;height:100%;.delta-col{position:relative;flex:1;min-width:0;}.delta-bar{position:absolute;left:50%;width:4px;max-width:80%;transform:translateX(-50%);}.delta-zero{position:absolute;left:0;right:0;height:1px;background-color:", ";}"], TICK_COLOR);
|
|
502
|
+
|
|
503
|
+
/** Thin daily bars above/below a zero line, like "New vs Completed Tasks". */
|
|
504
|
+
var DailyDeltaChartWidget = exports.DailyDeltaChartWidget = function DailyDeltaChartWidget(_ref9) {
|
|
505
|
+
var title = _ref9.title,
|
|
506
|
+
linkText = _ref9.linkText,
|
|
507
|
+
data = _ref9.data,
|
|
508
|
+
xLabels = _ref9.xLabels,
|
|
509
|
+
upMax = _ref9.upMax,
|
|
510
|
+
downMax = _ref9.downMax,
|
|
511
|
+
yTicksUp = _ref9.yTicksUp,
|
|
512
|
+
yTicksDown = _ref9.yTicksDown;
|
|
513
|
+
var upFrac = upMax / (upMax + downMax);
|
|
514
|
+
var zeroTop = upFrac * PLOT_HEIGHT;
|
|
515
|
+
var tickTop = function tickTop(value, below) {
|
|
516
|
+
return below ? zeroTop + value / downMax * (PLOT_HEIGHT - zeroTop) : zeroTop - value / upMax * zeroTop;
|
|
517
|
+
};
|
|
518
|
+
return /*#__PURE__*/_react.default.createElement(StyledChartWidget, null, /*#__PURE__*/_react.default.createElement(ChartHead, {
|
|
519
|
+
title: title,
|
|
520
|
+
linkText: linkText
|
|
521
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
522
|
+
className: "chart-row"
|
|
523
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
524
|
+
className: "chart-y-axis"
|
|
525
|
+
}, yTicksUp.map(function (tick) {
|
|
526
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
527
|
+
key: "up-".concat(tick),
|
|
528
|
+
className: "chart-y-tick",
|
|
529
|
+
style: {
|
|
530
|
+
top: "".concat(tickTop(tick, false), "px")
|
|
531
|
+
}
|
|
532
|
+
}, tick);
|
|
533
|
+
}), /*#__PURE__*/_react.default.createElement("span", {
|
|
534
|
+
className: "chart-y-tick",
|
|
535
|
+
style: {
|
|
536
|
+
top: "".concat(zeroTop, "px")
|
|
537
|
+
}
|
|
538
|
+
}, "0"), yTicksDown.map(function (tick) {
|
|
539
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
540
|
+
key: "down-".concat(tick),
|
|
541
|
+
className: "chart-y-tick",
|
|
542
|
+
style: {
|
|
543
|
+
top: "".concat(tickTop(tick, true), "px")
|
|
544
|
+
}
|
|
545
|
+
}, tick);
|
|
546
|
+
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
547
|
+
className: "chart-plot"
|
|
548
|
+
}, /*#__PURE__*/_react.default.createElement(StyledDeltaBars, null, /*#__PURE__*/_react.default.createElement("span", {
|
|
549
|
+
className: "delta-zero",
|
|
550
|
+
style: {
|
|
551
|
+
top: "".concat(zeroTop, "px")
|
|
552
|
+
}
|
|
553
|
+
}), data.map(function (point, index) {
|
|
554
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
555
|
+
className: "delta-col",
|
|
556
|
+
key: index
|
|
557
|
+
}, point.up > 0 ? /*#__PURE__*/_react.default.createElement("span", {
|
|
558
|
+
className: "delta-bar",
|
|
559
|
+
style: {
|
|
560
|
+
backgroundColor: DELTA_UP,
|
|
561
|
+
bottom: "".concat(PLOT_HEIGHT - zeroTop, "px"),
|
|
562
|
+
height: "".concat(point.up / upMax * zeroTop, "px")
|
|
563
|
+
}
|
|
564
|
+
}) : null, point.down > 0 ? /*#__PURE__*/_react.default.createElement("span", {
|
|
565
|
+
className: "delta-bar",
|
|
566
|
+
style: {
|
|
567
|
+
backgroundColor: DELTA_DOWN,
|
|
568
|
+
top: "".concat(zeroTop + 1, "px"),
|
|
569
|
+
height: "".concat(point.down / downMax * (PLOT_HEIGHT - zeroTop), "px")
|
|
570
|
+
}
|
|
571
|
+
}) : null);
|
|
572
|
+
})))), /*#__PURE__*/_react.default.createElement("div", {
|
|
573
|
+
className: "chart-x-axis"
|
|
574
|
+
}, xLabels.map(function (label) {
|
|
575
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
576
|
+
key: label
|
|
577
|
+
}, label);
|
|
578
|
+
})));
|
|
579
|
+
};
|
|
580
|
+
DailyDeltaChartWidget.displayName = "DailyDeltaChartWidget";
|
|
581
|
+
|
|
582
|
+
/* ------------------------------------------------------------------ */
|
|
583
|
+
/* Leaderboard (mirrors LeaderboardWidget.js) */
|
|
584
|
+
/* ------------------------------------------------------------------ */
|
|
585
|
+
|
|
586
|
+
var StyledLeaderboard = _styledComponents.default.div.withConfig({
|
|
587
|
+
displayName: "dashboardWidgets__StyledLeaderboard",
|
|
588
|
+
componentId: "sc-lm5ek4-6"
|
|
589
|
+
})(["position:relative;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.lb-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;}.lb-desc{margin-bottom:12px;}.lb-sep{border-bottom:1px solid var(--border-primary);margin-bottom:12px;}.lb-rows{max-height:288px;overflow-y:auto;}.lb-row{display:flex;align-items:center;gap:16px;height:32px;margin-bottom:4px;}.lb-label{width:208px;max-width:40%;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;}.lb-bar{flex:1;min-width:0;height:8px;}.lb-bar-inner{min-width:8px;height:100%;border-radius:4px;overflow:hidden;}.lb-value{width:80px;flex-shrink:0;text-align:right;}"]);
|
|
590
|
+
|
|
591
|
+
/** Ranked bars: label, billable/non-billable bar, value — like Time's
|
|
592
|
+
* Leaderboard. Bar length = share of the leader; green = billable part. */
|
|
593
|
+
var LeaderboardWidget = exports.LeaderboardWidget = function LeaderboardWidget(_ref0) {
|
|
594
|
+
var title = _ref0.title,
|
|
595
|
+
description = _ref0.description,
|
|
596
|
+
rows = _ref0.rows,
|
|
597
|
+
groupBy = _ref0.groupBy;
|
|
598
|
+
return /*#__PURE__*/_react.default.createElement(StyledLeaderboard, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
599
|
+
className: "lb-head"
|
|
600
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Header2, null, title), groupBy ? /*#__PURE__*/_react.default.createElement(WidgetGroupBy, groupBy) : null), /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
601
|
+
color: "tertiary",
|
|
602
|
+
className: "lb-desc"
|
|
603
|
+
}, description), /*#__PURE__*/_react.default.createElement("div", {
|
|
604
|
+
className: "lb-sep"
|
|
605
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
606
|
+
className: "lb-rows"
|
|
607
|
+
}, rows.map(function (row) {
|
|
608
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
609
|
+
className: "lb-row",
|
|
610
|
+
key: row.label
|
|
611
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
612
|
+
className: "lb-label"
|
|
613
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
614
|
+
color: "theme-primary"
|
|
615
|
+
}, row.label)), /*#__PURE__*/_react.default.createElement("span", {
|
|
616
|
+
className: "lb-bar"
|
|
617
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
618
|
+
className: "lb-bar-inner",
|
|
619
|
+
style: {
|
|
620
|
+
width: "".concat(row.percentOfMax, "%"),
|
|
621
|
+
display: "block"
|
|
622
|
+
}
|
|
623
|
+
}, /*#__PURE__*/_react.default.createElement(_ProgressBar.ProgressBar, {
|
|
624
|
+
progress: row.billableShare,
|
|
625
|
+
stroke: 8,
|
|
626
|
+
progressColor: _colors.colors.greenSuccess.color
|
|
627
|
+
}))), /*#__PURE__*/_react.default.createElement("span", {
|
|
628
|
+
className: "lb-value"
|
|
629
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
630
|
+
color: "secondary"
|
|
631
|
+
}, row.value)));
|
|
632
|
+
})));
|
|
633
|
+
};
|
|
634
|
+
LeaderboardWidget.displayName = "LeaderboardWidget";
|
|
635
|
+
|
|
636
|
+
/* ------------------------------------------------------------------ */
|
|
637
|
+
/* Stacked columns (mirrors TotalTrackedHoursChart.js bar mode) */
|
|
638
|
+
/* ------------------------------------------------------------------ */
|
|
639
|
+
|
|
640
|
+
var StyledStackedChart = _styledComponents.default.div.withConfig({
|
|
641
|
+
displayName: "dashboardWidgets__StyledStackedChart",
|
|
642
|
+
componentId: "sc-lm5ek4-7"
|
|
643
|
+
})(["position:relative;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.sb-head{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;margin-bottom:8px;}.sb-total-wrap{display:flex;align-items:flex-start;gap:8px;margin-left:auto;}.sb-total{font-family:", ";font-size:52px;font-weight:700;line-height:1;color:var(--color-theme-900);}.sb-row{display:flex;gap:10px;}.sb-y-axis{position:relative;width:30px;flex-shrink:0;}.sb-y-tick{position:absolute;right:0;transform:translateY(-50%);font-family:", ";font-size:11px;color:", ";}.sb-plot{position:relative;flex:1;min-width:0;}.sb-grid-line{position:absolute;left:0;right:0;height:1px;background-color:var(--color-theme-300);}.sb-cols{position:relative;display:flex;justify-content:space-around;align-items:flex-end;height:100%;}.sb-slot{display:flex;flex-direction:column-reverse;flex-shrink:0;}.sb-labels{display:flex;justify-content:space-around;margin-top:8px;padding-left:40px;font-family:", ";font-size:11px;color:", ";}"], FONT_STACK, FONT_STACK, TICK_COLOR, FONT_STACK, TICK_COLOR);
|
|
644
|
+
|
|
645
|
+
/** Narrow stacked time columns, like the Time dashboard's tracked-hours
|
|
646
|
+
* chart. Segment order and palette follow the real chart. */
|
|
647
|
+
var StackedBarChartWidget = exports.StackedBarChartWidget = function StackedBarChartWidget(_ref1) {
|
|
648
|
+
var title = _ref1.title,
|
|
649
|
+
total = _ref1.total,
|
|
650
|
+
data = _ref1.data,
|
|
651
|
+
seriesLabels = _ref1.seriesLabels,
|
|
652
|
+
yTicks = _ref1.yTicks,
|
|
653
|
+
_ref1$barWidth = _ref1.barWidth,
|
|
654
|
+
barWidth = _ref1$barWidth === void 0 ? 28 : _ref1$barWidth,
|
|
655
|
+
_ref1$height = _ref1.height,
|
|
656
|
+
height = _ref1$height === void 0 ? 220 : _ref1$height,
|
|
657
|
+
groupBy = _ref1.groupBy;
|
|
658
|
+
var max = Math.max(...yTicks) || 1;
|
|
659
|
+
return /*#__PURE__*/_react.default.createElement(StyledStackedChart, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
660
|
+
className: "sb-head"
|
|
661
|
+
}, title ? /*#__PURE__*/_react.default.createElement(_Typography.Body1, {
|
|
662
|
+
weight: "bold"
|
|
663
|
+
}, title) : null, /*#__PURE__*/_react.default.createElement("span", {
|
|
664
|
+
className: "sb-total-wrap"
|
|
665
|
+
}, total ? /*#__PURE__*/_react.default.createElement("span", {
|
|
666
|
+
className: "sb-total"
|
|
667
|
+
}, total) : null, groupBy ? /*#__PURE__*/_react.default.createElement(WidgetGroupBy, groupBy) : null)), /*#__PURE__*/_react.default.createElement("div", {
|
|
668
|
+
className: "sb-row"
|
|
669
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
670
|
+
className: "sb-y-axis",
|
|
671
|
+
style: {
|
|
672
|
+
height: "".concat(height, "px")
|
|
673
|
+
}
|
|
674
|
+
}, yTicks.map(function (tick) {
|
|
675
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
676
|
+
key: tick,
|
|
677
|
+
className: "sb-y-tick",
|
|
678
|
+
style: {
|
|
679
|
+
top: "".concat((max - tick) / max * height, "px")
|
|
680
|
+
}
|
|
681
|
+
}, tick);
|
|
682
|
+
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
683
|
+
className: "sb-plot",
|
|
684
|
+
style: {
|
|
685
|
+
height: "".concat(height, "px")
|
|
686
|
+
}
|
|
687
|
+
}, yTicks.map(function (tick) {
|
|
688
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
689
|
+
key: tick,
|
|
690
|
+
className: "sb-grid-line",
|
|
691
|
+
style: {
|
|
692
|
+
top: "".concat((max - tick) / max * height, "px")
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
696
|
+
className: "sb-cols"
|
|
697
|
+
}, data.map(function (column) {
|
|
698
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
699
|
+
className: "sb-slot",
|
|
700
|
+
key: column.label,
|
|
701
|
+
style: {
|
|
702
|
+
width: "".concat(barWidth, "px")
|
|
703
|
+
}
|
|
704
|
+
}, column.segments.map(function (value, index) {
|
|
705
|
+
var _seriesLabels$index;
|
|
706
|
+
return value > 0 ? /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
|
|
707
|
+
key: (_seriesLabels$index = seriesLabels[index]) !== null && _seriesLabels$index !== void 0 ? _seriesLabels$index : index,
|
|
708
|
+
title: "".concat(seriesLabels[index], ": ").concat(value, "h")
|
|
709
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
710
|
+
style: {
|
|
711
|
+
display: "block",
|
|
712
|
+
height: "".concat(value / max * height, "px"),
|
|
713
|
+
backgroundColor: CHART_SERIES_COLORS[index % CHART_SERIES_COLORS.length]
|
|
714
|
+
}
|
|
715
|
+
})) : null;
|
|
716
|
+
}));
|
|
717
|
+
})))), /*#__PURE__*/_react.default.createElement("div", {
|
|
718
|
+
className: "sb-labels"
|
|
719
|
+
}, data.map(function (column) {
|
|
720
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
721
|
+
key: column.label
|
|
722
|
+
}, column.label);
|
|
723
|
+
})));
|
|
724
|
+
};
|
|
725
|
+
StackedBarChartWidget.displayName = "StackedBarChartWidget";
|
|
726
|
+
//# sourceMappingURL=dashboardWidgets.js.map
|