@activecollab/components 2.0.417 → 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/MessageDialog.js +62 -107
- package/dist/cjs/presentation/shared/MessageDialog.js.map +1 -1
- package/dist/cjs/presentation/shared/MessageFeedback.js +284 -0
- package/dist/cjs/presentation/shared/MessageFeedback.js.map +1 -0
- 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 +130 -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/MessageDialog.d.ts +8 -3
- package/dist/esm/presentation/shared/MessageDialog.d.ts.map +1 -1
- package/dist/esm/presentation/shared/MessageDialog.js +64 -98
- package/dist/esm/presentation/shared/MessageDialog.js.map +1 -1
- package/dist/esm/presentation/shared/MessageFeedback.d.ts +54 -0
- package/dist/esm/presentation/shared/MessageFeedback.d.ts.map +1 -0
- package/dist/esm/presentation/shared/MessageFeedback.js +252 -0
- package/dist/esm/presentation/shared/MessageFeedback.js.map +1 -0
- 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 +8 -0
- package/dist/esm/presentation/shared/index.d.ts.map +1 -1
- package/dist/esm/presentation/shared/index.js +4 -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 @@
|
|
|
1
|
+
{"version":3,"file":"dashboardWidgets.js","names":["_react","_interopRequireWildcard","require","_styledComponents","_interopRequireDefault","_tokens","_IconButton","_Icons","_ProgressBar","_ProgressRing","_Select","_Tooltip","_Typography","_ValueButton","_colors","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","length","l","Symbol","iterator","u","next","done","push","value","return","isArray","FONT_STACK","TICK_COLOR","CHART_SERIES_COLORS","exports","colors","blueSky","color","coral","greenPale","orange","purple","pink","OVERVIEW_SECTION_COLORS","tasks","track","time","budget","WidgetGrid","styled","div","withConfig","displayName","componentId","SM","MD","LG","WidgetGroupBy","_ref","_options$","options","initial","onChange","_useState","useState","id","_useState2","selected","setSelected","_useState3","_useState4","open","setOpen","createElement","Select","String","onSelectOpen","onSelectClose","position","forceCloseMenu","disableSearch","keepSameOptionsOrder","disabledInternalSort","target","IconButton","type","variant","active","SortListIcon","fill","PERIOD_OPTIONS","PeriodPicker","_ref2","_PERIOD_OPTIONS$find$","_PERIOD_OPTIONS$find","_useState5","_useState6","find","option","ValueButton","label","StyledWidget","greenSuccess","StatWidget","_ref3","unit","title","description","linkText","alert","success","groupBy","cornerControl","children","className","Body1","weight","overflow","whitespace","Body2","StyledRankedList","WidgetRankedList","_ref4","items","map","item","key","RING_RADII","RING_STROKE","StyledOverview","ringColor","section","hovered","progress","ringTrack","trackColor","OverviewSection","_ref5","onHover","onMouseEnter","onMouseLeave","style","backgroundColor","Title2","lineHeight","explainer","Tooltip","InfoSmallIcon","OverviewWidget","_ref6","subtitle","sections","headerRight","_useState7","_useState8","setHovered","nestRings","index","ProgressRing","roundStroke","stroke","radius","progressColor","PLOT_HEIGHT","StyledChartWidget","ChartHead","_ref7","AREA_LINE","AreaChartWidget","_ref8","points","xLabels","yTicks","min","Math","max","range","W","toXY","x","y","concat","toFixed","linePoints","join","areaPoints","tick","top","width","height","viewBox","preserveAspectRatio","display","x1","y1","x2","y2","offset","stopColor","strokeWidth","vectorEffect","DELTA_UP","DELTA_DOWN","StyledDeltaBars","DailyDeltaChartWidget","_ref9","data","upMax","downMax","yTicksUp","yTicksDown","upFrac","zeroTop","tickTop","below","point","up","bottom","down","StyledLeaderboard","LeaderboardWidget","_ref0","rows","Header2","row","percentOfMax","ProgressBar","billableShare","StyledStackedChart","StackedBarChartWidget","_ref1","total","seriesLabels","_ref1$barWidth","barWidth","_ref1$height","column","segments","_seriesLabels$index"],"sources":["../../../../src/presentation/shared/dashboardWidgets.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { LG, MD, SM } from \"./tokens\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InfoSmallIcon, SortListIcon } from \"../../components/Icons\";\nimport { ProgressBar } from \"../../components/ProgressBar\";\nimport { ProgressRing } from \"../../components/ProgressRing\";\nimport { Select } from \"../../components/Select\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { Body1, Body2, Header2, Title2 } from \"../../components/Typography\";\nimport { ValueButton } from \"../../components/ValueButton\";\nimport { colors } from \"../../utils/colors\";\n\n/*\n Reusable dashboard widgets for the Presentation mock-ups.\n\n These mirror the REAL report widgets in new-activecollab-front\n (src/pages/Reports/Widgets/*): Widget.js (the stat card), WidgetList.js\n (the striped ranked list), ProjectsOverview.js (accent-line sections +\n nested ProgressRings), DailyOpenTasksWidget.js (area line chart),\n DailyCreatedAndCompletedTasksWidget.js (daily +/- bars),\n LeaderboardWidget.js and TotalTrackedHoursChart.js (stacked columns).\n Dimensions, type sizes and colours are copied from that code so any\n dashboard mock built from these reads exactly like the app; the charts are\n plain SVG/CSS here (no chart.js in this Storybook).\n\n Data colours (chart palette, tick grey #89898e) are hardcoded on purpose —\n they are data, not theme — while all structure uses var(--…) tokens.\n*/\n\n/* Raw (non-Typography) text needs an explicit font — no global reset here. */\nconst FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Roboto\", \"Helvetica Neue\", Arial, sans-serif';\n\n/** Axis-tick grey, same literal the real chart widgets use. */\nconst TICK_COLOR = \"#89898e\";\n\n/** Stacked-chart series palette, same order as TotalTrackedHoursChart.js. */\nexport const CHART_SERIES_COLORS: string[] = [\n colors.blueSky.color,\n colors.coral.color,\n colors.greenPale.color,\n colors.orange.color,\n colors.purple.color,\n colors.pink.color,\n];\n\n/** Ring/section colour pairs used by the app's Projects Overview widget. */\nexport const OVERVIEW_SECTION_COLORS = {\n tasks: { color: colors.purple.color, track: \"rgba(190, 172, 249, 0.2)\" },\n time: { color: colors.blueSky.color, track: \"rgba(163, 205, 255, 0.2)\" },\n budget: { color: colors.greenPale.color, track: \"rgba(195, 231, 153, 0.2)\" },\n};\n\n/* ------------------------------------------------------------------ */\n/* Widget grid (mirrors AssignmentsDashboardGrid.js) */\n/* ------------------------------------------------------------------ */\n\n/*\n The dashboard grid: 24px gaps, 192px rows, 1/2/3/4 columns by breakpoint.\n Put DS <Paper type=\"paper-2\"> cells directly inside and size them with:\n .cell-overview — the big overview card (2×2 on desktop)\n .cell-tall — a 1×2 card (ranked lists)\n .cell-wide — a full-width row (charts)\n Plain cells are 1×1 (stat cards).\n*/\nexport const WidgetGrid = styled.div`\n display: grid;\n gap: 24px;\n width: 100%;\n max-width: 1440px;\n margin: 0 auto 32px;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n grid-auto-rows: 192px;\n\n @media (min-width: ${SM}) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n @media (min-width: ${MD}) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n @media (min-width: ${LG}) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n\n > .cell-overview {\n grid-row: span 3;\n\n @media (min-width: ${SM}) {\n grid-row: span 2;\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 2;\n }\n }\n\n > .cell-tall {\n grid-row: span 2;\n }\n\n > .cell-wide {\n @media (min-width: ${SM}) {\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 4;\n }\n }\n`;\n\nWidgetGrid.displayName = \"WidgetGrid\";\n\n/* ------------------------------------------------------------------ */\n/* Group-by picker (mirrors WidgetTarget in Widget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetGroupByProps {\n options: { id: string; name: string }[];\n /** Initially selected option id (the mock keeps its own state after that). */\n initial?: string;\n onChange?: (id: string) => void;\n}\n\n/** The sort-lines icon button + radio list every widget corner uses. */\nexport const WidgetGroupBy = ({\n options,\n initial,\n onChange,\n}: WidgetGroupByProps): ReactElement => {\n const [selected, setSelected] = useState(initial ?? options[0]?.id);\n const [open, setOpen] = useState(false);\n return (\n <Select\n options={options}\n selected={selected}\n onChange={(value) => {\n setSelected(String(value));\n onChange?.(String(value));\n }}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={\n <IconButton type=\"button\" variant=\"text gray\" active={open}>\n <SortListIcon fill=\"var(--color-theme-800)\" />\n </IconButton>\n }\n />\n );\n};\n\nWidgetGroupBy.displayName = \"WidgetGroupBy\";\n\n/* ------------------------------------------------------------------ */\n/* Time-period picker (the completed widgets' shared control) */\n/* ------------------------------------------------------------------ */\n\n/** The app's completed-widget periods (CompletedWidgetTarget radio list). */\nexport const PERIOD_OPTIONS = [\n { id: \"this_week\", name: \"This Week\" },\n { id: \"last_week\", name: \"Last Week\" },\n { id: \"this_month\", name: \"This Month\" },\n { id: \"last_month\", name: \"Last Month\" },\n { id: \"this_quarter\", name: \"This Quarter\" },\n { id: \"last_quarter\", name: \"Last Quarter\" },\n { id: \"this_year\", name: \"This Year\" },\n { id: \"last_year\", name: \"Last Year\" },\n];\n\nexport interface PeriodPickerProps {\n selected: string;\n onChange: (id: string) => void;\n}\n\n/** One labelled period control (ValueButton + radio list) that a whole\n * section of period-scoped widgets can share. */\nexport const PeriodPicker = ({\n selected,\n onChange,\n}: PeriodPickerProps): ReactElement => {\n const [open, setOpen] = useState(false);\n const value =\n PERIOD_OPTIONS.find((option) => option.id === selected)?.name ?? \"\";\n return (\n <Select\n options={PERIOD_OPTIONS}\n selected={selected}\n onChange={(next) => onChange(String(next))}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={<ValueButton active={open} label=\"Period\" value={value} />}\n />\n );\n};\n\nPeriodPicker.displayName = \"PeriodPicker\";\n\n/* ------------------------------------------------------------------ */\n/* Stat widget (mirrors Widget.js) */\n/* ------------------------------------------------------------------ */\n\nconst StyledWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .widget-top {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n /* corner adornments: a target flag and/or the group-by picker together */\n .widget-corner {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n }\n\n /* the 52px total (tw-text-[52px] tw-h-14 in the app) */\n .widget-total {\n display: flex;\n width: 100%;\n height: 56px;\n margin-bottom: 8px;\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .widget-total.alert {\n color: var(--red-alert);\n }\n\n /* green treatment (e.g. positive profit), same green the app uses */\n .widget-total.success {\n color: ${colors.greenSuccess.color};\n }\n\n /* muted unit beside the total (\"H\", \"USD\"), like the Invoices tab cards */\n .widget-total .widget-unit {\n align-self: center;\n margin-left: 10px;\n font-size: 20px;\n font-weight: 600;\n line-height: 1;\n color: var(--color-theme-600);\n }\n\n .widget-title {\n margin-bottom: 8px;\n }\n\n .widget-desc {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n height: 40px;\n margin-bottom: 8px;\n }\n\n .widget-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n }\n`;\n\nexport interface StatWidgetProps {\n /** Preformatted total (\"135\", \"1.4K\"). */\n value: string;\n /** Muted unit beside the total (\"H\", \"USD\"). */\n unit?: string;\n title: string;\n description: string;\n linkText?: string;\n /** Red treatment (overdue / underestimated above zero). */\n alert?: boolean;\n /** Green treatment (e.g. positive profit). */\n success?: boolean;\n /** Group-by picker in the top-right corner. */\n groupBy?: WidgetGroupByProps;\n /** Alternative top-right adornment (e.g. a period icon). */\n cornerControl?: ReactNode;\n /** Extra content between description and link (e.g. WidgetRankedList). */\n children?: ReactNode;\n}\n\nexport const StatWidget = ({\n value,\n unit,\n title,\n description,\n linkText,\n alert,\n success,\n groupBy,\n cornerControl,\n children,\n}: StatWidgetProps): ReactElement => (\n <StyledWidget>\n <div className=\"widget-top\">\n <span\n className={\n alert\n ? \"widget-total alert\"\n : success\n ? \"widget-total success\"\n : \"widget-total\"\n }\n >\n {value}\n {unit ? <span className=\"widget-unit\">{unit}</span> : null}\n </span>\n {cornerControl || groupBy ? (\n <span className=\"widget-corner\">\n {cornerControl}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n ) : null}\n </div>\n <Body1\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n overflow=\"truncate\"\n whitespace=\"no-wrap\"\n className=\"widget-title\"\n >\n {title}\n </Body1>\n <Body2 color=\"tertiary\" className=\"widget-desc\">\n {description}\n </Body2>\n {children}\n {linkText ? (\n <a className=\"widget-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </StyledWidget>\n);\n\nStatWidget.displayName = \"StatWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Ranked list (mirrors WidgetList.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface RankedListItem {\n name: string;\n value: string;\n}\n\nconst StyledRankedList = styled.div`\n height: 216px;\n overflow-y: auto;\n padding: 4px 0;\n\n .ranked-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 4px;\n height: 24px;\n padding: 0 6px;\n margin-bottom: 4px;\n border-radius: 2px;\n box-sizing: border-box;\n }\n\n .ranked-row:nth-child(odd) {\n background-color: var(--color-theme-200);\n }\n\n .ranked-name {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .ranked-value {\n flex-shrink: 0;\n }\n`;\n\n/** The striped name/count rows inside a tall stat widget. */\nexport const WidgetRankedList = ({\n items,\n}: {\n items: RankedListItem[];\n}): ReactElement => (\n <StyledRankedList>\n {items.map((item) => (\n <div className=\"ranked-row\" key={item.name}>\n <Body2 color=\"secondary\" className=\"ranked-name\">\n {item.name}\n </Body2>\n <Body2 color=\"secondary\" className=\"ranked-value\">\n {item.value}\n </Body2>\n </div>\n ))}\n </StyledRankedList>\n);\n\nWidgetRankedList.displayName = \"WidgetRankedList\";\n\n/* ------------------------------------------------------------------ */\n/* Overview widget (mirrors ProjectsOverview.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface OverviewSectionData {\n id: string;\n /** Preformatted pair (\"956 of 1.4K\", \"1.2K / 8.3K\"). */\n value: string;\n /** Muted unit after the value (\"Hours\", \"USD\"). */\n unit?: string;\n description: string;\n /** Info-icon tooltip next to the description. */\n explainer?: string;\n linkText: string;\n /** Accent-line + ring colour (a data colour). */\n color: string;\n /** Ring track colour (the translucent tint of `color`). */\n trackColor: string;\n /** 0–100+; above 100 the section and its ring go red. */\n progress: number;\n}\n\nexport interface OverviewWidgetProps {\n title: string;\n subtitle: string;\n /** Up to three sections, outer ring first. */\n sections: OverviewSectionData[];\n /** Top-right control (e.g. the currency picker). */\n headerRight?: ReactNode;\n}\n\nconst RING_RADII = [121, 93, 63];\nconst RING_STROKE = 20;\n\nconst StyledOverview = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .overview-head {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n .overview-body {\n display: flex;\n flex-direction: column-reverse;\n justify-content: space-between;\n gap: 4px;\n height: 100%;\n\n @media (min-width: ${SM}) {\n flex-direction: row;\n margin-top: 48px;\n }\n }\n\n .overview-sections {\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n height: fit-content;\n\n @media (min-width: ${SM}) {\n height: 100%;\n }\n }\n\n .overview-section {\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n\n .overview-line {\n width: 2px;\n margin-right: 12px;\n align-self: stretch;\n flex-shrink: 0;\n }\n\n .overview-value {\n height: 28px;\n margin-bottom: 2px;\n }\n\n .overview-value-row {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n }\n\n .overview-desc {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .overview-desc svg {\n cursor: help;\n flex-shrink: 0;\n }\n\n .overview-link {\n display: inline-flex;\n margin-top: 4px;\n cursor: pointer;\n text-decoration: none;\n }\n\n .overview-rings {\n display: flex;\n align-self: center;\n\n @media (min-width: ${SM}) {\n align-self: flex-end;\n }\n }\n\n /* on small screens shrink the rings instead of overflowing */\n @media (max-width: 639px) {\n .overview-rings {\n transform: scale(0.6);\n transform-origin: center;\n margin: -48px 0;\n }\n }\n`;\n\nconst ringColor = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n if (section.progress > 100) {\n return active ? \"var(--red-alert)\" : \"rgba(237, 97, 97, 0.25)\";\n }\n return active ? section.color : \"var(--color-theme-200)\";\n};\n\nconst ringTrack = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n return active ? section.trackColor : \"var(--color-theme-200)\";\n};\n\nconst OverviewSection = ({\n section,\n onHover,\n}: {\n section: OverviewSectionData;\n onHover: (id: string | null) => void;\n}): ReactElement => {\n const alert = section.progress > 100;\n return (\n <div\n className=\"overview-section\"\n onMouseEnter={() => onHover(section.id)}\n onMouseLeave={() => onHover(null)}\n >\n <span\n className=\"overview-line\"\n style={{\n backgroundColor: alert ? \"var(--red-alert)\" : section.color,\n }}\n />\n <div>\n <div className=\"overview-value\">\n <Title2\n lineHeight=\"tight\"\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n >\n <span className=\"overview-value-row\">\n {section.value}\n {section.unit ? (\n <Body2 color=\"tertiary\">{section.unit}</Body2>\n ) : null}\n </span>\n </Title2>\n </div>\n <div className=\"overview-desc\">\n <Body2 color=\"tertiary\">{section.description}</Body2>\n {section.explainer ? (\n <Tooltip title={section.explainer}>\n <InfoSmallIcon />\n </Tooltip>\n ) : null}\n </div>\n <a className=\"overview-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {section.linkText}\n </Body2>\n </a>\n </div>\n </div>\n );\n};\n\n/** The big overview card: accent-line metric sections + nested rings.\n * Hovering a section highlights its ring and mutes the other rings,\n * exactly like the app's Projects Overview. */\nexport const OverviewWidget = ({\n title,\n subtitle,\n sections,\n headerRight,\n}: OverviewWidgetProps): ReactElement => {\n const [hovered, setHovered] = useState<string | null>(null);\n\n const nestRings = (index: number): ReactElement | null => {\n const section = sections[index];\n if (!section) {\n return null;\n }\n return (\n <ProgressRing\n roundStroke\n progress={section.progress}\n stroke={RING_STROKE}\n radius={RING_RADII[index]}\n progressColor={ringColor(section, hovered)}\n backgroundColor={ringTrack(section, hovered)}\n >\n {nestRings(index + 1)}\n </ProgressRing>\n );\n };\n\n return (\n <StyledOverview>\n <div className=\"overview-head\">\n <div>\n <Body1 weight=\"bold\">{title}</Body1>\n <Body2 color=\"secondary\">{subtitle}</Body2>\n </div>\n {headerRight}\n </div>\n <div className=\"overview-body\">\n <div className=\"overview-sections\">\n {sections.map((section) => (\n <OverviewSection\n key={section.id}\n section={section}\n onHover={setHovered}\n />\n ))}\n </div>\n <div className=\"overview-rings\">{nestRings(0)}</div>\n </div>\n </StyledOverview>\n );\n};\n\nOverviewWidget.displayName = \"OverviewWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Chart scaffolding shared by the chart widgets */\n/* ------------------------------------------------------------------ */\n\nconst PLOT_HEIGHT = 116;\n\nconst StyledChartWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px 0;\n box-sizing: border-box;\n overflow: hidden;\n\n .chart-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .chart-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n flex-shrink: 0;\n }\n\n .chart-row {\n display: flex;\n gap: 10px;\n }\n\n .chart-y-axis {\n position: relative;\n width: 30px;\n height: ${PLOT_HEIGHT}px;\n flex-shrink: 0;\n }\n\n .chart-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n white-space: nowrap;\n }\n\n .chart-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n height: ${PLOT_HEIGHT}px;\n }\n\n .chart-x-axis {\n display: flex;\n justify-content: space-between;\n margin-top: 6px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .chart-x-axis span {\n white-space: nowrap;\n }\n`;\n\nconst ChartHead = ({\n title,\n linkText,\n}: {\n title: string;\n linkText?: string;\n}): ReactElement => (\n <div className=\"chart-head\">\n <Body1 weight=\"bold\" overflow=\"truncate\" whitespace=\"no-wrap\">\n {title}\n </Body1>\n {linkText ? (\n <a className=\"chart-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </div>\n);\n\n/* ------------------------------------------------------------------ */\n/* Area line chart (mirrors DailyOpenTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Line + gradient fill colours from the real widget. */\nconst AREA_LINE = \"#A3CDFF\";\n\nexport interface AreaChartWidgetProps {\n title: string;\n linkText?: string;\n /** The series, one value per day. */\n points: number[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Y tick values; min/max define the scale. */\n yTicks: number[];\n}\n\n/** Sharp-edged line with a soft gradient below, like \"Number of Open Tasks\". */\nexport const AreaChartWidget = ({\n title,\n linkText,\n points,\n xLabels,\n yTicks,\n}: AreaChartWidgetProps): ReactElement => {\n const min = Math.min(...yTicks);\n const max = Math.max(...yTicks);\n const range = max - min || 1;\n const W = 1000;\n\n const toXY = (value: number, index: number): string => {\n const x = (index / Math.max(points.length - 1, 1)) * W;\n const y = ((max - value) / range) * PLOT_HEIGHT;\n return `${x.toFixed(1)},${y.toFixed(1)}`;\n };\n\n const linePoints = points.map(toXY).join(\" \");\n const areaPoints = `0,${PLOT_HEIGHT} ${linePoints} ${W},${PLOT_HEIGHT}`;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"chart-y-tick\"\n style={{ top: `${((max - tick) / range) * PLOT_HEIGHT}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <svg\n width=\"100%\"\n height={PLOT_HEIGHT}\n viewBox={`0 0 ${W} ${PLOT_HEIGHT}`}\n preserveAspectRatio=\"none\"\n style={{ display: \"block\" }}\n >\n <defs>\n <linearGradient id=\"ac-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"rgba(163, 205, 255, 0.4)\" />\n <stop offset=\"100%\" stopColor=\"rgba(163, 205, 255, 0)\" />\n </linearGradient>\n </defs>\n <polygon points={areaPoints} fill=\"url(#ac-area-gradient)\" />\n <polyline\n points={linePoints}\n fill=\"none\"\n stroke={AREA_LINE}\n strokeWidth={2.5}\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nAreaChartWidget.displayName = \"AreaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Daily +/- bars (mirrors DailyCreatedAndCompletedTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Bar colours from the real widget: new above, completed below. */\nconst DELTA_UP = \"#A3CDFF\";\nconst DELTA_DOWN = \"#FF9C9C\";\n\nexport interface DailyDeltaPoint {\n /** Count above the axis (new tasks). */\n up: number;\n /** Count below the axis (completed tasks). */\n down: number;\n}\n\nexport interface DailyDeltaChartWidgetProps {\n title: string;\n linkText?: string;\n data: DailyDeltaPoint[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Scale above the axis. */\n upMax: number;\n /** Scale below the axis (can differ — the axis sits off-centre). */\n downMax: number;\n /** Tick values above the axis (0 and below-axis ticks are derived). */\n yTicksUp: number[];\n /** Tick values below the axis. */\n yTicksDown: number[];\n}\n\nconst StyledDeltaBars = styled.div`\n display: flex;\n height: 100%;\n\n .delta-col {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .delta-bar {\n position: absolute;\n left: 50%;\n width: 4px;\n max-width: 80%;\n transform: translateX(-50%);\n }\n\n .delta-zero {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: ${TICK_COLOR};\n }\n`;\n\n/** Thin daily bars above/below a zero line, like \"New vs Completed Tasks\". */\nexport const DailyDeltaChartWidget = ({\n title,\n linkText,\n data,\n xLabels,\n upMax,\n downMax,\n yTicksUp,\n yTicksDown,\n}: DailyDeltaChartWidgetProps): ReactElement => {\n const upFrac = upMax / (upMax + downMax);\n const zeroTop = upFrac * PLOT_HEIGHT;\n\n const tickTop = (value: number, below: boolean): number =>\n below\n ? zeroTop + (value / downMax) * (PLOT_HEIGHT - zeroTop)\n : zeroTop - (value / upMax) * zeroTop;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicksUp.map((tick) => (\n <span\n key={`up-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, false)}px` }}\n >\n {tick}\n </span>\n ))}\n <span className=\"chart-y-tick\" style={{ top: `${zeroTop}px` }}>\n 0\n </span>\n {yTicksDown.map((tick) => (\n <span\n key={`down-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, true)}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <StyledDeltaBars>\n <span className=\"delta-zero\" style={{ top: `${zeroTop}px` }} />\n {data.map((point, index) => (\n <span className=\"delta-col\" key={index}>\n {point.up > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_UP,\n bottom: `${PLOT_HEIGHT - zeroTop}px`,\n height: `${(point.up / upMax) * zeroTop}px`,\n }}\n />\n ) : null}\n {point.down > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_DOWN,\n top: `${zeroTop + 1}px`,\n height: `${\n (point.down / downMax) * (PLOT_HEIGHT - zeroTop)\n }px`,\n }}\n />\n ) : null}\n </span>\n ))}\n </StyledDeltaBars>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nDailyDeltaChartWidget.displayName = \"DailyDeltaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Leaderboard (mirrors LeaderboardWidget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface LeaderboardRowData {\n label: string;\n /** Preformatted value on the right (\"25:00\"). */\n value: string;\n /** Bar length as % of the longest row (100 for the leader). */\n percentOfMax: number;\n /** Billable share 0–100 — fills the green part of the bar. */\n billableShare: number;\n}\n\nexport interface LeaderboardWidgetProps {\n title: string;\n description: string;\n rows: LeaderboardRowData[];\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledLeaderboard = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .lb-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .lb-desc {\n margin-bottom: 12px;\n }\n\n .lb-sep {\n border-bottom: 1px solid var(--border-primary);\n margin-bottom: 12px;\n }\n\n .lb-rows {\n max-height: 288px;\n overflow-y: auto;\n }\n\n .lb-row {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 32px;\n margin-bottom: 4px;\n }\n\n .lb-label {\n width: 208px;\n max-width: 40%;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n }\n\n .lb-bar {\n flex: 1;\n min-width: 0;\n height: 8px;\n }\n\n .lb-bar-inner {\n min-width: 8px;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .lb-value {\n width: 80px;\n flex-shrink: 0;\n text-align: right;\n }\n`;\n\n/** Ranked bars: label, billable/non-billable bar, value — like Time's\n * Leaderboard. Bar length = share of the leader; green = billable part. */\nexport const LeaderboardWidget = ({\n title,\n description,\n rows,\n groupBy,\n}: LeaderboardWidgetProps): ReactElement => (\n <StyledLeaderboard>\n <div className=\"lb-head\">\n <Header2>{title}</Header2>\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </div>\n <Body2 color=\"tertiary\" className=\"lb-desc\">\n {description}\n </Body2>\n <div className=\"lb-sep\" />\n <div className=\"lb-rows\">\n {rows.map((row) => (\n <div className=\"lb-row\" key={row.label}>\n <span className=\"lb-label\">\n <Body2 color=\"theme-primary\">{row.label}</Body2>\n </span>\n <span className=\"lb-bar\">\n <span\n className=\"lb-bar-inner\"\n style={{ width: `${row.percentOfMax}%`, display: \"block\" }}\n >\n <ProgressBar\n progress={row.billableShare}\n stroke={8}\n progressColor={colors.greenSuccess.color}\n />\n </span>\n </span>\n <span className=\"lb-value\">\n <Body2 color=\"secondary\">{row.value}</Body2>\n </span>\n </div>\n ))}\n </div>\n </StyledLeaderboard>\n);\n\nLeaderboardWidget.displayName = \"LeaderboardWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Stacked columns (mirrors TotalTrackedHoursChart.js bar mode) */\n/* ------------------------------------------------------------------ */\n\nexport interface StackedBarColumn {\n label: string;\n /** One value per series, bottom segment first (palette order). */\n segments: number[];\n}\n\nexport interface StackedBarChartWidgetProps {\n title?: string;\n /** Preformatted big total shown top-right (\"318:11\"). */\n total?: string;\n data: StackedBarColumn[];\n /** Series names for the segment tooltips, palette order. */\n seriesLabels: string[];\n /** Y tick values; the max defines the scale. */\n yTicks: number[];\n /** Column width in px — the real charts are narrow (default 28). */\n barWidth?: number;\n /** Plot height in px (default 220 — this widget is usually taller). */\n height?: number;\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledStackedChart = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .sb-head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .sb-total-wrap {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-left: auto;\n }\n\n .sb-total {\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .sb-row {\n display: flex;\n gap: 10px;\n }\n\n .sb-y-axis {\n position: relative;\n width: 30px;\n flex-shrink: 0;\n }\n\n .sb-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .sb-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .sb-grid-line {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: var(--color-theme-300);\n }\n\n .sb-cols {\n position: relative;\n display: flex;\n justify-content: space-around;\n align-items: flex-end;\n height: 100%;\n }\n\n .sb-slot {\n display: flex;\n flex-direction: column-reverse;\n flex-shrink: 0;\n }\n\n .sb-labels {\n display: flex;\n justify-content: space-around;\n margin-top: 8px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n`;\n\n/** Narrow stacked time columns, like the Time dashboard's tracked-hours\n * chart. Segment order and palette follow the real chart. */\nexport const StackedBarChartWidget = ({\n title,\n total,\n data,\n seriesLabels,\n yTicks,\n barWidth = 28,\n height = 220,\n groupBy,\n}: StackedBarChartWidgetProps): ReactElement => {\n const max = Math.max(...yTicks) || 1;\n return (\n <StyledStackedChart>\n <div className=\"sb-head\">\n {title ? <Body1 weight=\"bold\">{title}</Body1> : null}\n <span className=\"sb-total-wrap\">\n {total ? <span className=\"sb-total\">{total}</span> : null}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n </div>\n <div className=\"sb-row\">\n <div className=\"sb-y-axis\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-y-tick\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"sb-plot\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-grid-line\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n />\n ))}\n <div className=\"sb-cols\">\n {data.map((column) => (\n <div\n className=\"sb-slot\"\n key={column.label}\n style={{ width: `${barWidth}px` }}\n >\n {column.segments.map((value, index) =>\n value > 0 ? (\n <Tooltip\n key={seriesLabels[index] ?? index}\n title={`${seriesLabels[index]}: ${value}h`}\n >\n <span\n style={{\n display: \"block\",\n height: `${(value / max) * height}px`,\n backgroundColor:\n CHART_SERIES_COLORS[\n index % CHART_SERIES_COLORS.length\n ],\n }}\n />\n </Tooltip>\n ) : null\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className=\"sb-labels\">\n {data.map((column) => (\n <span key={column.label}>{column.label}</span>\n ))}\n </div>\n </StyledStackedChart>\n );\n};\n\nStackedBarChartWidget.displayName = \"StackedBarChartWidget\";\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,28 +5,22 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.TabHeader = exports.ProjectPageHeader = exports.PageHeader = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
-
var _styledComponents =
|
|
9
|
-
var
|
|
8
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
|
+
var _ProjectOptionsMenu = require("./ProjectOptionsMenu");
|
|
10
10
|
var _RoundAvatar = require("./RoundAvatar");
|
|
11
11
|
var _tokens = require("./tokens");
|
|
12
|
-
var _WebhookLogsDialog = require("./WebhookLogsDialog");
|
|
13
|
-
var _Badge = require("../../components/Badge");
|
|
14
12
|
var _Button = require("../../components/Button");
|
|
15
13
|
var _GlobalAddButton = require("../../components/Button/GlobalAddButton");
|
|
16
|
-
var _CompleteCheckbox = require("../../components/CompleteCheckbox");
|
|
17
14
|
var _CounterButton = require("../../components/CounterButton");
|
|
18
|
-
var _Dialog = require("../../components/Dialog");
|
|
19
15
|
var _Header = require("../../components/Header");
|
|
20
16
|
var _IconButton = require("../../components/IconButton");
|
|
21
17
|
var _Icons = require("../../components/Icons");
|
|
22
|
-
var _List = require("../../components/List");
|
|
23
18
|
var _Menu = require("../../components/Menu");
|
|
24
19
|
var _Nav = require("../../components/Nav");
|
|
25
20
|
var _ProgressPie = require("../../components/ProgressPie");
|
|
26
|
-
var _ToastMessage = require("../../components/ToastMessage");
|
|
27
21
|
var _Tooltip = require("../../components/Tooltip");
|
|
28
|
-
var _Transitions = require("../../components/Transitions");
|
|
29
22
|
var _Typography = require("../../components/Typography");
|
|
23
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
30
24
|
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); }
|
|
31
25
|
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
32
26
|
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."); }
|
|
@@ -72,335 +66,6 @@ var StyledProjectHeaderChildren = _styledComponents.default.div.withConfig({
|
|
|
72
66
|
componentId: "sc-yf6o6n-1"
|
|
73
67
|
})(["display:flex;align-items:center;gap:8px;.project-progress{display:flex;align-items:center;margin-left:4px;}"]);
|
|
74
68
|
|
|
75
|
-
/* Project "..." options menu (Menu + List with leading-icon items). Two items
|
|
76
|
-
(Favorite, Subscribe) have a checkbox on the right. Clicks are no-ops. */
|
|
77
|
-
var StyledProjectMenu = _styledComponents.default.div.withConfig({
|
|
78
|
-
displayName: "headers__StyledProjectMenu",
|
|
79
|
-
componentId: "sc-yf6o6n-2"
|
|
80
|
-
})([".toggle-item{justify-content:space-between;}.toggle-item .opt-left{display:flex;align-items:center;min-width:0;}.toggle-item .opt-left svg{margin-right:8px;flex-shrink:0;}.toggle-item .c-complete-checkbox{width:16px;height:16px;border-radius:3px;align-self:center;flex-shrink:0;}.submenu-item{justify-content:space-between;}.submenu-item .repo-right{display:flex;align-items:center;gap:8px;flex-shrink:0;}.submenu-item .repo-right .c-badge{background-color:var(--color-theme-300);color:var(--color-theme-700);}.submenu-item .repo-caret{flex-shrink:0;fill:var(--color-theme-600);}.repo-row{min-width:0;}.repo-row > svg{flex-shrink:0;}.repo-name{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}"]);
|
|
81
|
-
|
|
82
|
-
/* The project "..." menu shares the Webhook Logs dialog's repository /
|
|
83
|
-
* connection universe, so a repository connected here is one that dialog can
|
|
84
|
-
* pre-filter by. `WebhookConnection` and `Connection` share a shape, and a
|
|
85
|
-
* `WebhookRepository`'s `path` maps onto a `Repository`'s `name`. */
|
|
86
|
-
var PROJECT_MENU_CONNECTIONS = _WebhookLogsDialog.WEBHOOK_CONNECTIONS;
|
|
87
|
-
var PROJECT_MENU_REPOSITORIES = _WebhookLogsDialog.WEBHOOK_REPOSITORIES.map(function (repo) {
|
|
88
|
-
return {
|
|
89
|
-
id: repo.id,
|
|
90
|
-
name: repo.path,
|
|
91
|
-
connectionId: repo.connectionId
|
|
92
|
-
};
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
/** Submenu row label for a connected repository: "path (Connection)". The
|
|
96
|
-
* service type is omitted because the leading provider icon already conveys
|
|
97
|
-
* it. */
|
|
98
|
-
var repositoryMenuLabel = function repositoryMenuLabel(repo) {
|
|
99
|
-
var connection = PROJECT_MENU_CONNECTIONS.find(function (c) {
|
|
100
|
-
return c.id === repo.connectionId;
|
|
101
|
-
});
|
|
102
|
-
return connection ? "".concat(repo.name, " (").concat(connection.name, ")") : repo.name;
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
/** Provider glyph for a connected repository: GitHub / GitLab for those
|
|
106
|
-
* services, and the generic Git mark for anything else (e.g. an upcoming
|
|
107
|
-
* Bitbucket connection). */
|
|
108
|
-
var repositoryIcon = function repositoryIcon(repo) {
|
|
109
|
-
var connection = PROJECT_MENU_CONNECTIONS.find(function (c) {
|
|
110
|
-
return c.id === repo.connectionId;
|
|
111
|
-
});
|
|
112
|
-
switch (connection === null || connection === void 0 ? void 0 : connection.service) {
|
|
113
|
-
case "github":
|
|
114
|
-
return _Icons.GitHubIcon;
|
|
115
|
-
case "gitlab":
|
|
116
|
-
return _Icons.GitLabIcon;
|
|
117
|
-
default:
|
|
118
|
-
return _Icons.GitIcon;
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
/** Width of the project "..." menu (matches the DS "normal" menu mode). */
|
|
123
|
-
var PROJECT_MENU_WIDTH = 260;
|
|
124
|
-
|
|
125
|
-
/* The menu drills in place (index → Repositories), so the paper must clip the
|
|
126
|
-
sliding panels and give them a positioning context. */
|
|
127
|
-
var ProjectMenuSliderStyle = (0, _styledComponents.createGlobalStyle)([".c-simple-menu__paper.project-options-menu{overflow:hidden;position:relative;}"]);
|
|
128
|
-
|
|
129
|
-
/* Toast anchor — fixed, upper-right corner (the toast slides down from the
|
|
130
|
-
top). The wrapper ignores pointer events so it never blocks the page; only
|
|
131
|
-
the toast itself is interactive. */
|
|
132
|
-
var StyledToastAnchor = _styledComponents.default.div.withConfig({
|
|
133
|
-
displayName: "headers__StyledToastAnchor",
|
|
134
|
-
componentId: "sc-yf6o6n-3"
|
|
135
|
-
})(["position:fixed;top:16px;right:16px;z-index:10000;pointer-events:none;.c-toast-message{pointer-events:auto;}"]);
|
|
136
|
-
/**
|
|
137
|
-
* The project "..." options menu. When the `source` module is loaded it gains
|
|
138
|
-
* a **Repositories** item that, instead of flying out to the side, **drills in
|
|
139
|
-
* within the same menu** (the pattern used across the app — see `Filter`): the
|
|
140
|
-
* index slides out to the left and the Repositories view (a back-arrow header,
|
|
141
|
-
* the connected repositories sorted by name, and a **Connect Repository**
|
|
142
|
-
* action) slides in. Connecting adds a repository to the list; clicking one
|
|
143
|
-
* would, in production, open it in a new tab (surfaced here via a dialog).
|
|
144
|
-
*/
|
|
145
|
-
var ProjectOptionsMenu = function ProjectOptionsMenu(_ref2) {
|
|
146
|
-
var _ref2$sourceModuleLoa = _ref2.sourceModuleLoaded,
|
|
147
|
-
sourceModuleLoaded = _ref2$sourceModuleLoa === void 0 ? false : _ref2$sourceModuleLoa,
|
|
148
|
-
_ref2$initialConnecte = _ref2.initialConnectedRepositories,
|
|
149
|
-
initialConnectedRepositories = _ref2$initialConnecte === void 0 ? [] : _ref2$initialConnecte,
|
|
150
|
-
_ref2$canManageProjec = _ref2.canManageProjectRepositories,
|
|
151
|
-
canManageProjectRepositories = _ref2$canManageProjec === void 0 ? true : _ref2$canManageProjec;
|
|
152
|
-
var _useState = (0, _react.useState)(false),
|
|
153
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
154
|
-
open = _useState2[0],
|
|
155
|
-
setOpen = _useState2[1];
|
|
156
|
-
var _useState3 = (0, _react.useState)("index"),
|
|
157
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
158
|
-
view = _useState4[0],
|
|
159
|
-
setView = _useState4[1];
|
|
160
|
-
var _useState5 = (0, _react.useState)(false),
|
|
161
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
|
162
|
-
webhookLogsOpen = _useState6[0],
|
|
163
|
-
setWebhookLogsOpen = _useState6[1];
|
|
164
|
-
var _useState7 = (0, _react.useState)(true),
|
|
165
|
-
_useState8 = _slicedToArray(_useState7, 2),
|
|
166
|
-
isLeft = _useState8[0],
|
|
167
|
-
setIsLeft = _useState8[1];
|
|
168
|
-
var _useState9 = (0, _react.useState)(0),
|
|
169
|
-
_useState0 = _slicedToArray(_useState9, 2),
|
|
170
|
-
height = _useState0[0],
|
|
171
|
-
setHeight = _useState0[1];
|
|
172
|
-
// Connected repositories drive the count badge on the Repositories item. In
|
|
173
|
-
// production this count comes from the project's `count_repositories` counter,
|
|
174
|
-
// kept current via pusher/websocket events, so the badge reflects repositories
|
|
175
|
-
// connected or disconnected by anyone — not just the current user's actions.
|
|
176
|
-
var _useState1 = (0, _react.useState)(initialConnectedRepositories),
|
|
177
|
-
_useState10 = _slicedToArray(_useState1, 2),
|
|
178
|
-
connectedRepos = _useState10[0],
|
|
179
|
-
setConnectedRepos = _useState10[1];
|
|
180
|
-
var _useState11 = (0, _react.useState)(false),
|
|
181
|
-
_useState12 = _slicedToArray(_useState11, 2),
|
|
182
|
-
connectOpen = _useState12[0],
|
|
183
|
-
setConnectOpen = _useState12[1];
|
|
184
|
-
var _useState13 = (0, _react.useState)(false),
|
|
185
|
-
_useState14 = _slicedToArray(_useState13, 2),
|
|
186
|
-
infoOpen = _useState14[0],
|
|
187
|
-
setInfoOpen = _useState14[1];
|
|
188
|
-
var _useState15 = (0, _react.useState)(false),
|
|
189
|
-
_useState16 = _slicedToArray(_useState15, 2),
|
|
190
|
-
toastOpen = _useState16[0],
|
|
191
|
-
setToastOpen = _useState16[1];
|
|
192
|
-
// Bumped on each connect so the toast remounts and its auto-hide timer
|
|
193
|
-
// restarts from the moment it is shown.
|
|
194
|
-
var _useState17 = (0, _react.useState)(0),
|
|
195
|
-
_useState18 = _slicedToArray(_useState17, 2),
|
|
196
|
-
toastKey = _useState18[0],
|
|
197
|
-
setToastKey = _useState18[1];
|
|
198
|
-
|
|
199
|
-
// Repositories still available to connect (not already on the project).
|
|
200
|
-
var connectableRepos = PROJECT_MENU_REPOSITORIES.filter(function (r) {
|
|
201
|
-
return !connectedRepos.some(function (c) {
|
|
202
|
-
return c.id === r.id;
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
// Connected repositories are listed in the submenu sorted by name.
|
|
207
|
-
var sortedRepos = [...connectedRepos].sort(function (a, b) {
|
|
208
|
-
return a.name.localeCompare(b.name);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
// Each view measures itself as it mounts so the paper can animate its height.
|
|
212
|
-
var measure = (0, _react.useCallback)(function (node) {
|
|
213
|
-
if (node) {
|
|
214
|
-
setHeight(node.offsetHeight);
|
|
215
|
-
}
|
|
216
|
-
}, []);
|
|
217
|
-
var goToRepositories = function goToRepositories() {
|
|
218
|
-
setView("repositories");
|
|
219
|
-
setIsLeft(true);
|
|
220
|
-
};
|
|
221
|
-
var backToIndex = function backToIndex() {
|
|
222
|
-
setView("index");
|
|
223
|
-
setIsLeft(false);
|
|
224
|
-
};
|
|
225
|
-
var handleClose = function handleClose() {
|
|
226
|
-
setOpen(false);
|
|
227
|
-
// Reset to the index so the next open starts at the top level.
|
|
228
|
-
setView("index");
|
|
229
|
-
setIsLeft(true);
|
|
230
|
-
};
|
|
231
|
-
var handleConnected = function handleConnected(repo) {
|
|
232
|
-
setConnectedRepos(function (prev) {
|
|
233
|
-
return prev.some(function (r) {
|
|
234
|
-
return r.id === repo.id;
|
|
235
|
-
}) ? prev : [...prev, repo];
|
|
236
|
-
});
|
|
237
|
-
setToastOpen(true);
|
|
238
|
-
setToastKey(function (k) {
|
|
239
|
-
return k + 1;
|
|
240
|
-
});
|
|
241
|
-
};
|
|
242
|
-
var handleConnect = function handleConnect() {
|
|
243
|
-
handleClose();
|
|
244
|
-
setConnectOpen(true);
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
// In production this closes the menu and opens the repository in a new tab;
|
|
248
|
-
// in the mock we surface that behaviour in a small dialog instead.
|
|
249
|
-
var handleOpenRepository = function handleOpenRepository() {
|
|
250
|
-
handleClose();
|
|
251
|
-
setInfoOpen(true);
|
|
252
|
-
};
|
|
253
|
-
var handleOpenWebhookLogs = function handleOpenWebhookLogs() {
|
|
254
|
-
handleClose();
|
|
255
|
-
setWebhookLogsOpen(true);
|
|
256
|
-
};
|
|
257
|
-
var indexView = /*#__PURE__*/_react.default.createElement(StyledProjectMenu, null, /*#__PURE__*/_react.default.createElement(_List.List, {
|
|
258
|
-
style: {
|
|
259
|
-
padding: "8px 0"
|
|
260
|
-
},
|
|
261
|
-
tabIndex: -1
|
|
262
|
-
}, /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.EditIcon, null), "Edit"), /*#__PURE__*/_react.default.createElement(_List.ListItem, {
|
|
263
|
-
className: "toggle-item"
|
|
264
|
-
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
265
|
-
className: "opt-left"
|
|
266
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.StarIcon, null), "Mark as Favorite"), /*#__PURE__*/_react.default.createElement(_CompleteCheckbox.CompleteCheckbox, {
|
|
267
|
-
primary: true,
|
|
268
|
-
completed: true
|
|
269
|
-
})), /*#__PURE__*/_react.default.createElement(_List.ListItem, {
|
|
270
|
-
className: "toggle-item"
|
|
271
|
-
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
272
|
-
className: "opt-left"
|
|
273
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.NotificationBellIcon, null), "Subscribe to Everything"), /*#__PURE__*/_react.default.createElement(_CompleteCheckbox.CompleteCheckbox, {
|
|
274
|
-
primary: true,
|
|
275
|
-
completed: false
|
|
276
|
-
})), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.LabelsIcon, null), "Manage Task Labels"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.InsertLinkIcon, null), "Copy Link"), /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.CheckboxBlankTogglerIcon, null), "Complete"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.DownloadIcon, null), "Export"), sourceModuleLoaded ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, {
|
|
277
|
-
className: "toggle-item submenu-item",
|
|
278
|
-
onClick: goToRepositories
|
|
279
|
-
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
280
|
-
className: "opt-left"
|
|
281
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.GitRepositoryIcon, null), "Repositories"), /*#__PURE__*/_react.default.createElement("span", {
|
|
282
|
-
className: "repo-right"
|
|
283
|
-
}, connectedRepos.length > 0 ? /*#__PURE__*/_react.default.createElement(_Badge.Badge, {
|
|
284
|
-
isStandalone: true,
|
|
285
|
-
dimension: 16,
|
|
286
|
-
value: connectedRepos.length
|
|
287
|
-
}) : null, /*#__PURE__*/_react.default.createElement(_Icons.CaretRightIcon, {
|
|
288
|
-
className: "repo-caret",
|
|
289
|
-
width: 16,
|
|
290
|
-
height: 16
|
|
291
|
-
})))) : null, /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.DuplicateIcon, null), "Duplicate"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.ProjectTemplateIcon, null), "Apply Template"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.ProjectTemplateConvertIcon, null), "Convert to Template"), /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.TrashIcon, null), "Delete")));
|
|
292
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(ProjectMenuSliderStyle, null), /*#__PURE__*/_react.default.createElement(_Menu.Menu, {
|
|
293
|
-
open: open,
|
|
294
|
-
onOpen: function onOpen() {
|
|
295
|
-
return setOpen(true);
|
|
296
|
-
},
|
|
297
|
-
onClose: handleClose,
|
|
298
|
-
position: "bottom-end",
|
|
299
|
-
menuClassName: sourceModuleLoaded ? "project-options-menu" : undefined,
|
|
300
|
-
target: /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
|
|
301
|
-
type: "button",
|
|
302
|
-
variant: "text gray",
|
|
303
|
-
active: open
|
|
304
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.TreeDotsIcon, null))
|
|
305
|
-
}, sourceModuleLoaded ? /*#__PURE__*/_react.default.createElement(_Transitions.ResizeTransition, {
|
|
306
|
-
in: true,
|
|
307
|
-
style: {
|
|
308
|
-
height,
|
|
309
|
-
width: PROJECT_MENU_WIDTH
|
|
310
|
-
}
|
|
311
|
-
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
312
|
-
style: {
|
|
313
|
-
position: "relative",
|
|
314
|
-
overflow: "hidden"
|
|
315
|
-
}
|
|
316
|
-
}, /*#__PURE__*/_react.default.createElement(_Transitions.SlideLeftRightTransition, {
|
|
317
|
-
in: view === "index",
|
|
318
|
-
direction: isLeft ? "left" : "right"
|
|
319
|
-
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
320
|
-
ref: measure,
|
|
321
|
-
style: {
|
|
322
|
-
width: PROJECT_MENU_WIDTH
|
|
323
|
-
}
|
|
324
|
-
}, indexView)), /*#__PURE__*/_react.default.createElement(_Transitions.SlideLeftRightTransition, {
|
|
325
|
-
in: view === "repositories",
|
|
326
|
-
direction: isLeft ? "left" : "right"
|
|
327
|
-
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
328
|
-
ref: measure,
|
|
329
|
-
style: {
|
|
330
|
-
width: PROJECT_MENU_WIDTH
|
|
331
|
-
}
|
|
332
|
-
}, /*#__PURE__*/_react.default.createElement(_Menu.MenuHeader, {
|
|
333
|
-
title: "Repositories",
|
|
334
|
-
leftElement: /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
|
|
335
|
-
type: "button",
|
|
336
|
-
variant: "text gray",
|
|
337
|
-
size: "small",
|
|
338
|
-
onClick: backToIndex,
|
|
339
|
-
"aria-label": "Back"
|
|
340
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.ArrowLeftIcon, null))
|
|
341
|
-
}), /*#__PURE__*/_react.default.createElement(StyledProjectMenu, null, /*#__PURE__*/_react.default.createElement(_List.List, {
|
|
342
|
-
style: {
|
|
343
|
-
padding: "8px 0"
|
|
344
|
-
},
|
|
345
|
-
tabIndex: -1
|
|
346
|
-
}, sortedRepos.map(function (repo) {
|
|
347
|
-
var RepoIcon = repositoryIcon(repo);
|
|
348
|
-
return /*#__PURE__*/_react.default.createElement(_List.ListItem, {
|
|
349
|
-
key: repo.id,
|
|
350
|
-
className: "repo-row",
|
|
351
|
-
onClick: function onClick() {
|
|
352
|
-
return handleOpenRepository();
|
|
353
|
-
}
|
|
354
|
-
}, /*#__PURE__*/_react.default.createElement(RepoIcon, null), /*#__PURE__*/_react.default.createElement("span", {
|
|
355
|
-
className: "repo-name"
|
|
356
|
-
}, repositoryMenuLabel(repo)));
|
|
357
|
-
}), sortedRepos.length > 0 ? /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null) : null, sortedRepos.length > 0 && canManageProjectRepositories ? /*#__PURE__*/_react.default.createElement(_List.ListItem, {
|
|
358
|
-
onClick: handleOpenWebhookLogs
|
|
359
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.AccessLogIcon, null), "Webhook Logs") : null, /*#__PURE__*/_react.default.createElement(_List.ListItem, {
|
|
360
|
-
onClick: handleConnect
|
|
361
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.GitRepositoryConnectIcon, null), "Connect Repository"))))))) : indexView), /*#__PURE__*/_react.default.createElement(_ConnectRepositoryDialog.ConnectRepositoryDialog, {
|
|
362
|
-
open: connectOpen,
|
|
363
|
-
onClose: function onClose() {
|
|
364
|
-
return setConnectOpen(false);
|
|
365
|
-
},
|
|
366
|
-
onConnect: handleConnected,
|
|
367
|
-
repositories: connectableRepos,
|
|
368
|
-
connections: PROJECT_MENU_CONNECTIONS
|
|
369
|
-
}), /*#__PURE__*/_react.default.createElement(_WebhookLogsDialog.WebhookLogsDialog, {
|
|
370
|
-
open: webhookLogsOpen,
|
|
371
|
-
onClose: function onClose() {
|
|
372
|
-
return setWebhookLogsOpen(false);
|
|
373
|
-
},
|
|
374
|
-
repositoryIds: sortedRepos.map(function (repo) {
|
|
375
|
-
return repo.id;
|
|
376
|
-
})
|
|
377
|
-
}), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog, {
|
|
378
|
-
open: infoOpen,
|
|
379
|
-
onClose: function onClose() {
|
|
380
|
-
return setInfoOpen(false);
|
|
381
|
-
},
|
|
382
|
-
enableBackgroundClick: true
|
|
383
|
-
}, /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.Title, null, "Open Repository"), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.ContentDivider, null), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.Content, null, /*#__PURE__*/_react.default.createElement(_Typography.Body2, null, "In production, this click would close the menu and open the repository in a new browser tab.")), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.ContentDivider, null), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.Actions, null, /*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
384
|
-
variant: "primary",
|
|
385
|
-
onClick: function onClick() {
|
|
386
|
-
return setInfoOpen(false);
|
|
387
|
-
}
|
|
388
|
-
}, "Got it"))), /*#__PURE__*/_react.default.createElement(StyledToastAnchor, null, /*#__PURE__*/_react.default.createElement(_Transitions.SlideFromTop, {
|
|
389
|
-
in: toastOpen
|
|
390
|
-
}, /*#__PURE__*/_react.default.createElement(_ToastMessage.ToastMessage, {
|
|
391
|
-
key: toastKey,
|
|
392
|
-
className: "c-toast-message",
|
|
393
|
-
type: "success",
|
|
394
|
-
text: "Repository connected.",
|
|
395
|
-
dismissible: true,
|
|
396
|
-
dropShadow: true,
|
|
397
|
-
timeout: 3000,
|
|
398
|
-
onClose: function onClose() {
|
|
399
|
-
return setToastOpen(false);
|
|
400
|
-
}
|
|
401
|
-
}))));
|
|
402
|
-
};
|
|
403
|
-
|
|
404
69
|
/* People popover (mirrors the project header People dropdown): a header row
|
|
405
70
|
("People" + add button), a "Members" section and a row per member. The
|
|
406
71
|
project leader shows a gold crown; other members reveal a "set as leader"
|
|
@@ -426,13 +91,13 @@ var PROJECT_MEMBERS = [{
|
|
|
426
91
|
}];
|
|
427
92
|
var StyledPeopleMenu = _styledComponents.default.div.withConfig({
|
|
428
93
|
displayName: "headers__StyledPeopleMenu",
|
|
429
|
-
componentId: "sc-yf6o6n-
|
|
94
|
+
componentId: "sc-yf6o6n-2"
|
|
430
95
|
})(["width:256px;.members-label{display:block;margin:8px 0;padding:0 16px;}.member-row{position:relative;display:flex;align-items:center;min-height:40px;margin:0 8px;padding:2px 8px;border-radius:4px;cursor:default;transition:background-color ", ";}.member-row:hover{background-color:var(--color-theme-200);}.member-row.leader::before{content:\"\";position:absolute;top:4px;bottom:4px;left:0;width:4px;border-radius:4px;background-color:", ";}.member-row.leader .member-avatar{outline:2px solid ", ";outline-offset:-2px;}.member-name{flex:1;margin-left:12px;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.member-right{display:flex;align-items:center;gap:2px;flex-shrink:0;margin-left:8px;}.leader-crown{flex-shrink:0;}.member-options{display:none;align-items:center;gap:2px;}.member-row:hover .member-options{display:flex;}"], _tokens.TRANSITION, LEADER_GOLD, LEADER_GOLD);
|
|
431
96
|
var PeoplePopover = function PeoplePopover() {
|
|
432
|
-
var
|
|
433
|
-
|
|
434
|
-
open =
|
|
435
|
-
setOpen =
|
|
97
|
+
var _useState = (0, _react.useState)(false),
|
|
98
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
99
|
+
open = _useState2[0],
|
|
100
|
+
setOpen = _useState2[1];
|
|
436
101
|
return /*#__PURE__*/_react.default.createElement(_Menu.Menu, {
|
|
437
102
|
open: open,
|
|
438
103
|
onOpen: function onOpen() {
|
|
@@ -496,13 +161,13 @@ var PeoplePopover = function PeoplePopover() {
|
|
|
496
161
|
})));
|
|
497
162
|
};
|
|
498
163
|
/** The project page header: back arrow, title, progress, info, people, options. */
|
|
499
|
-
var ProjectPageHeader = exports.ProjectPageHeader = function ProjectPageHeader(
|
|
500
|
-
var
|
|
501
|
-
title =
|
|
502
|
-
|
|
503
|
-
sourceModuleLoaded =
|
|
504
|
-
initialConnectedRepositories =
|
|
505
|
-
canManageProjectRepositories =
|
|
164
|
+
var ProjectPageHeader = exports.ProjectPageHeader = function ProjectPageHeader(_ref2) {
|
|
165
|
+
var _ref2$title = _ref2.title,
|
|
166
|
+
title = _ref2$title === void 0 ? "#131: Ime projekta" : _ref2$title,
|
|
167
|
+
_ref2$sourceModuleLoa = _ref2.sourceModuleLoaded,
|
|
168
|
+
sourceModuleLoaded = _ref2$sourceModuleLoa === void 0 ? false : _ref2$sourceModuleLoa,
|
|
169
|
+
initialConnectedRepositories = _ref2.initialConnectedRepositories,
|
|
170
|
+
canManageProjectRepositories = _ref2.canManageProjectRepositories;
|
|
506
171
|
return /*#__PURE__*/_react.default.createElement(StyledPageHeader, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
507
172
|
className: "page-header-left"
|
|
508
173
|
}, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
|
|
@@ -525,7 +190,7 @@ var ProjectPageHeader = exports.ProjectPageHeader = function ProjectPageHeader(_
|
|
|
525
190
|
title: "Project Info"
|
|
526
191
|
}, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
|
|
527
192
|
variant: "text gray"
|
|
528
|
-
}, /*#__PURE__*/_react.default.createElement(_Icons.InfoIcon, null))), /*#__PURE__*/_react.default.createElement(PeoplePopover, null), /*#__PURE__*/_react.default.createElement(ProjectOptionsMenu, {
|
|
193
|
+
}, /*#__PURE__*/_react.default.createElement(_Icons.InfoIcon, null))), /*#__PURE__*/_react.default.createElement(PeoplePopover, null), /*#__PURE__*/_react.default.createElement(_ProjectOptionsMenu.ProjectOptionsMenu, {
|
|
529
194
|
sourceModuleLoaded: sourceModuleLoaded,
|
|
530
195
|
initialConnectedRepositories: initialConnectedRepositories,
|
|
531
196
|
canManageProjectRepositories: canManageProjectRepositories
|
|
@@ -542,20 +207,20 @@ ProjectPageHeader.displayName = "ProjectPageHeader";
|
|
|
542
207
|
var NAV_TABS = ["Tasks", "Discussions", "Files", "Notes", "Activity"];
|
|
543
208
|
var StyledTabHeader = (0, _styledComponents.default)(_Header.Header).withConfig({
|
|
544
209
|
displayName: "headers__StyledTabHeader",
|
|
545
|
-
componentId: "sc-yf6o6n-
|
|
210
|
+
componentId: "sc-yf6o6n-3"
|
|
546
211
|
})(["justify-content:space-between;align-items:center;margin-bottom:16px;min-height:64px;flex-shrink:0;"]);
|
|
547
212
|
var StyledTabControls = _styledComponents.default.div.withConfig({
|
|
548
213
|
displayName: "headers__StyledTabControls",
|
|
549
|
-
componentId: "sc-yf6o6n-
|
|
214
|
+
componentId: "sc-yf6o6n-4"
|
|
550
215
|
})(["display:flex;align-items:center;flex-shrink:0;gap:4px;.vertical-separator{width:1px;height:24px;background-color:var(--color-theme-400);margin:0 8px;}.filter-button{display:flex;align-items:center;gap:6px;}"]);
|
|
551
216
|
/** The Tasks/Discussions/… tab bar plus the right-hand view toolbar. */
|
|
552
|
-
var TabHeader = exports.TabHeader = function TabHeader(
|
|
553
|
-
var
|
|
554
|
-
activeView =
|
|
555
|
-
var
|
|
556
|
-
|
|
557
|
-
active =
|
|
558
|
-
setActive =
|
|
217
|
+
var TabHeader = exports.TabHeader = function TabHeader(_ref3) {
|
|
218
|
+
var _ref3$activeView = _ref3.activeView,
|
|
219
|
+
activeView = _ref3$activeView === void 0 ? "list" : _ref3$activeView;
|
|
220
|
+
var _useState3 = (0, _react.useState)(0),
|
|
221
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
222
|
+
active = _useState4[0],
|
|
223
|
+
setActive = _useState4[1];
|
|
559
224
|
return /*#__PURE__*/_react.default.createElement(StyledTabHeader, null, /*#__PURE__*/_react.default.createElement(_Nav.Nav, {
|
|
560
225
|
onSelect: setActive
|
|
561
226
|
}, NAV_TABS.map(function (label, index) {
|