@activecollab/components 2.0.421 → 2.0.423
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/DrilldownMenu/DrilldownMenu.js +66 -0
- package/dist/cjs/components/DrilldownMenu/DrilldownMenu.js.map +1 -0
- package/dist/cjs/components/DrilldownMenu/DrilldownMenuContent.js +121 -0
- package/dist/cjs/components/DrilldownMenu/DrilldownMenuContent.js.map +1 -0
- package/dist/cjs/components/DrilldownMenu/MeasuredPane.js +61 -0
- package/dist/cjs/components/DrilldownMenu/MeasuredPane.js.map +1 -0
- package/dist/cjs/components/DrilldownMenu/Styles.js +30 -0
- package/dist/cjs/components/DrilldownMenu/Styles.js.map +1 -0
- package/dist/cjs/components/DrilldownMenu/SubmenuHeader.js +28 -0
- package/dist/cjs/components/DrilldownMenu/SubmenuHeader.js.map +1 -0
- package/dist/cjs/components/DrilldownMenu/index.js +50 -0
- package/dist/cjs/components/DrilldownMenu/index.js.map +1 -0
- package/dist/cjs/components/RadioCard/RadioCard.js +81 -0
- package/dist/cjs/components/RadioCard/RadioCard.js.map +1 -0
- package/dist/cjs/components/RadioCard/Styles.js +39 -0
- package/dist/cjs/components/RadioCard/Styles.js.map +1 -0
- package/dist/cjs/components/RadioCard/index.js +17 -0
- package/dist/cjs/components/RadioCard/index.js.map +1 -0
- package/dist/cjs/components/RadioGroup/RadioGroup.js +102 -0
- package/dist/cjs/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/cjs/components/RadioGroup/Styles.js +38 -0
- package/dist/cjs/components/RadioGroup/Styles.js.map +1 -0
- package/dist/cjs/components/RadioGroup/index.js +17 -0
- package/dist/cjs/components/RadioGroup/index.js.map +1 -0
- package/dist/cjs/components/index.js +33 -0
- package/dist/cjs/components/index.js.map +1 -1
- package/dist/cjs/presentation/shared/PortfolioOptionsMenu.js +74 -15
- package/dist/cjs/presentation/shared/PortfolioOptionsMenu.js.map +1 -1
- package/dist/cjs/presentation/shared/index.js +93 -1
- package/dist/cjs/presentation/shared/index.js.map +1 -1
- package/dist/cjs/presentation/shared/portfolioDetails.js +566 -0
- package/dist/cjs/presentation/shared/portfolioDetails.js.map +1 -0
- package/dist/cjs/utils/useStableId.js +33 -0
- package/dist/cjs/utils/useStableId.js.map +1 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenu.d.ts +24 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenu.d.ts.map +1 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenu.js +48 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenu.js.map +1 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenuContent.d.ts +38 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenuContent.d.ts.map +1 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenuContent.js +97 -0
- package/dist/esm/components/DrilldownMenu/DrilldownMenuContent.js.map +1 -0
- package/dist/esm/components/DrilldownMenu/MeasuredPane.d.ts +10 -0
- package/dist/esm/components/DrilldownMenu/MeasuredPane.d.ts.map +1 -0
- package/dist/esm/components/DrilldownMenu/MeasuredPane.js +44 -0
- package/dist/esm/components/DrilldownMenu/MeasuredPane.js.map +1 -0
- package/dist/esm/components/DrilldownMenu/Styles.d.ts +17 -0
- package/dist/esm/components/DrilldownMenu/Styles.d.ts.map +1 -0
- package/dist/esm/components/DrilldownMenu/Styles.js +23 -0
- package/dist/esm/components/DrilldownMenu/Styles.js.map +1 -0
- package/dist/esm/components/DrilldownMenu/SubmenuHeader.d.ts +11 -0
- package/dist/esm/components/DrilldownMenu/SubmenuHeader.d.ts.map +1 -0
- package/dist/esm/components/DrilldownMenu/SubmenuHeader.js +21 -0
- package/dist/esm/components/DrilldownMenu/SubmenuHeader.js.map +1 -0
- package/dist/esm/components/DrilldownMenu/index.d.ts +5 -0
- package/dist/esm/components/DrilldownMenu/index.d.ts.map +1 -0
- package/dist/esm/components/DrilldownMenu/index.js +5 -0
- package/dist/esm/components/DrilldownMenu/index.js.map +1 -0
- package/dist/esm/components/RadioCard/RadioCard.d.ts +27 -0
- package/dist/esm/components/RadioCard/RadioCard.d.ts.map +1 -0
- package/dist/esm/components/RadioCard/RadioCard.js +72 -0
- package/dist/esm/components/RadioCard/RadioCard.js.map +1 -0
- package/dist/esm/components/RadioCard/Styles.d.ts +16 -0
- package/dist/esm/components/RadioCard/Styles.d.ts.map +1 -0
- package/dist/esm/components/RadioCard/Styles.js +26 -0
- package/dist/esm/components/RadioCard/Styles.js.map +1 -0
- package/dist/esm/components/RadioCard/index.d.ts +2 -0
- package/dist/esm/components/RadioCard/index.d.ts.map +1 -0
- package/dist/esm/components/RadioCard/index.js +2 -0
- package/dist/esm/components/RadioCard/index.js.map +1 -0
- package/dist/esm/components/RadioGroup/RadioGroup.d.ts +48 -0
- package/dist/esm/components/RadioGroup/RadioGroup.d.ts.map +1 -0
- package/dist/esm/components/RadioGroup/RadioGroup.js +89 -0
- package/dist/esm/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/esm/components/RadioGroup/Styles.d.ts +22 -0
- package/dist/esm/components/RadioGroup/Styles.d.ts.map +1 -0
- package/dist/esm/components/RadioGroup/Styles.js +23 -0
- package/dist/esm/components/RadioGroup/Styles.js.map +1 -0
- package/dist/esm/components/RadioGroup/index.d.ts +2 -0
- package/dist/esm/components/RadioGroup/index.d.ts.map +1 -0
- package/dist/esm/components/RadioGroup/index.js +2 -0
- package/dist/esm/components/RadioGroup/index.js.map +1 -0
- package/dist/esm/components/index.d.ts +3 -0
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +3 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.d.ts +5 -1
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.d.ts.map +1 -1
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.js +61 -14
- package/dist/esm/presentation/shared/PortfolioOptionsMenu.js.map +1 -1
- package/dist/esm/presentation/shared/index.d.ts +2 -0
- package/dist/esm/presentation/shared/index.d.ts.map +1 -1
- package/dist/esm/presentation/shared/index.js +1 -0
- package/dist/esm/presentation/shared/index.js.map +1 -1
- package/dist/esm/presentation/shared/portfolioDetails.d.ts +74 -0
- package/dist/esm/presentation/shared/portfolioDetails.d.ts.map +1 -0
- package/dist/esm/presentation/shared/portfolioDetails.js +490 -0
- package/dist/esm/presentation/shared/portfolioDetails.js.map +1 -0
- package/dist/esm/utils/useStableId.d.ts +2 -0
- package/dist/esm/utils/useStableId.d.ts.map +1 -0
- package/dist/esm/utils/useStableId.js +25 -0
- package/dist/esm/utils/useStableId.js.map +1 -0
- package/dist/index.js +1315 -821
- 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":"portfolioDetails.js","names":["_react","_interopRequireWildcard","require","_styledComponents","_interopRequireDefault","_Button","_Dialog","_IconButton","_Icons","_Input","_Label","_RadioGroup","_Select","_SelectTrigger","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","l","iterator","u","next","done","return","isArray","DEFAULT_PORTFOLIO_FORM_VALUES","exports","type","context","undefined","projectIds","groupBy","visibility","LEADERS_LIST","short","CATEGORIES","CLIENTS","PICKER_PROJECTS","id","client","category","label","leader","favorite","GROUP_BY_OPTIONS","projectOptionId","project","concat","sampleProjectOptionIds","count","Math","max","map","toProjectOptions","projects","sort","b","localeCompare","groupPickerProjects","other","groups","options","field","without","buckets","Map","_buckets$get","key","entries","_ref","_ref2","PORTFOLIO_TYPES","title","description","VISIBILITY_OPTIONS","contextFieldLabel","leaderShortName","_LEADERS_LIST$find$sh","_LEADERS_LIST$find","find","defaultPortfolioName","isPortfolioDetailsValid","values","trim","Boolean","ProjectsGroupBy","_ref3","selected","onChange","createElement","Select","keepSameOptionsOrder","disableSearch","disabledInternalSort","forceCloseMenu","position","target","IconButton","variant","SortGeneralIcon","ProjectsPicker","_ref4","onGroupBy","invalid","useMemo","triggerText","noResultText","endAdornment","SelectTrigger","className","typographyProps","color","ContextPicker","_ref5","placeholder","StyledDetailsForm","styled","div","withConfig","displayName","componentId","PortfolioDetailsFields","_ref6","onName","onContext","onProjects","onVisibility","showErrors","nameInvalid","pickerInvalid","Label","htmlFor","Input","event","RadioGroup","option","EditPortfolioDialog","_ref7","open","initialValues","onClose","onSave","_useState","useState","_useState2","setValues","_useState3","_useState4","setShowErrors","useEffect","patch","current","handleSave","Dialog","disableCloseOnEsc","Title","ContentDivider","Content","Actions","Button","style","marginRight","onClick"],"sources":["../../../../src/presentation/shared/portfolioDetails.tsx"],"sourcesContent":["import React, { ReactElement, useEffect, useMemo, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { Button } from \"../../components/Button\";\nimport { Dialog } from \"../../components/Dialog\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { SortGeneralIcon } from \"../../components/Icons\";\nimport { Input } from \"../../components/Input\";\nimport { Label } from \"../../components/Label\";\nimport { RadioGroup } from \"../../components/RadioGroup\";\nimport { Select } from \"../../components/Select\";\nimport { SelectTrigger } from \"../../components/SelectTrigger\";\n\n/*\n Portfolio details form — the shared \"step 2\" of the Create Portfolio wizard,\n reused verbatim as the Edit Portfolio dialog.\n\n This mirrors a pattern used across the app: the fields that make up the final\n step of a creation wizard are the same fields shown, later, when the object is\n edited. So the form body (name, the type's picker, visibility) and its\n validation live here once, and two consumers render it:\n\n - The Create Portfolio wizard (PortfoliosList.stories.tsx) renders\n <PortfolioDetailsFields> inside its step-2 <Dialog.Content>, with a\n \"Create Portfolio\" action.\n - <EditPortfolioDialog> (opened from PortfolioOptionsMenu's Edit item)\n renders the SAME <PortfolioDetailsFields> inside a standalone <Dialog>,\n with a \"Save Changes\" action.\n\n Both use isPortfolioDetailsValid() and the same always-enabled-submit,\n outline-on-submit validation rule.\n*/\n\n/* ------------------------------------------------------------------ */\n/* Domain types */\n/* ------------------------------------------------------------------ */\n\n/** How a portfolio decides its members (two kinds, three context types). */\nexport type PortfolioKind = \"custom\" | \"category\" | \"client\" | \"leader\";\n\nexport type PortfolioVisibility = \"everyone\" | \"me\";\n\n/** Grouping of the projects multi-select — matches Invite-to-Projects. */\nexport type GroupBy =\n | \"favorites\"\n | \"labels\"\n | \"companies\"\n | \"categories\"\n | \"leaders\";\n\n/** The editable shape shared by create step 2 and the edit dialog. */\nexport interface PortfolioFormValues {\n type: PortfolioKind;\n name: string;\n /** For context portfolios: the chosen category / client / leader. */\n context?: string;\n /** For custom portfolios: the hand-picked project option ids. */\n projectIds: string[];\n groupBy: GroupBy;\n visibility: PortfolioVisibility;\n}\n\n/** A blank custom portfolio — the fallback seed for the edit dialog. */\nexport const DEFAULT_PORTFOLIO_FORM_VALUES: PortfolioFormValues = {\n type: \"custom\",\n name: \"\",\n context: undefined,\n projectIds: [],\n groupBy: \"favorites\",\n visibility: \"everyone\",\n};\n\n/* ------------------------------------------------------------------ */\n/* Pickers' mock data */\n/* ------------------------------------------------------------------ */\n\nexport interface PickerLeader {\n name: string;\n /** Short \"Firstname L.\" form used in the default portfolio name. */\n short: string;\n}\n\nexport const LEADERS_LIST: PickerLeader[] = [\n { name: \"Theo Brandt\", short: \"Theo B.\" },\n { name: \"Isabel Cortez\", short: \"Isabel C.\" },\n { name: \"Grace Bauer\", short: \"Grace B.\" },\n { name: \"Noah Mercer\", short: \"Noah M.\" },\n];\n\nexport const CATEGORIES = [\n \"Brand & Identity\",\n \"Web & Product\",\n \"Marketing\",\n \"Internal Ops\",\n];\n\nexport const CLIENTS = [\n \"Aperture Studio\",\n \"Orbit Telecom\",\n \"Northwind Traders\",\n \"Meridian Health\",\n];\n\ninterface PickerProject {\n id: number;\n name: string;\n client: string;\n category: string;\n label: string;\n leader: string;\n favorite: boolean;\n}\n\nconst PICKER_PROJECTS: PickerProject[] = [\n {\n id: 1,\n name: \"Website Redesign\",\n client: \"Aperture Studio\",\n category: \"Web & Product\",\n label: \"Design\",\n leader: \"Theo Brandt\",\n favorite: true,\n },\n {\n id: 2,\n name: \"Brand Refresh\",\n client: \"Aperture Studio\",\n category: \"Brand & Identity\",\n label: \"Design\",\n leader: \"Isabel Cortez\",\n favorite: true,\n },\n {\n id: 3,\n name: \"Mobile App\",\n client: \"Orbit Telecom\",\n category: \"Web & Product\",\n label: \"Build\",\n leader: \"Grace Bauer\",\n favorite: false,\n },\n {\n id: 4,\n name: \"Q3 Campaign\",\n client: \"Orbit Telecom\",\n category: \"Marketing\",\n label: \"Campaign\",\n leader: \"Noah Mercer\",\n favorite: true,\n },\n {\n id: 5,\n name: \"Internal Wiki\",\n client: \"\",\n category: \"Internal Ops\",\n label: \"\",\n leader: \"Theo Brandt\",\n favorite: false,\n },\n {\n id: 6,\n name: \"Packaging System\",\n client: \"Northwind Traders\",\n category: \"Brand & Identity\",\n label: \"Design\",\n leader: \"Isabel Cortez\",\n favorite: false,\n },\n {\n id: 7,\n name: \"Support Portal\",\n client: \"Meridian Health\",\n category: \"Web & Product\",\n label: \"Build\",\n leader: \"Grace Bauer\",\n favorite: false,\n },\n {\n id: 8,\n name: \"Annual Report\",\n client: \"Northwind Traders\",\n category: \"Marketing\",\n label: \"Campaign\",\n leader: \"Noah Mercer\",\n favorite: true,\n },\n];\n\n/* Group-by options and default match the Invite-to-Projects picker exactly. */\nconst GROUP_BY_OPTIONS: { id: GroupBy; name: string }[] = [\n { id: \"favorites\", name: \"Favorites\" },\n { id: \"labels\", name: \"Label\" },\n { id: \"companies\", name: \"Client\" },\n { id: \"categories\", name: \"Category\" },\n { id: \"leaders\", name: \"Project Leader\" },\n];\n\ninterface ProjectOption {\n id: string;\n name: string;\n}\ninterface ProjectOptionGroup {\n id: string;\n name: string;\n options: ProjectOption[];\n}\n\nconst projectOptionId = (project: PickerProject): string => `p${project.id}`;\n\n/** A small deterministic set of project option ids — seeds a custom\n portfolio's edit dialog so the picker reads as an existing selection. */\nexport const sampleProjectOptionIds = (count: number): string[] =>\n PICKER_PROJECTS.slice(0, Math.max(0, count)).map(projectOptionId);\n\nconst toProjectOptions = (projects: PickerProject[]): ProjectOption[] =>\n projects\n .map((project) => ({ id: projectOptionId(project), name: project.name }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n/* Build the grouped option tree the Select expects. Alphabetical rows and\n groups; the \"Without ...\" / \"Other\" bucket sits last; the Favorites grouping\n collapses to a flat list when it is the only group (as the app's does). */\nconst groupPickerProjects = (\n groupBy: GroupBy\n): ProjectOption[] | ProjectOptionGroup[] => {\n if (groupBy === \"favorites\") {\n const favorite = PICKER_PROJECTS.filter((project) => project.favorite);\n const other = PICKER_PROJECTS.filter((project) => !project.favorite);\n const groups: ProjectOptionGroup[] = [];\n if (favorite.length) {\n groups.push({\n id: \"g-fav\",\n name: \"Favorite\",\n options: toProjectOptions(favorite),\n });\n }\n if (other.length) {\n groups.push({\n id: \"g-other\",\n name: \"Other\",\n options: toProjectOptions(other),\n });\n }\n return groups.length === 1 ? groups[0].options : groups;\n }\n\n const field: keyof PickerProject =\n groupBy === \"labels\"\n ? \"label\"\n : groupBy === \"companies\"\n ? \"client\"\n : groupBy === \"categories\"\n ? \"category\"\n : \"leader\";\n const without =\n groupBy === \"labels\"\n ? \"Without Label\"\n : groupBy === \"companies\"\n ? \"Without Client\"\n : groupBy === \"categories\"\n ? \"Without Category\"\n : \"Without Leader\";\n\n const buckets = new Map<string, PickerProject[]>();\n PICKER_PROJECTS.forEach((project) => {\n const key = (project[field] as string) || without;\n if (!buckets.has(key)) {\n buckets.set(key, []);\n }\n buckets.get(key)?.push(project);\n });\n\n return Array.from(buckets.entries())\n .map(([name, projects]) => ({\n id: `g-${name}`,\n name,\n options: toProjectOptions(projects),\n }))\n .sort((a, b) =>\n a.name === without\n ? 1\n : b.name === without\n ? -1\n : a.name.localeCompare(b.name)\n );\n};\n\n/* ------------------------------------------------------------------ */\n/* Type + visibility option copy */\n/* ------------------------------------------------------------------ */\n\nexport const PORTFOLIO_TYPES: {\n id: PortfolioKind;\n title: string;\n description: string;\n}[] = [\n {\n id: \"custom\",\n title: \"Custom Portfolio\",\n description: \"The projects you pick by hand. Nothing joins automatically.\",\n },\n {\n id: \"client\",\n title: \"Client Portfolio\",\n description:\n \"All projects for a client company. New ones join automatically.\",\n },\n {\n id: \"leader\",\n title: \"Project Leader Portfolio\",\n description: \"All projects led by a person. New ones join automatically.\",\n },\n {\n id: \"category\",\n title: \"Category Portfolio\",\n description:\n \"All projects in a project category. New ones join automatically.\",\n },\n];\n\nexport const VISIBILITY_OPTIONS: {\n id: PortfolioVisibility;\n title: string;\n description: string;\n}[] = [\n {\n id: \"everyone\",\n title: \"Visible to Everyone\",\n description:\n \"Anyone who can use portfolios sees this one. They still only see the projects they already have access to.\",\n },\n {\n id: \"me\",\n title: \"Visible Only to Me\",\n description: \"Nobody else sees this portfolio.\",\n },\n];\n\nexport const contextFieldLabel = (type: PortfolioKind): string =>\n type === \"custom\"\n ? \"Projects\"\n : type === \"category\"\n ? \"Category\"\n : type === \"client\"\n ? \"Client\"\n : \"Project leader\";\n\nexport const leaderShortName = (name: string): string =>\n LEADERS_LIST.find((leader) => leader.name === name)?.short ?? name;\n\n/* Default names: \"{Category} Projects\", \"{Client} Projects\", \"Lead by {N.}\". */\nexport const defaultPortfolioName = (\n type: PortfolioKind,\n context: string\n): string => {\n if (!context) return \"\";\n if (type === \"category\" || type === \"client\") return `${context} Projects`;\n if (type === \"leader\") return `Lead by ${leaderShortName(context)}`;\n return \"\";\n};\n\n/* ------------------------------------------------------------------ */\n/* Validation (shared by create step 2 and the edit dialog) */\n/* ------------------------------------------------------------------ */\n\n/** Name is required; a custom portfolio needs at least one project, a context\n portfolio needs its context chosen. Same rule for create and edit. */\nexport const isPortfolioDetailsValid = (values: PortfolioFormValues): boolean =>\n values.name.trim().length > 0 &&\n (values.type === \"custom\"\n ? values.projectIds.length > 0\n : Boolean(values.context));\n\n/* ------------------------------------------------------------------ */\n/* Pickers */\n/* ------------------------------------------------------------------ */\n\n/* Group-by control: the SortGeneralIcon button the Invite-to-Projects picker\n shows as the search bar's right-side adornment. Controls grouping, not sort. */\nconst ProjectsGroupBy = ({\n selected,\n onChange,\n}: {\n selected: GroupBy;\n onChange: (groupBy: GroupBy) => void;\n}): ReactElement => (\n <Select\n keepSameOptionsOrder\n disableSearch\n disabledInternalSort\n forceCloseMenu\n position=\"bottom-end\"\n selected={selected}\n onChange={(value) => onChange(value as GroupBy)}\n options={GROUP_BY_OPTIONS}\n target={\n <IconButton type=\"button\" variant=\"text gray\">\n <SortGeneralIcon />\n </IconButton>\n }\n />\n);\n\nconst ProjectsPicker = ({\n selected,\n onChange,\n groupBy,\n onGroupBy,\n invalid,\n}: {\n selected: string[];\n onChange: (ids: string[]) => void;\n groupBy: GroupBy;\n onGroupBy: (groupBy: GroupBy) => void;\n invalid?: boolean;\n}): ReactElement => {\n const options = useMemo(() => groupPickerProjects(groupBy), [groupBy]);\n const count = selected.length;\n const triggerText =\n count === 0\n ? \"Choose projects\"\n : count === 1\n ? \"1 project selected\"\n : `${count} projects selected`;\n return (\n <Select\n type=\"multiple\"\n options={options}\n selected={selected}\n onChange={(value) => onChange(value as string[])}\n noResultText=\"No results\"\n endAdornment={<ProjectsGroupBy selected={groupBy} onChange={onGroupBy} />}\n target={\n <SelectTrigger\n id=\"pf-projects\"\n className=\"pf-trigger\"\n invalid={invalid}\n typographyProps={{ color: count > 0 ? \"primary\" : \"quaternary\" }}\n >\n {triggerText}\n </SelectTrigger>\n }\n />\n );\n};\n\nconst ContextPicker = ({\n type,\n value,\n onChange,\n invalid,\n}: {\n type: PortfolioKind;\n value?: string;\n onChange: (value: string) => void;\n invalid?: boolean;\n}): ReactElement => {\n const options =\n type === \"category\"\n ? CATEGORIES.map((name) => ({ id: name, name }))\n : type === \"client\"\n ? CLIENTS.map((name) => ({ id: name, name }))\n : LEADERS_LIST.map((leader) => ({ id: leader.name, name: leader.name }));\n const placeholder =\n type === \"category\"\n ? \"Choose a category\"\n : type === \"client\"\n ? \"Choose a client\"\n : \"Choose a project leader\";\n return (\n <Select\n forceCloseMenu\n options={options}\n selected={value ?? \"\"}\n onChange={(next) => onChange(String(next))}\n target={\n <SelectTrigger\n id=\"pf-context\"\n className=\"pf-trigger\"\n invalid={invalid}\n typographyProps={{ color: value ? \"primary\" : \"quaternary\" }}\n >\n {value ?? placeholder}\n </SelectTrigger>\n }\n />\n );\n};\n\n/* ------------------------------------------------------------------ */\n/* The reusable form body */\n/* ------------------------------------------------------------------ */\n\nconst StyledDetailsForm = styled.div`\n display: flex;\n flex-direction: column;\n gap: 24px;\n\n .field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n /* DS form controls are fixed-width (Input 360px, SelectTrigger 300px); let\n them fill the dialog column instead. */\n .field .c-input-wrapper {\n width: 100%;\n }\n\n .field .pf-trigger {\n width: 100%;\n }\n`;\n\nexport interface PortfolioDetailsFieldsProps {\n values: PortfolioFormValues;\n onName: (value: string) => void;\n onContext: (value: string) => void;\n onProjects: (ids: string[]) => void;\n onGroupBy: (groupBy: GroupBy) => void;\n onVisibility: (value: PortfolioVisibility) => void;\n /* Form pattern (propagating through the app): the submit button is ALWAYS\n enabled. On submit the consumer flips showErrors; each field then outlines\n itself (aria-invalid) while it is invalid, and clears once it becomes\n valid. No field disables submit. */\n showErrors: boolean;\n}\n\n/** Name + the type's picker + visibility. No Dialog wrappers and no action\n button — the consumer (create step or edit dialog) supplies those. */\nexport const PortfolioDetailsFields = ({\n values,\n onName,\n onContext,\n onProjects,\n onGroupBy,\n onVisibility,\n showErrors,\n}: PortfolioDetailsFieldsProps): ReactElement => {\n const { type, name, context, projectIds, groupBy, visibility } = values;\n const nameInvalid = showErrors && name.trim().length === 0;\n const pickerInvalid =\n showErrors && (type === \"custom\" ? projectIds.length === 0 : !context);\n\n return (\n <StyledDetailsForm>\n <div className=\"field\">\n <Label htmlFor=\"pf-name\">Name</Label>\n <Input\n id=\"pf-name\"\n value={name}\n placeholder=\"Portfolio name\"\n invalid={nameInvalid}\n onChange={(event) => onName(event.target.value)}\n />\n </div>\n <div className=\"field\">\n <Label htmlFor={type === \"custom\" ? \"pf-projects\" : \"pf-context\"}>\n {contextFieldLabel(type)}\n </Label>\n {type === \"custom\" ? (\n <ProjectsPicker\n selected={projectIds}\n onChange={onProjects}\n groupBy={groupBy}\n onGroupBy={onGroupBy}\n invalid={pickerInvalid}\n />\n ) : (\n <ContextPicker\n type={type}\n value={context}\n onChange={onContext}\n invalid={pickerInvalid}\n />\n )}\n </div>\n <div className=\"field\">\n <RadioGroup\n label=\"Visibility\"\n variant=\"plain\"\n value={visibility}\n onChange={(value) => onVisibility(value as PortfolioVisibility)}\n options={VISIBILITY_OPTIONS.map((option) => ({\n id: option.id,\n name: option.title,\n description: option.description,\n }))}\n />\n </div>\n </StyledDetailsForm>\n );\n};\n\nPortfolioDetailsFields.displayName = \"PortfolioDetailsFields\";\n\n/* ------------------------------------------------------------------ */\n/* Edit Portfolio dialog — the create wizard's step 2, on its own */\n/* ------------------------------------------------------------------ */\n\nexport interface EditPortfolioDialogProps {\n open: boolean;\n /** The portfolio's current values; the dialog seeds itself from these on\n open, so Cancel discards edits and Save commits them. */\n initialValues: PortfolioFormValues;\n onClose: () => void;\n onSave?: (values: PortfolioFormValues) => void;\n}\n\n/*\n Same fields, same validation as create step 2. The type is fixed to the\n portfolio's kind (edit changes the details, not the kind), so there is no\n type radio here — only the name, the type's picker, and visibility.\n*/\nexport const EditPortfolioDialog = ({\n open,\n initialValues,\n onClose,\n onSave,\n}: EditPortfolioDialogProps): ReactElement => {\n const [values, setValues] = useState<PortfolioFormValues>(initialValues);\n const [showErrors, setShowErrors] = useState(false);\n\n /* Re-seed from the portfolio each time the dialog opens. */\n useEffect(() => {\n if (open) {\n setValues(initialValues);\n setShowErrors(false);\n }\n // Seed on open only — initialValues is read at that moment by design.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const patch = (next: Partial<PortfolioFormValues>): void =>\n setValues((current) => ({ ...current, ...next }));\n\n const handleSave = (): void => {\n if (!isPortfolioDetailsValid(values)) {\n setShowErrors(true);\n return;\n }\n onSave?.(values);\n onClose();\n };\n\n return (\n <Dialog open={open} onClose={onClose} disableCloseOnEsc>\n <Dialog.Title>Edit Portfolio</Dialog.Title>\n <Dialog.ContentDivider />\n <Dialog.Content>\n <PortfolioDetailsFields\n values={values}\n onName={(name) => patch({ name })}\n onContext={(context) => patch({ context })}\n onProjects={(projectIds) => patch({ projectIds })}\n onGroupBy={(groupBy) => patch({ groupBy })}\n onVisibility={(visibility) => patch({ visibility })}\n showErrors={showErrors}\n />\n </Dialog.Content>\n <Dialog.ContentDivider />\n <Dialog.Actions>\n <Button\n variant=\"primary\"\n style={{ marginRight: \"12px\" }}\n onClick={handleSave}\n >\n Save Changes\n </Button>\n <Button variant=\"secondary\" data-action=\"cancel\" onClick={onClose}>\n Cancel\n </Button>\n </Dialog.Actions>\n </Dialog>\n );\n};\n\nEditPortfolioDialog.displayName = \"EditPortfolioDialog\";\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = useStableId;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
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); }
|
|
9
|
+
/**
|
|
10
|
+
* Stable id generator for a single element.
|
|
11
|
+
*
|
|
12
|
+
* `React.useId` only exists in React 18+. This package still declares React
|
|
13
|
+
* 16/17 in `peerDependencies`, so we must not call `React.useId` directly.
|
|
14
|
+
* Instead we read it off the React export once, at module load, and fall back
|
|
15
|
+
* to a module-level counter when it is absent. Which branch runs is fixed for
|
|
16
|
+
* the life of the module, so the hook call order stays stable across renders.
|
|
17
|
+
*
|
|
18
|
+
* Intentionally NOT re-exported from `src/utils/index.ts`: the package root
|
|
19
|
+
* re-exports `./utils`, and this helper is internal to the radio components.
|
|
20
|
+
*/
|
|
21
|
+
var counter = 0;
|
|
22
|
+
var reactUseId = React.useId;
|
|
23
|
+
function useStableId(providedId) {
|
|
24
|
+
var generatedId = reactUseId ?
|
|
25
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
26
|
+
reactUseId() :
|
|
27
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
28
|
+
React.useMemo(function () {
|
|
29
|
+
return "ds-".concat(counter += 1);
|
|
30
|
+
}, []);
|
|
31
|
+
return providedId !== null && providedId !== void 0 ? providedId : generatedId;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=useStableId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStableId.js","names":["React","_interopRequireWildcard","require","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","counter","reactUseId","useId","useStableId","providedId","generatedId","useMemo","concat"],"sources":["../../../src/utils/useStableId.ts"],"sourcesContent":["import * as React from \"react\";\n\n/**\n * Stable id generator for a single element.\n *\n * `React.useId` only exists in React 18+. This package still declares React\n * 16/17 in `peerDependencies`, so we must not call `React.useId` directly.\n * Instead we read it off the React export once, at module load, and fall back\n * to a module-level counter when it is absent. Which branch runs is fixed for\n * the life of the module, so the hook call order stays stable across renders.\n *\n * Intentionally NOT re-exported from `src/utils/index.ts`: the package root\n * re-exports `./utils`, and this helper is internal to the radio components.\n */\nlet counter = 0;\n\nconst reactUseId = (React as { useId?: () => string }).useId;\n\nexport default function useStableId(providedId?: string): string {\n const generatedId = reactUseId\n ? // eslint-disable-next-line react-hooks/rules-of-hooks\n reactUseId()\n : // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useMemo(() => `ds-${(counter += 1)}`, []);\n\n return providedId ?? generatedId;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA+B,SAAAD,wBAAAE,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAJ,uBAAA,YAAAA,wBAAAE,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,cAAAM,EAAA,IAAAd,CAAA,gBAAAc,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,EAAA,OAAAP,CAAA,IAAAD,CAAA,GAAAW,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAc,EAAA,OAAAP,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAM,EAAA,EAAAP,CAAA,IAAAC,CAAA,CAAAM,EAAA,IAAAd,CAAA,CAAAc,EAAA,WAAAN,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAImB,OAAO,GAAG,CAAC;AAEf,IAAMC,UAAU,GAAIxB,KAAK,CAA8ByB,KAAK;AAE7C,SAASC,WAAWA,CAACC,UAAmB,EAAU;EAC/D,IAAMC,WAAW,GAAGJ,UAAU;EAC1B;EACAA,UAAU,CAAC,CAAC;EACZ;EACAxB,KAAK,CAAC6B,OAAO,CAAC;IAAA,aAAAC,MAAA,CAAaP,OAAO,IAAI,CAAC;EAAA,CAAG,EAAE,EAAE,CAAC;EAEnD,OAAOI,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAIC,WAAW;AAClC","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { DrilldownMenuContentProps, IndexRenderProps } from "./DrilldownMenuContent";
|
|
3
|
+
import { IMenu } from "../Menu";
|
|
4
|
+
export interface DrilldownMenuProps extends Pick<DrilldownMenuContentProps, "width" | "submenus" | "backLabel"> {
|
|
5
|
+
/** Element the menu hangs off */
|
|
6
|
+
target: IMenu["target"];
|
|
7
|
+
/** Whether the menu is open. The caller owns this */
|
|
8
|
+
open: boolean;
|
|
9
|
+
onOpen: () => void;
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
/** Where the menu sits against its target */
|
|
12
|
+
position?: IMenu["position"];
|
|
13
|
+
/** Sits above the index list, inside the same pane */
|
|
14
|
+
header?: ReactNode;
|
|
15
|
+
/** Applied to the index list, next to its own vertical padding */
|
|
16
|
+
listClassName?: string;
|
|
17
|
+
/** Index items, or a function that receives `openSubmenu` */
|
|
18
|
+
children?: ReactNode | ((props: IndexRenderProps) => ReactNode);
|
|
19
|
+
}
|
|
20
|
+
export declare const DrilldownMenu: {
|
|
21
|
+
({ target, open, onOpen, onClose, position, width, header, listClassName, backLabel, submenus, children, }: DrilldownMenuProps): JSX.Element;
|
|
22
|
+
displayName: string;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=DrilldownMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrilldownMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/DrilldownMenu/DrilldownMenu.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAE9D,OAAO,EAGL,yBAAyB,EAEzB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIhC,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,yBAAyB,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;IAC3E,iCAAiC;IACjC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,qDAAqD;IACrD,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7B,sDAAsD;IACtD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC;CACjE;AAED,eAAO,MAAM,aAAa;gHAYvB,kBAAkB,GAAG,GAAG,CAAC,OAAO;;CAyClC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { DEFAULT_PANE_WIDTH, DrilldownMenuContent } from "./DrilldownMenuContent";
|
|
3
|
+
import { StyledIndexList, StyledMenu } from "./Styles";
|
|
4
|
+
const NO_SUBMENUS = [];
|
|
5
|
+
export const DrilldownMenu = _ref => {
|
|
6
|
+
let target = _ref.target,
|
|
7
|
+
open = _ref.open,
|
|
8
|
+
onOpen = _ref.onOpen,
|
|
9
|
+
onClose = _ref.onClose,
|
|
10
|
+
position = _ref.position,
|
|
11
|
+
width = _ref.width,
|
|
12
|
+
header = _ref.header,
|
|
13
|
+
listClassName = _ref.listClassName,
|
|
14
|
+
backLabel = _ref.backLabel,
|
|
15
|
+
_ref$submenus = _ref.submenus,
|
|
16
|
+
submenus = _ref$submenus === void 0 ? NO_SUBMENUS : _ref$submenus,
|
|
17
|
+
children = _ref.children;
|
|
18
|
+
const _useState = useState(0),
|
|
19
|
+
contentKey = _useState[0],
|
|
20
|
+
setContentKey = _useState[1];
|
|
21
|
+
const showPanes = submenus.length > 0;
|
|
22
|
+
const paneWidth = width || DEFAULT_PANE_WIDTH;
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!open) {
|
|
25
|
+
setContentKey(key => key + 1);
|
|
26
|
+
}
|
|
27
|
+
}, [open]);
|
|
28
|
+
return /*#__PURE__*/React.createElement(StyledMenu, {
|
|
29
|
+
$paned: showPanes,
|
|
30
|
+
target: target,
|
|
31
|
+
open: open,
|
|
32
|
+
onOpen: onOpen,
|
|
33
|
+
onClose: onClose,
|
|
34
|
+
position: position
|
|
35
|
+
}, /*#__PURE__*/React.createElement(DrilldownMenuContent, {
|
|
36
|
+
key: contentKey,
|
|
37
|
+
width: width,
|
|
38
|
+
submenus: submenus,
|
|
39
|
+
backLabel: backLabel
|
|
40
|
+
}, paneProps => /*#__PURE__*/React.createElement(React.Fragment, null, header, /*#__PURE__*/React.createElement(StyledIndexList, {
|
|
41
|
+
className: listClassName,
|
|
42
|
+
style: {
|
|
43
|
+
width: showPanes ? paneWidth : "100%"
|
|
44
|
+
}
|
|
45
|
+
}, typeof children === "function" ? children(paneProps) : children))));
|
|
46
|
+
};
|
|
47
|
+
DrilldownMenu.displayName = "DrilldownMenu";
|
|
48
|
+
//# sourceMappingURL=DrilldownMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrilldownMenu.js","names":["React","useEffect","useState","DEFAULT_PANE_WIDTH","DrilldownMenuContent","StyledIndexList","StyledMenu","NO_SUBMENUS","DrilldownMenu","_ref","target","open","onOpen","onClose","position","width","header","listClassName","backLabel","_ref$submenus","submenus","children","_useState","contentKey","setContentKey","showPanes","length","paneWidth","key","createElement","$paned","paneProps","Fragment","className","style","displayName"],"sources":["../../../../src/components/DrilldownMenu/DrilldownMenu.tsx"],"sourcesContent":["import React, { ReactNode, useEffect, useState } from \"react\";\n\nimport {\n DEFAULT_PANE_WIDTH,\n DrilldownMenuContent,\n DrilldownMenuContentProps,\n DrilldownSubmenu,\n IndexRenderProps,\n} from \"./DrilldownMenuContent\";\nimport { StyledIndexList, StyledMenu } from \"./Styles\";\nimport { IMenu } from \"../Menu\";\n\nconst NO_SUBMENUS: DrilldownSubmenu[] = [];\n\nexport interface DrilldownMenuProps\n extends Pick<DrilldownMenuContentProps, \"width\" | \"submenus\" | \"backLabel\"> {\n /** Element the menu hangs off */\n target: IMenu[\"target\"];\n /** Whether the menu is open. The caller owns this */\n open: boolean;\n onOpen: () => void;\n onClose: () => void;\n /** Where the menu sits against its target */\n position?: IMenu[\"position\"];\n /** Sits above the index list, inside the same pane */\n header?: ReactNode;\n /** Applied to the index list, next to its own vertical padding */\n listClassName?: string;\n /** Index items, or a function that receives `openSubmenu` */\n children?: ReactNode | ((props: IndexRenderProps) => ReactNode);\n}\n\nexport const DrilldownMenu = ({\n target,\n open,\n onOpen,\n onClose,\n position,\n width,\n header,\n listClassName,\n backLabel,\n submenus = NO_SUBMENUS,\n children,\n}: DrilldownMenuProps): JSX.Element => {\n const [contentKey, setContentKey] = useState(0);\n\n const showPanes = submenus.length > 0;\n const paneWidth = width || DEFAULT_PANE_WIDTH;\n\n useEffect(() => {\n if (!open) {\n setContentKey((key) => key + 1);\n }\n }, [open]);\n\n return (\n <StyledMenu\n $paned={showPanes}\n target={target}\n open={open}\n onOpen={onOpen}\n onClose={onClose}\n position={position}\n >\n <DrilldownMenuContent\n key={contentKey}\n width={width}\n submenus={submenus}\n backLabel={backLabel}\n >\n {(paneProps: IndexRenderProps) => (\n <>\n {header}\n <StyledIndexList\n className={listClassName}\n style={{ width: showPanes ? paneWidth : \"100%\" }}\n >\n {typeof children === \"function\" ? children(paneProps) : children}\n </StyledIndexList>\n </>\n )}\n </DrilldownMenuContent>\n </StyledMenu>\n );\n};\n\nDrilldownMenu.displayName = \"DrilldownMenu\";\n"],"mappings":"AAAA,OAAOA,KAAK,IAAeC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAE7D,SACEC,kBAAkB,EAClBC,oBAAoB,QAIf,wBAAwB;AAC/B,SAASC,eAAe,EAAEC,UAAU,QAAQ,UAAU;AAGtD,MAAMC,WAA+B,GAAG,EAAE;AAoB1C,OAAO,MAAMC,aAAa,GAAGC,IAAA,IAYU;EAAA,IAXrCC,MAAM,GAAAD,IAAA,CAANC,MAAM;IACNC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IACJC,MAAM,GAAAH,IAAA,CAANG,MAAM;IACNC,OAAO,GAAAJ,IAAA,CAAPI,OAAO;IACPC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;IACRC,KAAK,GAAAN,IAAA,CAALM,KAAK;IACLC,MAAM,GAAAP,IAAA,CAANO,MAAM;IACNC,aAAa,GAAAR,IAAA,CAAbQ,aAAa;IACbC,SAAS,GAAAT,IAAA,CAATS,SAAS;IAAAC,aAAA,GAAAV,IAAA,CACTW,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAGZ,WAAW,GAAAY,aAAA;IACtBE,QAAQ,GAAAZ,IAAA,CAARY,QAAQ;EAER,MAAAC,SAAA,GAAoCpB,QAAQ,CAAC,CAAC,CAAC;IAAxCqB,UAAU,GAAAD,SAAA;IAAEE,aAAa,GAAAF,SAAA;EAEhC,MAAMG,SAAS,GAAGL,QAAQ,CAACM,MAAM,GAAG,CAAC;EACrC,MAAMC,SAAS,GAAGZ,KAAK,IAAIZ,kBAAkB;EAE7CF,SAAS,CAAC,MAAM;IACd,IAAI,CAACU,IAAI,EAAE;MACTa,aAAa,CAAEI,GAAG,IAAKA,GAAG,GAAG,CAAC,CAAC;IACjC;EACF,CAAC,EAAE,CAACjB,IAAI,CAAC,CAAC;EAEV,oBACEX,KAAA,CAAA6B,aAAA,CAACvB,UAAU;IACTwB,MAAM,EAAEL,SAAU;IAClBf,MAAM,EAAEA,MAAO;IACfC,IAAI,EAAEA,IAAK;IACXC,MAAM,EAAEA,MAAO;IACfC,OAAO,EAAEA,OAAQ;IACjBC,QAAQ,EAAEA;EAAS,gBAEnBd,KAAA,CAAA6B,aAAA,CAACzB,oBAAoB;IACnBwB,GAAG,EAAEL,UAAW;IAChBR,KAAK,EAAEA,KAAM;IACbK,QAAQ,EAAEA,QAAS;IACnBF,SAAS,EAAEA;EAAU,GAEnBa,SAA2B,iBAC3B/B,KAAA,CAAA6B,aAAA,CAAA7B,KAAA,CAAAgC,QAAA,QACGhB,MAAM,eACPhB,KAAA,CAAA6B,aAAA,CAACxB,eAAe;IACd4B,SAAS,EAAEhB,aAAc;IACzBiB,KAAK,EAAE;MAAEnB,KAAK,EAAEU,SAAS,GAAGE,SAAS,GAAG;IAAO;EAAE,GAEhD,OAAON,QAAQ,KAAK,UAAU,GAAGA,QAAQ,CAACU,SAAS,CAAC,GAAGV,QACzC,CACjB,CAEgB,CACZ,CAAC;AAEjB,CAAC;AAEDb,aAAa,CAAC2B,WAAW,GAAG,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
export declare const DEFAULT_PANE_WIDTH = 260;
|
|
3
|
+
export declare const INDEX_VIEW = "index";
|
|
4
|
+
export interface SubmenuRenderProps {
|
|
5
|
+
/** True once the pane has finished sliding in. Drive `focusInput` off it */
|
|
6
|
+
isEntered: boolean;
|
|
7
|
+
/** Slides back to the index list */
|
|
8
|
+
goBack: () => void;
|
|
9
|
+
}
|
|
10
|
+
export interface DrilldownSubmenu {
|
|
11
|
+
/** Identifies the pane. `openSubmenu` takes this value */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Draws a header with a back button. Leave it out for content that carries its own way back */
|
|
14
|
+
title?: string;
|
|
15
|
+
/** Pane body, or a function that receives the pane state */
|
|
16
|
+
content: ReactNode | ((props: SubmenuRenderProps) => ReactNode);
|
|
17
|
+
/** Runs next to the slide back, for caller state such as a discarded draft */
|
|
18
|
+
onBack?: () => void;
|
|
19
|
+
}
|
|
20
|
+
export interface IndexRenderProps {
|
|
21
|
+
/** Slides to the pane with this id */
|
|
22
|
+
openSubmenu: (id: string) => void;
|
|
23
|
+
}
|
|
24
|
+
export interface DrilldownMenuContentProps {
|
|
25
|
+
/** Width of every pane */
|
|
26
|
+
width?: number | string;
|
|
27
|
+
/** Panes the index list can slide to. An empty list renders the index alone */
|
|
28
|
+
submenus?: DrilldownSubmenu[];
|
|
29
|
+
/** Accessible label of the back button in every pane header */
|
|
30
|
+
backLabel?: string;
|
|
31
|
+
/** Index list, or a function that receives `openSubmenu` */
|
|
32
|
+
children?: ReactNode | ((props: IndexRenderProps) => ReactNode);
|
|
33
|
+
}
|
|
34
|
+
export declare const DrilldownMenuContent: {
|
|
35
|
+
({ width, submenus, backLabel, children, }: DrilldownMenuContentProps): JSX.Element;
|
|
36
|
+
displayName: string;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=DrilldownMenuContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrilldownMenuContent.d.ts","sourceRoot":"","sources":["../../../../src/components/DrilldownMenu/DrilldownMenuContent.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAyB,MAAM,OAAO,CAAC;AAOhE,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,UAAU,UAAU,CAAC;AAIlC,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,SAAS,CAAC,CAAC;IAChE,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC;CACjE;AAED,eAAO,MAAM,oBAAoB;gDAK9B,yBAAyB,GAAG,GAAG,CAAC,OAAO;;CA0FzC,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import React, { useCallback, useState } from "react";
|
|
2
|
+
import { MoveFocusInside } from "react-focus-lock";
|
|
3
|
+
import { MeasuredPane } from "./MeasuredPane";
|
|
4
|
+
import { SubmenuHeader } from "./SubmenuHeader";
|
|
5
|
+
import { ResizeTransition, SlideLeftRightTransition } from "../Transitions";
|
|
6
|
+
export const DEFAULT_PANE_WIDTH = 260;
|
|
7
|
+
export const INDEX_VIEW = "index";
|
|
8
|
+
const NO_SUBMENUS = [];
|
|
9
|
+
export const DrilldownMenuContent = _ref => {
|
|
10
|
+
let width = _ref.width,
|
|
11
|
+
_ref$submenus = _ref.submenus,
|
|
12
|
+
submenus = _ref$submenus === void 0 ? NO_SUBMENUS : _ref$submenus,
|
|
13
|
+
backLabel = _ref.backLabel,
|
|
14
|
+
children = _ref.children;
|
|
15
|
+
const _useState = useState(INDEX_VIEW),
|
|
16
|
+
view = _useState[0],
|
|
17
|
+
setView = _useState[1];
|
|
18
|
+
const _useState2 = useState(true),
|
|
19
|
+
isLeft = _useState2[0],
|
|
20
|
+
setIsLeft = _useState2[1];
|
|
21
|
+
const _useState3 = useState(0),
|
|
22
|
+
menuHeight = _useState3[0],
|
|
23
|
+
setMenuHeight = _useState3[1];
|
|
24
|
+
const _useState4 = useState(INDEX_VIEW),
|
|
25
|
+
enteredView = _useState4[0],
|
|
26
|
+
setEnteredView = _useState4[1];
|
|
27
|
+
const paneWidth = width || DEFAULT_PANE_WIDTH;
|
|
28
|
+
const handleHeight = useCallback(element => setMenuHeight(element.offsetHeight), []);
|
|
29
|
+
const handleEnteredIndex = useCallback(() => setEnteredView(INDEX_VIEW), []);
|
|
30
|
+
const openSubmenu = useCallback(id => {
|
|
31
|
+
setView(id);
|
|
32
|
+
setIsLeft(true);
|
|
33
|
+
}, []);
|
|
34
|
+
const goToIndex = useCallback(() => {
|
|
35
|
+
setView(INDEX_VIEW);
|
|
36
|
+
setIsLeft(false);
|
|
37
|
+
}, []);
|
|
38
|
+
const index = typeof children === "function" ? children({
|
|
39
|
+
openSubmenu
|
|
40
|
+
}) : children;
|
|
41
|
+
if (submenus.length === 0) {
|
|
42
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, index);
|
|
43
|
+
}
|
|
44
|
+
return /*#__PURE__*/React.createElement(ResizeTransition, {
|
|
45
|
+
in: true,
|
|
46
|
+
style: {
|
|
47
|
+
height: menuHeight || "auto",
|
|
48
|
+
width: paneWidth
|
|
49
|
+
}
|
|
50
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
51
|
+
style: {
|
|
52
|
+
height: menuHeight || "auto",
|
|
53
|
+
width: paneWidth
|
|
54
|
+
}
|
|
55
|
+
}, /*#__PURE__*/React.createElement(SlideLeftRightTransition, {
|
|
56
|
+
in: view === INDEX_VIEW,
|
|
57
|
+
appear: true,
|
|
58
|
+
direction: isLeft ? "left" : "right",
|
|
59
|
+
onEnter: handleHeight,
|
|
60
|
+
onEntered: handleEnteredIndex
|
|
61
|
+
}, /*#__PURE__*/React.createElement(MoveFocusInside, {
|
|
62
|
+
disabled: enteredView !== INDEX_VIEW
|
|
63
|
+
}, /*#__PURE__*/React.createElement(MeasuredPane, {
|
|
64
|
+
active: view === INDEX_VIEW,
|
|
65
|
+
onHeight: setMenuHeight
|
|
66
|
+
}, index))), submenus.map(submenu => {
|
|
67
|
+
const isEntered = enteredView === submenu.id;
|
|
68
|
+
const goBack = () => {
|
|
69
|
+
goToIndex();
|
|
70
|
+
submenu.onBack == null || submenu.onBack();
|
|
71
|
+
};
|
|
72
|
+
return /*#__PURE__*/React.createElement(SlideLeftRightTransition, {
|
|
73
|
+
key: submenu.id,
|
|
74
|
+
in: view === submenu.id,
|
|
75
|
+
direction: isLeft ? "left" : "right",
|
|
76
|
+
onEnter: handleHeight,
|
|
77
|
+
onEntered: () => setEnteredView(submenu.id)
|
|
78
|
+
}, /*#__PURE__*/React.createElement(MoveFocusInside, {
|
|
79
|
+
disabled: !isEntered
|
|
80
|
+
}, /*#__PURE__*/React.createElement(MeasuredPane, {
|
|
81
|
+
active: view === submenu.id,
|
|
82
|
+
onHeight: setMenuHeight,
|
|
83
|
+
style: {
|
|
84
|
+
width: paneWidth
|
|
85
|
+
}
|
|
86
|
+
}, submenu.title ? /*#__PURE__*/React.createElement(SubmenuHeader, {
|
|
87
|
+
title: submenu.title,
|
|
88
|
+
onBack: goBack,
|
|
89
|
+
backLabel: backLabel
|
|
90
|
+
}) : null, typeof submenu.content === "function" ? submenu.content({
|
|
91
|
+
isEntered,
|
|
92
|
+
goBack
|
|
93
|
+
}) : submenu.content)));
|
|
94
|
+
})));
|
|
95
|
+
};
|
|
96
|
+
DrilldownMenuContent.displayName = "DrilldownMenuContent";
|
|
97
|
+
//# sourceMappingURL=DrilldownMenuContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrilldownMenuContent.js","names":["React","useCallback","useState","MoveFocusInside","MeasuredPane","SubmenuHeader","ResizeTransition","SlideLeftRightTransition","DEFAULT_PANE_WIDTH","INDEX_VIEW","NO_SUBMENUS","DrilldownMenuContent","_ref","width","_ref$submenus","submenus","backLabel","children","_useState","view","setView","_useState2","isLeft","setIsLeft","_useState3","menuHeight","setMenuHeight","_useState4","enteredView","setEnteredView","paneWidth","handleHeight","element","offsetHeight","handleEnteredIndex","openSubmenu","id","goToIndex","index","length","createElement","Fragment","in","style","height","appear","direction","onEnter","onEntered","disabled","active","onHeight","map","submenu","isEntered","goBack","onBack","key","title","content","displayName"],"sources":["../../../../src/components/DrilldownMenu/DrilldownMenuContent.tsx"],"sourcesContent":["import React, { ReactNode, useCallback, useState } from \"react\";\nimport { MoveFocusInside } from \"react-focus-lock\";\n\nimport { MeasuredPane } from \"./MeasuredPane\";\nimport { SubmenuHeader } from \"./SubmenuHeader\";\nimport { ResizeTransition, SlideLeftRightTransition } from \"../Transitions\";\n\nexport const DEFAULT_PANE_WIDTH = 260;\nexport const INDEX_VIEW = \"index\";\n\nconst NO_SUBMENUS: DrilldownSubmenu[] = [];\n\nexport interface SubmenuRenderProps {\n /** True once the pane has finished sliding in. Drive `focusInput` off it */\n isEntered: boolean;\n /** Slides back to the index list */\n goBack: () => void;\n}\n\nexport interface DrilldownSubmenu {\n /** Identifies the pane. `openSubmenu` takes this value */\n id: string;\n /** Draws a header with a back button. Leave it out for content that carries its own way back */\n title?: string;\n /** Pane body, or a function that receives the pane state */\n content: ReactNode | ((props: SubmenuRenderProps) => ReactNode);\n /** Runs next to the slide back, for caller state such as a discarded draft */\n onBack?: () => void;\n}\n\nexport interface IndexRenderProps {\n /** Slides to the pane with this id */\n openSubmenu: (id: string) => void;\n}\n\nexport interface DrilldownMenuContentProps {\n /** Width of every pane */\n width?: number | string;\n /** Panes the index list can slide to. An empty list renders the index alone */\n submenus?: DrilldownSubmenu[];\n /** Accessible label of the back button in every pane header */\n backLabel?: string;\n /** Index list, or a function that receives `openSubmenu` */\n children?: ReactNode | ((props: IndexRenderProps) => ReactNode);\n}\n\nexport const DrilldownMenuContent = ({\n width,\n submenus = NO_SUBMENUS,\n backLabel,\n children,\n}: DrilldownMenuContentProps): JSX.Element => {\n const [view, setView] = useState<string>(INDEX_VIEW);\n const [isLeft, setIsLeft] = useState(true);\n const [menuHeight, setMenuHeight] = useState(0);\n const [enteredView, setEnteredView] = useState<string>(INDEX_VIEW);\n\n const paneWidth = width || DEFAULT_PANE_WIDTH;\n\n const handleHeight = useCallback(\n (element: HTMLElement) => setMenuHeight(element.offsetHeight),\n []\n );\n const handleEnteredIndex = useCallback(() => setEnteredView(INDEX_VIEW), []);\n\n const openSubmenu = useCallback((id: string) => {\n setView(id);\n setIsLeft(true);\n }, []);\n\n const goToIndex = useCallback(() => {\n setView(INDEX_VIEW);\n setIsLeft(false);\n }, []);\n\n const index =\n typeof children === \"function\" ? children({ openSubmenu }) : children;\n\n if (submenus.length === 0) {\n return <>{index}</>;\n }\n\n return (\n <ResizeTransition\n in\n style={{ height: menuHeight || \"auto\", width: paneWidth }}\n >\n <div style={{ height: menuHeight || \"auto\", width: paneWidth }}>\n <SlideLeftRightTransition\n in={view === INDEX_VIEW}\n appear\n direction={isLeft ? \"left\" : \"right\"}\n onEnter={handleHeight}\n onEntered={handleEnteredIndex}\n >\n <MoveFocusInside disabled={enteredView !== INDEX_VIEW}>\n <MeasuredPane active={view === INDEX_VIEW} onHeight={setMenuHeight}>\n {index}\n </MeasuredPane>\n </MoveFocusInside>\n </SlideLeftRightTransition>\n {submenus.map((submenu) => {\n const isEntered = enteredView === submenu.id;\n\n const goBack = () => {\n goToIndex();\n submenu.onBack?.();\n };\n\n return (\n <SlideLeftRightTransition\n key={submenu.id}\n in={view === submenu.id}\n direction={isLeft ? \"left\" : \"right\"}\n onEnter={handleHeight}\n onEntered={() => setEnteredView(submenu.id)}\n >\n <MoveFocusInside disabled={!isEntered}>\n <MeasuredPane\n active={view === submenu.id}\n onHeight={setMenuHeight}\n style={{ width: paneWidth }}\n >\n {submenu.title ? (\n <SubmenuHeader\n title={submenu.title}\n onBack={goBack}\n backLabel={backLabel}\n />\n ) : null}\n {typeof submenu.content === \"function\"\n ? submenu.content({ isEntered, goBack })\n : submenu.content}\n </MeasuredPane>\n </MoveFocusInside>\n </SlideLeftRightTransition>\n );\n })}\n </div>\n </ResizeTransition>\n );\n};\n\nDrilldownMenuContent.displayName = \"DrilldownMenuContent\";\n"],"mappings":"AAAA,OAAOA,KAAK,IAAeC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAC/D,SAASC,eAAe,QAAQ,kBAAkB;AAElD,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,gBAAgB,EAAEC,wBAAwB,QAAQ,gBAAgB;AAE3E,OAAO,MAAMC,kBAAkB,GAAG,GAAG;AACrC,OAAO,MAAMC,UAAU,GAAG,OAAO;AAEjC,MAAMC,WAA+B,GAAG,EAAE;AAoC1C,OAAO,MAAMC,oBAAoB,GAAGC,IAAA,IAKU;EAAA,IAJ5CC,KAAK,GAAAD,IAAA,CAALC,KAAK;IAAAC,aAAA,GAAAF,IAAA,CACLG,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAGJ,WAAW,GAAAI,aAAA;IACtBE,SAAS,GAAAJ,IAAA,CAATI,SAAS;IACTC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;EAER,MAAAC,SAAA,GAAwBhB,QAAQ,CAASO,UAAU,CAAC;IAA7CU,IAAI,GAAAD,SAAA;IAAEE,OAAO,GAAAF,SAAA;EACpB,MAAAG,UAAA,GAA4BnB,QAAQ,CAAC,IAAI,CAAC;IAAnCoB,MAAM,GAAAD,UAAA;IAAEE,SAAS,GAAAF,UAAA;EACxB,MAAAG,UAAA,GAAoCtB,QAAQ,CAAC,CAAC,CAAC;IAAxCuB,UAAU,GAAAD,UAAA;IAAEE,aAAa,GAAAF,UAAA;EAChC,MAAAG,UAAA,GAAsCzB,QAAQ,CAASO,UAAU,CAAC;IAA3DmB,WAAW,GAAAD,UAAA;IAAEE,cAAc,GAAAF,UAAA;EAElC,MAAMG,SAAS,GAAGjB,KAAK,IAAIL,kBAAkB;EAE7C,MAAMuB,YAAY,GAAG9B,WAAW,CAC7B+B,OAAoB,IAAKN,aAAa,CAACM,OAAO,CAACC,YAAY,CAAC,EAC7D,EACF,CAAC;EACD,MAAMC,kBAAkB,GAAGjC,WAAW,CAAC,MAAM4B,cAAc,CAACpB,UAAU,CAAC,EAAE,EAAE,CAAC;EAE5E,MAAM0B,WAAW,GAAGlC,WAAW,CAAEmC,EAAU,IAAK;IAC9ChB,OAAO,CAACgB,EAAE,CAAC;IACXb,SAAS,CAAC,IAAI,CAAC;EACjB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMc,SAAS,GAAGpC,WAAW,CAAC,MAAM;IAClCmB,OAAO,CAACX,UAAU,CAAC;IACnBc,SAAS,CAAC,KAAK,CAAC;EAClB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMe,KAAK,GACT,OAAOrB,QAAQ,KAAK,UAAU,GAAGA,QAAQ,CAAC;IAAEkB;EAAY,CAAC,CAAC,GAAGlB,QAAQ;EAEvE,IAAIF,QAAQ,CAACwB,MAAM,KAAK,CAAC,EAAE;IACzB,oBAAOvC,KAAA,CAAAwC,aAAA,CAAAxC,KAAA,CAAAyC,QAAA,QAAGH,KAAQ,CAAC;EACrB;EAEA,oBACEtC,KAAA,CAAAwC,aAAA,CAAClC,gBAAgB;IACfoC,EAAE;IACFC,KAAK,EAAE;MAAEC,MAAM,EAAEnB,UAAU,IAAI,MAAM;MAAEZ,KAAK,EAAEiB;IAAU;EAAE,gBAE1D9B,KAAA,CAAAwC,aAAA;IAAKG,KAAK,EAAE;MAAEC,MAAM,EAAEnB,UAAU,IAAI,MAAM;MAAEZ,KAAK,EAAEiB;IAAU;EAAE,gBAC7D9B,KAAA,CAAAwC,aAAA,CAACjC,wBAAwB;IACvBmC,EAAE,EAAEvB,IAAI,KAAKV,UAAW;IACxBoC,MAAM;IACNC,SAAS,EAAExB,MAAM,GAAG,MAAM,GAAG,OAAQ;IACrCyB,OAAO,EAAEhB,YAAa;IACtBiB,SAAS,EAAEd;EAAmB,gBAE9BlC,KAAA,CAAAwC,aAAA,CAACrC,eAAe;IAAC8C,QAAQ,EAAErB,WAAW,KAAKnB;EAAW,gBACpDT,KAAA,CAAAwC,aAAA,CAACpC,YAAY;IAAC8C,MAAM,EAAE/B,IAAI,KAAKV,UAAW;IAAC0C,QAAQ,EAAEzB;EAAc,GAChEY,KACW,CACC,CACO,CAAC,EAC1BvB,QAAQ,CAACqC,GAAG,CAAEC,OAAO,IAAK;IACzB,MAAMC,SAAS,GAAG1B,WAAW,KAAKyB,OAAO,CAACjB,EAAE;IAE5C,MAAMmB,MAAM,GAAGA,CAAA,KAAM;MACnBlB,SAAS,CAAC,CAAC;MACXgB,OAAO,CAACG,MAAM,YAAdH,OAAO,CAACG,MAAM,CAAG,CAAC;IACpB,CAAC;IAED,oBACExD,KAAA,CAAAwC,aAAA,CAACjC,wBAAwB;MACvBkD,GAAG,EAAEJ,OAAO,CAACjB,EAAG;MAChBM,EAAE,EAAEvB,IAAI,KAAKkC,OAAO,CAACjB,EAAG;MACxBU,SAAS,EAAExB,MAAM,GAAG,MAAM,GAAG,OAAQ;MACrCyB,OAAO,EAAEhB,YAAa;MACtBiB,SAAS,EAAEA,CAAA,KAAMnB,cAAc,CAACwB,OAAO,CAACjB,EAAE;IAAE,gBAE5CpC,KAAA,CAAAwC,aAAA,CAACrC,eAAe;MAAC8C,QAAQ,EAAE,CAACK;IAAU,gBACpCtD,KAAA,CAAAwC,aAAA,CAACpC,YAAY;MACX8C,MAAM,EAAE/B,IAAI,KAAKkC,OAAO,CAACjB,EAAG;MAC5Be,QAAQ,EAAEzB,aAAc;MACxBiB,KAAK,EAAE;QAAE9B,KAAK,EAAEiB;MAAU;IAAE,GAE3BuB,OAAO,CAACK,KAAK,gBACZ1D,KAAA,CAAAwC,aAAA,CAACnC,aAAa;MACZqD,KAAK,EAAEL,OAAO,CAACK,KAAM;MACrBF,MAAM,EAAED,MAAO;MACfvC,SAAS,EAAEA;IAAU,CACtB,CAAC,GACA,IAAI,EACP,OAAOqC,OAAO,CAACM,OAAO,KAAK,UAAU,GAClCN,OAAO,CAACM,OAAO,CAAC;MAAEL,SAAS;MAAEC;IAAO,CAAC,CAAC,GACtCF,OAAO,CAACM,OACA,CACC,CACO,CAAC;EAE/B,CAAC,CACE,CACW,CAAC;AAEvB,CAAC;AAEDhD,oBAAoB,CAACiD,WAAW,GAAG,sBAAsB","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CSSProperties, FC, PropsWithChildren } from "react";
|
|
2
|
+
export interface MeasuredPaneProps {
|
|
3
|
+
/** Reports height only while the pane is the visible one */
|
|
4
|
+
active: boolean;
|
|
5
|
+
/** Receives the measured height, in pixels */
|
|
6
|
+
onHeight: (height: number) => void;
|
|
7
|
+
style?: CSSProperties;
|
|
8
|
+
}
|
|
9
|
+
export declare const MeasuredPane: FC<PropsWithChildren<MeasuredPaneProps>>;
|
|
10
|
+
//# sourceMappingURL=MeasuredPane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeasuredPane.d.ts","sourceRoot":"","sources":["../../../../src/components/DrilldownMenu/MeasuredPane.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,aAAa,EACb,EAAE,EACF,iBAAiB,EAIlB,MAAM,OAAO,CAAC;AAIf,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,MAAM,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CA+CjE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
2
|
+
import ResizeObserver from "resize-observer-polyfill";
|
|
3
|
+
export const MeasuredPane = _ref => {
|
|
4
|
+
let active = _ref.active,
|
|
5
|
+
onHeight = _ref.onHeight,
|
|
6
|
+
style = _ref.style,
|
|
7
|
+
children = _ref.children;
|
|
8
|
+
const _useState = useState(null),
|
|
9
|
+
node = _useState[0],
|
|
10
|
+
setNode = _useState[1];
|
|
11
|
+
const reported = useRef(0);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (!active || !node) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
reported.current = 0;
|
|
17
|
+
let frame = 0;
|
|
18
|
+
|
|
19
|
+
// The reported height lands on an ancestor of the measured element, so a
|
|
20
|
+
// shrink can hand the observer back a taller box and loop forever. While a
|
|
21
|
+
// pane stays open the height only grows, and every slide starts over.
|
|
22
|
+
const observer = new ResizeObserver(entries => {
|
|
23
|
+
var _entries$;
|
|
24
|
+
const height = Math.round(((_entries$ = entries[0]) == null || (_entries$ = _entries$.contentRect) == null ? void 0 : _entries$.height) || 0);
|
|
25
|
+
if (height <= reported.current) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
reported.current = height;
|
|
29
|
+
cancelAnimationFrame(frame);
|
|
30
|
+
frame = requestAnimationFrame(() => onHeight(height));
|
|
31
|
+
});
|
|
32
|
+
observer.observe(node);
|
|
33
|
+
return () => {
|
|
34
|
+
cancelAnimationFrame(frame);
|
|
35
|
+
observer.disconnect();
|
|
36
|
+
};
|
|
37
|
+
}, [active, node, onHeight]);
|
|
38
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
39
|
+
ref: setNode,
|
|
40
|
+
style: style
|
|
41
|
+
}, children);
|
|
42
|
+
};
|
|
43
|
+
MeasuredPane.displayName = "MeasuredPane";
|
|
44
|
+
//# sourceMappingURL=MeasuredPane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeasuredPane.js","names":["React","useEffect","useRef","useState","ResizeObserver","MeasuredPane","_ref","active","onHeight","style","children","_useState","node","setNode","reported","undefined","current","frame","observer","entries","_entries$","height","Math","round","contentRect","cancelAnimationFrame","requestAnimationFrame","observe","disconnect","createElement","ref","displayName"],"sources":["../../../../src/components/DrilldownMenu/MeasuredPane.tsx"],"sourcesContent":["import React, {\n CSSProperties,\n FC,\n PropsWithChildren,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport ResizeObserver from \"resize-observer-polyfill\";\n\nexport interface MeasuredPaneProps {\n /** Reports height only while the pane is the visible one */\n active: boolean;\n /** Receives the measured height, in pixels */\n onHeight: (height: number) => void;\n style?: CSSProperties;\n}\n\nexport const MeasuredPane: FC<PropsWithChildren<MeasuredPaneProps>> = ({\n active,\n onHeight,\n style,\n children,\n}) => {\n const [node, setNode] = useState<HTMLDivElement | null>(null);\n const reported = useRef(0);\n\n useEffect(() => {\n if (!active || !node) {\n return undefined;\n }\n\n reported.current = 0;\n\n let frame = 0;\n\n // The reported height lands on an ancestor of the measured element, so a\n // shrink can hand the observer back a taller box and loop forever. While a\n // pane stays open the height only grows, and every slide starts over.\n const observer = new ResizeObserver((entries) => {\n const height = Math.round(entries[0]?.contentRect?.height || 0);\n\n if (height <= reported.current) {\n return;\n }\n\n reported.current = height;\n\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => onHeight(height));\n });\n\n observer.observe(node);\n\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [active, node, onHeight]);\n\n return (\n <div ref={setNode} style={style}>\n {children}\n </div>\n );\n};\n\nMeasuredPane.displayName = \"MeasuredPane\";\n"],"mappings":"AAAA,OAAOA,KAAK,IAIVC,SAAS,EACTC,MAAM,EACNC,QAAQ,QACH,OAAO;AAEd,OAAOC,cAAc,MAAM,0BAA0B;AAUrD,OAAO,MAAMC,YAAsD,GAAGC,IAAA,IAKhE;EAAA,IAJJC,MAAM,GAAAD,IAAA,CAANC,MAAM;IACNC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;IACRC,KAAK,GAAAH,IAAA,CAALG,KAAK;IACLC,QAAQ,GAAAJ,IAAA,CAARI,QAAQ;EAER,MAAAC,SAAA,GAAwBR,QAAQ,CAAwB,IAAI,CAAC;IAAtDS,IAAI,GAAAD,SAAA;IAAEE,OAAO,GAAAF,SAAA;EACpB,MAAMG,QAAQ,GAAGZ,MAAM,CAAC,CAAC,CAAC;EAE1BD,SAAS,CAAC,MAAM;IACd,IAAI,CAACM,MAAM,IAAI,CAACK,IAAI,EAAE;MACpB,OAAOG,SAAS;IAClB;IAEAD,QAAQ,CAACE,OAAO,GAAG,CAAC;IAEpB,IAAIC,KAAK,GAAG,CAAC;;IAEb;IACA;IACA;IACA,MAAMC,QAAQ,GAAG,IAAId,cAAc,CAAEe,OAAO,IAAK;MAAA,IAAAC,SAAA;MAC/C,MAAMC,MAAM,GAAGC,IAAI,CAACC,KAAK,CAAC,EAAAH,SAAA,GAAAD,OAAO,CAAC,CAAC,CAAC,cAAAC,SAAA,GAAVA,SAAA,CAAYI,WAAW,qBAAvBJ,SAAA,CAAyBC,MAAM,KAAI,CAAC,CAAC;MAE/D,IAAIA,MAAM,IAAIP,QAAQ,CAACE,OAAO,EAAE;QAC9B;MACF;MAEAF,QAAQ,CAACE,OAAO,GAAGK,MAAM;MAEzBI,oBAAoB,CAACR,KAAK,CAAC;MAC3BA,KAAK,GAAGS,qBAAqB,CAAC,MAAMlB,QAAQ,CAACa,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC;IAEFH,QAAQ,CAACS,OAAO,CAACf,IAAI,CAAC;IAEtB,OAAO,MAAM;MACXa,oBAAoB,CAACR,KAAK,CAAC;MAC3BC,QAAQ,CAACU,UAAU,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACrB,MAAM,EAAEK,IAAI,EAAEJ,QAAQ,CAAC,CAAC;EAE5B,oBACER,KAAA,CAAA6B,aAAA;IAAKC,GAAG,EAAEjB,OAAQ;IAACJ,KAAK,EAAEA;EAAM,GAC7BC,QACE,CAAC;AAEV,CAAC;AAEDL,YAAY,CAAC0B,WAAW,GAAG,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ListProps } from "../List";
|
|
2
|
+
import { IMenu } from "../Menu";
|
|
3
|
+
export declare const StyledMenu: import("styled-components").StyledComponent<import("react").FC<IMenu>, any, IMenu & {
|
|
4
|
+
$paned?: boolean;
|
|
5
|
+
}, never>;
|
|
6
|
+
export declare const StyledIndexList: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<ListProps & {
|
|
7
|
+
children?: import("react").ReactNode | undefined;
|
|
8
|
+
} & import("react").HTMLAttributes<HTMLUListElement> & import("react").RefAttributes<HTMLUListElement>> & {
|
|
9
|
+
Item: import("react").ForwardRefExoticComponent<import("..").ListItemProps & {
|
|
10
|
+
children?: import("react").ReactNode | undefined;
|
|
11
|
+
} & import("react").HTMLAttributes<HTMLLIElement> & import("react").RefAttributes<HTMLLIElement>>;
|
|
12
|
+
Separator: {
|
|
13
|
+
({ className, ...props }: import("react").HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
14
|
+
displayName: string;
|
|
15
|
+
};
|
|
16
|
+
}, any, ListProps, never>;
|
|
17
|
+
//# sourceMappingURL=Styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Styles.d.ts","sourceRoot":"","sources":["../../../../src/components/DrilldownMenu/Styles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAQ,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAQ,KAAK,EAAE,MAAM,SAAS,CAAC;AAEtC,eAAO,MAAM,UAAU;aAAmC,OAAO;SAEhE,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;yBAE3B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import styled from "styled-components";
|
|
2
|
+
import { List } from "../List";
|
|
3
|
+
import { Menu } from "../Menu";
|
|
4
|
+
export const StyledMenu = styled(Menu).withConfig({
|
|
5
|
+
displayName: "Styles__StyledMenu",
|
|
6
|
+
componentId: "sc-15ei9o0-0"
|
|
7
|
+
})(["", ""], _ref => {
|
|
8
|
+
let $paned = _ref.$paned;
|
|
9
|
+
return $paned && {
|
|
10
|
+
"position": "relative",
|
|
11
|
+
"overflow": "hidden"
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
export const StyledIndexList = styled(List).withConfig({
|
|
15
|
+
displayName: "Styles__StyledIndexList",
|
|
16
|
+
componentId: "sc-15ei9o0-1"
|
|
17
|
+
})(["", ""], {
|
|
18
|
+
"paddingTop": "0.5rem",
|
|
19
|
+
"paddingBottom": "0.5rem"
|
|
20
|
+
});
|
|
21
|
+
StyledMenu.displayName = "StyledDrilldownMenu";
|
|
22
|
+
StyledIndexList.displayName = "StyledDrilldownIndexList";
|
|
23
|
+
//# sourceMappingURL=Styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Styles.js","names":["styled","List","Menu","StyledMenu","withConfig","displayName","componentId","_ref","$paned","StyledIndexList"],"sources":["../../../../src/components/DrilldownMenu/Styles.ts"],"sourcesContent":["import styled from \"styled-components\";\nimport tw from \"twin.macro\";\n\nimport { List, ListProps } from \"../List\";\nimport { Menu, IMenu } from \"../Menu\";\n\nexport const StyledMenu = styled(Menu)<IMenu & { $paned?: boolean }>`\n ${({ $paned }) => $paned && tw`tw-relative tw-overflow-hidden`}\n`;\n\nexport const StyledIndexList = styled(List)<ListProps>`\n ${tw`tw-py-2`}\n`;\n\nStyledMenu.displayName = \"StyledDrilldownMenu\";\nStyledIndexList.displayName = \"StyledDrilldownIndexList\";\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,mBAAmB;AAGtC,SAASC,IAAI,QAAmB,SAAS;AACzC,SAASC,IAAI,QAAe,SAAS;AAErC,OAAO,MAAMC,UAAU,GAAGH,MAAM,CAACE,IAAI,CAAC,CAAAE,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,aAClCC,IAAA;EAAA,IAAGC,MAAM,GAAAD,IAAA,CAANC,MAAM;EAAA,OAAOA,MAAM,IAAM;IAAA;IAAA;EAA+B,CAAC;AAAA,EAC/D;AAED,OAAO,MAAMC,eAAe,GAAGT,MAAM,CAACC,IAAI,CAAC,CAAAG,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,aACrC;EAAA;EAAA;AAAQ,CAAC,CACd;AAEDH,UAAU,CAACE,WAAW,GAAG,qBAAqB;AAC9CI,eAAe,CAACJ,WAAW,GAAG,0BAA0B","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
export interface SubmenuHeaderProps {
|
|
3
|
+
/** Title of the pane */
|
|
4
|
+
title: string;
|
|
5
|
+
/** Leaves the pane. Without it the header carries no back button */
|
|
6
|
+
onBack?: () => void;
|
|
7
|
+
/** Accessible label of the back button */
|
|
8
|
+
backLabel?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const SubmenuHeader: FC<SubmenuHeaderProps>;
|
|
11
|
+
//# sourceMappingURL=SubmenuHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubmenuHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/DrilldownMenu/SubmenuHeader.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAMlC,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAoBhD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { IconButton } from "../IconButton";
|
|
3
|
+
import { ArrowLeftIcon } from "../Icons";
|
|
4
|
+
import { MenuHeader } from "../Menu";
|
|
5
|
+
export const SubmenuHeader = _ref => {
|
|
6
|
+
let title = _ref.title,
|
|
7
|
+
onBack = _ref.onBack,
|
|
8
|
+
_ref$backLabel = _ref.backLabel,
|
|
9
|
+
backLabel = _ref$backLabel === void 0 ? "Back" : _ref$backLabel;
|
|
10
|
+
return /*#__PURE__*/React.createElement(MenuHeader, {
|
|
11
|
+
title: title,
|
|
12
|
+
leftElement: onBack ? /*#__PURE__*/React.createElement(IconButton, {
|
|
13
|
+
variant: "text gray",
|
|
14
|
+
size: "small",
|
|
15
|
+
onClick: onBack,
|
|
16
|
+
"aria-label": backLabel
|
|
17
|
+
}, /*#__PURE__*/React.createElement(ArrowLeftIcon, null)) : null
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
SubmenuHeader.displayName = "SubmenuHeader";
|
|
21
|
+
//# sourceMappingURL=SubmenuHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubmenuHeader.js","names":["React","IconButton","ArrowLeftIcon","MenuHeader","SubmenuHeader","_ref","title","onBack","_ref$backLabel","backLabel","createElement","leftElement","variant","size","onClick","displayName"],"sources":["../../../../src/components/DrilldownMenu/SubmenuHeader.tsx"],"sourcesContent":["import React, { FC } from \"react\";\n\nimport { IconButton } from \"../IconButton\";\nimport { ArrowLeftIcon } from \"../Icons\";\nimport { MenuHeader } from \"../Menu\";\n\nexport interface SubmenuHeaderProps {\n /** Title of the pane */\n title: string;\n /** Leaves the pane. Without it the header carries no back button */\n onBack?: () => void;\n /** Accessible label of the back button */\n backLabel?: string;\n}\n\nexport const SubmenuHeader: FC<SubmenuHeaderProps> = ({\n title,\n onBack,\n backLabel = \"Back\",\n}) => (\n <MenuHeader\n title={title}\n leftElement={\n onBack ? (\n <IconButton\n variant=\"text gray\"\n size=\"small\"\n onClick={onBack}\n aria-label={backLabel}\n >\n <ArrowLeftIcon />\n </IconButton>\n ) : null\n }\n />\n);\n\nSubmenuHeader.displayName = \"SubmenuHeader\";\n"],"mappings":"AAAA,OAAOA,KAAK,MAAc,OAAO;AAEjC,SAASC,UAAU,QAAQ,eAAe;AAC1C,SAASC,aAAa,QAAQ,UAAU;AACxC,SAASC,UAAU,QAAQ,SAAS;AAWpC,OAAO,MAAMC,aAAqC,GAAGC,IAAA;EAAA,IACnDC,KAAK,GAAAD,IAAA,CAALC,KAAK;IACLC,MAAM,GAAAF,IAAA,CAANE,MAAM;IAAAC,cAAA,GAAAH,IAAA,CACNI,SAAS;IAATA,SAAS,GAAAD,cAAA,cAAG,MAAM,GAAAA,cAAA;EAAA,oBAElBR,KAAA,CAAAU,aAAA,CAACP,UAAU;IACTG,KAAK,EAAEA,KAAM;IACbK,WAAW,EACTJ,MAAM,gBACJP,KAAA,CAAAU,aAAA,CAACT,UAAU;MACTW,OAAO,EAAC,WAAW;MACnBC,IAAI,EAAC,OAAO;MACZC,OAAO,EAAEP,MAAO;MAChB,cAAYE;IAAU,gBAEtBT,KAAA,CAAAU,aAAA,CAACR,aAAa,MAAE,CACN,CAAC,GACX;EACL,CACF,CAAC;AAAA,CACH;AAEDE,aAAa,CAACW,WAAW,GAAG,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/DrilldownMenu/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/DrilldownMenu/index.ts"],"sourcesContent":["export * from \"./DrilldownMenu\";\nexport * from \"./DrilldownMenuContent\";\nexport * from \"./MeasuredPane\";\nexport * from \"./SubmenuHeader\";\n"],"mappings":"AAAA,cAAc,iBAAiB;AAC/B,cAAc,wBAAwB;AACtC,cAAc,gBAAgB;AAC9B,cAAc,iBAAiB","ignoreList":[]}
|