@ynput/ayon-frontend-shared 0.4.2 → 0.4.3
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/ProjectTreeTable.cjs.js +1 -1
- package/dist/ProjectTreeTable.es.js +247 -243
- package/dist/_virtual/index.cjs22.js +1 -1
- package/dist/_virtual/index.cjs23.js +1 -1
- package/dist/_virtual/index.cjs24.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.es22.js +3 -3
- package/dist/_virtual/index.es23.js +5 -5
- package/dist/_virtual/index.es24.js +5 -5
- package/dist/_virtual/index.es4.js +2 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -2
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/api.cjs.js +1 -1
- package/dist/api.es.js +446 -445
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +20 -9
- package/dist/index.es.js.map +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
- package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
- package/dist/shared/node_modules/react-is/index.es.js +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +85 -28
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +129 -68
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js +36 -36
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.cjs.js +12 -6
- package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.es.js +69 -62
- package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +32 -12
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -2
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +33 -33
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +39 -8
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +32 -31
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js +24 -18
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js +26 -25
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js +14 -2
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +125 -126
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +14 -8
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +200 -178
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +14 -3
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js +6 -3
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +19 -19
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +5 -3
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +100 -97
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +9 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +47 -31
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +28 -9
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +58 -39
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +53 -25
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +150 -103
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +9 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +66 -57
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +9 -8
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +20 -4
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +86 -67
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js +11 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js.map +1 -0
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js +67 -62
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +47 -46
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.es.js +1 -1
- package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js +36 -33
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js.map +1 -1
- package/dist/types/api/generated/graphql.d.ts +71 -0
- package/dist/types/api/queries/activities/getActivities.d.ts +28 -0
- package/dist/types/api/queries/entities/getEntity.d.ts +14 -0
- package/dist/types/api/queries/entities/getEntityPanel.d.ts +14 -0
- package/dist/types/api/queries/entities/updateEntity.d.ts +14 -0
- package/dist/types/api/queries/entityLists/getLists.d.ts +14 -0
- package/dist/types/api/queries/overview/getOverview.d.ts +14 -0
- package/dist/types/api/queries/project/getProject.d.ts +14 -0
- package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +14 -0
- package/dist/types/api/queries/users/getUsers.d.ts +14 -0
- package/dist/types/api/queries/versions/getVersionsProducts.d.ts +28 -0
- package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +4 -1
- package/dist/types/containers/Feed/helpers/buildBackendFilter.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/constants.d.ts +3 -0
- package/dist/types/containers/ProjectTreeTable/widgets/SubtasksWidget.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/widgets/wrapMode.d.ts +2 -0
- package/dist/types/containers/Views/context/ViewsContext.d.ts +1 -0
- package/dist/types/util/buildHierarchicalTableRows.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../base/client.cjs.js");const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../base/client.cjs.js");const a=require("../../generated/graphql.cjs.js");require("../../generated/graphqlLinks.cjs.js");require("../../generated/access.cjs.js");require("../../generated/actions.cjs.js");require("../../generated/activityFeed.cjs.js");require("../../generated/addons.cjs.js");require("../../generated/anatomy.cjs.js");require("../../generated/attributes.cjs.js");require("../../generated/authentication.cjs.js");require("../../generated/bundles.cjs.js");require("../../generated/configuration.cjs.js");require("../../generated/dataImport.cjs.js");require("../../generated/desktop.cjs.js");require("../../generated/entityLists.cjs.js");require("../../generated/events.cjs.js");require("../../generated/files.cjs.js");require("../../generated/folders.cjs.js");require("../../generated/inbox.cjs.js");require("../../generated/links.cjs.js");require("../../generated/market.cjs.js");require("../../generated/onboarding.cjs.js");require("../../generated/operations.cjs.js");require("../../generated/products.cjs.js");require("../../generated/projectDashboard.cjs.js");require("../../generated/projects.cjs.js");require("../../generated/projectFolders.cjs.js");require("../../generated/reviewables.cjs.js");require("../../generated/services.cjs.js");require("../../generated/system.cjs.js");require("../../generated/tasks.cjs.js");require("../../generated/teams.cjs.js");require("../../generated/thumbnails.cjs.js");require("../../generated/uRIs.cjs.js");require("../../generated/users.cjs.js");require("../../generated/versions.cjs.js");require("../../generated/workfiles.cjs.js");require("../../generated/ynputCloud.cjs.js");require("../../generated/grouping.cjs.js");require("../../generated/views.cjs.js");const S=require("../../../containers/ProjectTreeTable/utils/checkColumnVisibility.cjs.js"),h=e=>{const r=e?.targets;return Array.isArray(r)?r:r?[r]:[]},d=(e,r,n)=>{const i=r?.[e],o=n?.[e];return i==="none"||o==="none"?!1:i!=null||o!=null},b=(e,r,n,i)=>{const o=new Set([...Object.keys(e??{}),...Object.keys(r??{})]);for(const c of o)if(!(n&&!S.checkColumnVisibility(n,c,i))&&d(c,e,r))return!0;return!1},F=(e,r,n,i)=>r?.name==="none"&&!b(e,r,n,i),k=(e,r)=>{if(!e)return!1;if(!r)return!0;const n=new Set(h(r).map(i=>i.field));return h(e).some(i=>!n.has(i.field))},q=[a.StatsOperation.Filled,a.StatsOperation.NotFilled],m=[a.StatsOperation.Min,a.StatsOperation.Max,a.StatsOperation.Avg,a.StatsOperation.Sum,a.StatsOperation.Filled,a.StatsOperation.NotFilled],u=[a.StatsOperation.Filled,a.StatsOperation.NotFilled,a.StatsOperation.Distribution],_={folder:"folder_type",task:"task_type",product:"product_type",version:null},v=({entity:e,attribs:r,columnVisibility:n,defaultColumnVisibility:i,columnSummaries:o,columnSummaryScopes:c,extraFields:y=[]})=>{const O=t=>S.checkColumnVisibility(n,t,i),l=t=>O(t)&&d(t,o,c),s=[];e==="version"?s.push({field:"status",aggregations:l("status")?u:q}):(s.push({field:"name",aggregations:q}),l("status")&&s.push({field:"status",aggregations:u})),l("tags")&&s.push({field:"tags",aggregations:u}),e==="task"&&l("assignees")&&s.push({field:"assignees",aggregations:u});const p=_[e];p&&l("subType")&&s.push({field:p,aggregations:u});for(const t of y)s.push({field:t,aggregations:u});for(const t of r){if(t.scope&&!t.scope.includes(e)||!l(`attrib_${t.name}`))continue;let f=`attrib.${t.name}`;["folder","task"].includes(e)&&(f=`inherited_attributes.${t.name}`);const g=t.data?.type;g==="integer"||g==="float"?s.push({field:f,aggregations:m}):g==="string"?s.push({field:f,aggregations:t.data?.enum?.length?u:q}):(g==="list_of_strings"||g==="list_of_integers")&&s.push({field:f,aggregations:u})}return s};exports.anySummaryActive=b;exports.buildMetricTargets=v;exports.hasNewTargetFields=k;exports.isSummaryActive=d;exports.shouldSkipColumnStats=F;
|
|
2
2
|
//# sourceMappingURL=metricTargets.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metricTargets.cjs.js","sources":["../../../../../../src/api/queries/columnStats/metricTargets.ts"],"sourcesContent":["import type { VisibilityState } from '@tanstack/react-table'\nimport { StatsOperation } from '@shared/api/generated'\nimport { checkColumnVisibility } from '@shared/containers/ProjectTreeTable/utils/checkColumnVisibility'\nimport type { SummaryCalc, RowScope } from '@shared/containers/ProjectTreeTable/types/summaryTypes'\n\nexport type MetricTarget = {\n field: string // column or dot-path for JSONB, e.g. 'status' / 'attrib.fps'\n aggregations: StatsOperation[]\n}\n\nexport type StatsEntity = 'folder' | 'task' | 'product' | 'version'\n\n// matches both MetricTarget[] and the codegen'd single-or-array variables type\ntype TargetsArg = { targets?: { field: string }[] | { field: string } | null }\nconst targetFields = (arg?: TargetsArg): { field: string }[] => {\n const t = arg?.targets\n return Array.isArray(t) ? t : t ? [t] : []\n}\n\nexport const isSummaryActive = (\n columnId: string,\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n): boolean => {\n const calc = columnSummaries?.[columnId]\n const scope = columnSummaryScopes?.[columnId]\n if (calc === 'none' || scope === 'none') return false\n return calc != null || scope != null\n}\n\n// True when at least one *visible* column has an active summary — lets callers\n// skip the whole column-stats query when the user has every summary switched off.\n// Visibility matters: a hidden column can still carry a stale summary value, but\n// buildMetricTargets skips it, so it must not keep the query alive either.\nexport const anySummaryActive = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean => {\n const ids = new Set([\n ...Object.keys(columnSummaries ?? {}),\n ...Object.keys(columnSummaryScopes ?? {}),\n ])\n for (const id of ids) {\n if (columnVisibility && !checkColumnVisibility(columnVisibility, id, defaultColumnVisibility)) {\n continue\n }\n if (isSummaryActive(id, columnSummaries, columnSummaryScopes)) return true\n }\n return false\n}\n\n// The main count (name column) is on by default, so the footer always has at\n// least that to show. Skip the stats fetch only when the user has explicitly\n// turned the name count off too AND no other column has an active summary —\n// otherwise the name cell has no data and can't be re-enabled.\nexport const shouldSkipColumnStats = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean =>\n columnSummaryScopes?.['name'] === 'none' &&\n !anySummaryActive(columnSummaries, columnSummaryScopes, columnVisibility, defaultColumnVisibility)\n\n// refetch only when a target was added — hiding a column needs no query\nexport const hasNewTargetFields = (current?: TargetsArg, previous?: TargetsArg): boolean => {\n if (!current) return false\n if (!previous) return true\n const prevFields = new Set(targetFields(previous).map((t) => t.field))\n return targetFields(current).some((t) => !prevFields.has(t.field))\n}\n\nconst COUNTS: StatsOperation[] = [StatsOperation.Filled, StatsOperation.NotFilled]\n// FILLED rides along so combined-scope averages can be weighted exactly\nconst NUMERIC: StatsOperation[] = [\n StatsOperation.Min,\n StatsOperation.Max,\n StatsOperation.Avg,\n StatsOperation.Sum,\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n]\n// enum columns: counts power the fallback display, distribution the colored bar\nconst ENUM: StatsOperation[] = [\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n StatsOperation.Distribution,\n]\n\n// The table's unified subType column per entity (result columnName maps back\n// to subType via COLUMN_ALIASES in columnStats).\nconst SUB_TYPE_FIELD: Record<StatsEntity, string | null> = {\n folder: 'folder_type',\n task: 'task_type',\n product: 'product_type',\n version: null,\n}\n\n// Structural subset of ProjectTableAttribute — two near-identical versions of\n// that type exist (types/index vs hooks/useAttributesList, data.type optional\n// in the latter); only these fields are needed here so accept both.\ntype AttribFieldLike = {\n name: string\n scope?: string[] | null\n data?: { type?: string; enum?: unknown[] }\n}\n\ntype BuildMetricTargetsArgs = {\n entity: StatsEntity\n attribs: AttribFieldLike[]\n columnVisibility: VisibilityState\n // resolved the same way the table resolves it (opt-in): a column absent from\n // both maps is hidden, so it must NOT be aggregated\n defaultColumnVisibility?: VisibilityState\n columnSummaries?: Record<string, SummaryCalc>\n columnSummaryScopes?: Record<string, RowScope>\n extraFields?: string[] // visible, summary-active page columns, e.g. 'product_base_type'\n}\n\n// Targets for the footer over the columns the user can actually see.\n// Skipped on purpose (backend SQL can't aggregate them safely yet):\n// datetime (numeric cast fails), boolean attribs (text-vs-bool compare on\n// JSONB), and list-type attribs.\nexport const buildMetricTargets = ({\n entity,\n attribs,\n columnVisibility,\n defaultColumnVisibility,\n columnSummaries,\n columnSummaryScopes,\n extraFields = [],\n}: BuildMetricTargetsArgs): MetricTarget[] => {\n const isVisible = (columnId: string) =>\n checkColumnVisibility(columnVisibility, columnId, defaultColumnVisibility)\n const isActive = (columnId: string) =>\n isVisible(columnId) && isSummaryActive(columnId, columnSummaries, columnSummaryScopes)\n\n const targets: MetricTarget[] = []\n if (entity === 'version') {\n // versions have no `name` column (display name derives from the version\n // number) — status is non-null and doubles as the row-count anchor, so it\n targets.push({ field: 'status', aggregations: isActive('status') ? ENUM : COUNTS })\n } else {\n // name counts always — they feed the main folders/tasks count cell\n targets.push({ field: 'name', aggregations: COUNTS })\n if (isActive('status')) targets.push({ field: 'status', aggregations: ENUM })\n }\n if (isActive('tags')) targets.push({ field: 'tags', aggregations: ENUM })\n if (entity === 'task' && isActive('assignees')) {\n targets.push({ field: 'assignees', aggregations: ENUM })\n }\n\n const subTypeField = SUB_TYPE_FIELD[entity]\n if (subTypeField && isActive('subType')) {\n targets.push({ field: subTypeField, aggregations: ENUM })\n }\n\n for (const field of extraFields) {\n targets.push({ field, aggregations: ENUM })\n }\n\n for (const attrib of attribs) {\n if (attrib.scope && !attrib.scope.includes(entity)) continue\n if (!isActive(`attrib_${attrib.name}`)) continue\n\n let field = `attrib.${attrib.name}`\n if (['folder', 'task'].includes(entity)) {\n field = `inherited_attributes.${attrib.name}`\n }\n const type = attrib.data?.type\n if (type === 'integer' || type === 'float') {\n targets.push({ field, aggregations: NUMERIC })\n } else if (type === 'string') {\n targets.push({ field, aggregations: attrib.data?.enum?.length ? ENUM : COUNTS })\n }\n }\n\n return targets\n}\n"],"names":["targetFields","arg","t","isSummaryActive","columnId","columnSummaries","columnSummaryScopes","calc","scope","anySummaryActive","columnVisibility","defaultColumnVisibility","ids","id","checkColumnVisibility","shouldSkipColumnStats","hasNewTargetFields","current","previous","prevFields","COUNTS","StatsOperation","NUMERIC","ENUM","SUB_TYPE_FIELD","buildMetricTargets","entity","attribs","extraFields","isVisible","isActive","targets","subTypeField","field","attrib","type"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metricTargets.cjs.js","sources":["../../../../../../src/api/queries/columnStats/metricTargets.ts"],"sourcesContent":["import type { VisibilityState } from '@tanstack/react-table'\nimport { StatsOperation } from '@shared/api/generated'\nimport { checkColumnVisibility } from '@shared/containers/ProjectTreeTable/utils/checkColumnVisibility'\nimport type { SummaryCalc, RowScope } from '@shared/containers/ProjectTreeTable/types/summaryTypes'\n\nexport type MetricTarget = {\n field: string // column or dot-path for JSONB, e.g. 'status' / 'attrib.fps'\n aggregations: StatsOperation[]\n}\n\nexport type StatsEntity = 'folder' | 'task' | 'product' | 'version'\n\n// matches both MetricTarget[] and the codegen'd single-or-array variables type\ntype TargetsArg = { targets?: { field: string }[] | { field: string } | null }\nconst targetFields = (arg?: TargetsArg): { field: string }[] => {\n const t = arg?.targets\n return Array.isArray(t) ? t : t ? [t] : []\n}\n\nexport const isSummaryActive = (\n columnId: string,\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n): boolean => {\n const calc = columnSummaries?.[columnId]\n const scope = columnSummaryScopes?.[columnId]\n if (calc === 'none' || scope === 'none') return false\n return calc != null || scope != null\n}\n\n// True when at least one *visible* column has an active summary — lets callers\n// skip the whole column-stats query when the user has every summary switched off.\n// Visibility matters: a hidden column can still carry a stale summary value, but\n// buildMetricTargets skips it, so it must not keep the query alive either.\nexport const anySummaryActive = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean => {\n const ids = new Set([\n ...Object.keys(columnSummaries ?? {}),\n ...Object.keys(columnSummaryScopes ?? {}),\n ])\n for (const id of ids) {\n if (columnVisibility && !checkColumnVisibility(columnVisibility, id, defaultColumnVisibility)) {\n continue\n }\n if (isSummaryActive(id, columnSummaries, columnSummaryScopes)) return true\n }\n return false\n}\n\n// The main count (name column) is on by default, so the footer always has at\n// least that to show. Skip the stats fetch only when the user has explicitly\n// turned the name count off too AND no other column has an active summary —\n// otherwise the name cell has no data and can't be re-enabled.\nexport const shouldSkipColumnStats = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean =>\n columnSummaryScopes?.['name'] === 'none' &&\n !anySummaryActive(columnSummaries, columnSummaryScopes, columnVisibility, defaultColumnVisibility)\n\n// refetch only when a target was added — hiding a column needs no query\nexport const hasNewTargetFields = (current?: TargetsArg, previous?: TargetsArg): boolean => {\n if (!current) return false\n if (!previous) return true\n const prevFields = new Set(targetFields(previous).map((t) => t.field))\n return targetFields(current).some((t) => !prevFields.has(t.field))\n}\n\nconst COUNTS: StatsOperation[] = [StatsOperation.Filled, StatsOperation.NotFilled]\n// FILLED rides along so combined-scope averages can be weighted exactly\nconst NUMERIC: StatsOperation[] = [\n StatsOperation.Min,\n StatsOperation.Max,\n StatsOperation.Avg,\n StatsOperation.Sum,\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n]\n// enum columns: counts power the fallback display, distribution the colored bar\nconst ENUM: StatsOperation[] = [\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n StatsOperation.Distribution,\n]\n\n// The table's unified subType column per entity (result columnName maps back\n// to subType via COLUMN_ALIASES in columnStats).\nconst SUB_TYPE_FIELD: Record<StatsEntity, string | null> = {\n folder: 'folder_type',\n task: 'task_type',\n product: 'product_type',\n version: null,\n}\n\n// Structural subset of ProjectTableAttribute — two near-identical versions of\n// that type exist (types/index vs hooks/useAttributesList, data.type optional\n// in the latter); only these fields are needed here so accept both.\ntype AttribFieldLike = {\n name: string\n scope?: string[] | null\n data?: { type?: string; enum?: unknown[] }\n}\n\ntype BuildMetricTargetsArgs = {\n entity: StatsEntity\n attribs: AttribFieldLike[]\n columnVisibility: VisibilityState\n // resolved the same way the table resolves it (opt-in): a column absent from\n // both maps is hidden, so it must NOT be aggregated\n defaultColumnVisibility?: VisibilityState\n columnSummaries?: Record<string, SummaryCalc>\n columnSummaryScopes?: Record<string, RowScope>\n extraFields?: string[] // visible, summary-active page columns, e.g. 'product_base_type'\n}\n\n// Targets for the footer over the columns the user can actually see.\n// Skipped on purpose — the backend errors on these, and one bad target fails\n// the whole query, killing every other column's stats too:\n// datetime (\"cannot cast type timestamp with time zone to numeric\") and\n// boolean attribs (\"operator does not exist: text = boolean\").\nexport const buildMetricTargets = ({\n entity,\n attribs,\n columnVisibility,\n defaultColumnVisibility,\n columnSummaries,\n columnSummaryScopes,\n extraFields = [],\n}: BuildMetricTargetsArgs): MetricTarget[] => {\n const isVisible = (columnId: string) =>\n checkColumnVisibility(columnVisibility, columnId, defaultColumnVisibility)\n const isActive = (columnId: string) =>\n isVisible(columnId) && isSummaryActive(columnId, columnSummaries, columnSummaryScopes)\n\n const targets: MetricTarget[] = []\n if (entity === 'version') {\n // versions have no `name` column (display name derives from the version\n // number) — status is non-null and doubles as the row-count anchor, so it\n targets.push({ field: 'status', aggregations: isActive('status') ? ENUM : COUNTS })\n } else {\n // name counts always — they feed the main folders/tasks count cell\n targets.push({ field: 'name', aggregations: COUNTS })\n if (isActive('status')) targets.push({ field: 'status', aggregations: ENUM })\n }\n if (isActive('tags')) targets.push({ field: 'tags', aggregations: ENUM })\n if (entity === 'task' && isActive('assignees')) {\n targets.push({ field: 'assignees', aggregations: ENUM })\n }\n\n const subTypeField = SUB_TYPE_FIELD[entity]\n if (subTypeField && isActive('subType')) {\n targets.push({ field: subTypeField, aggregations: ENUM })\n }\n\n for (const field of extraFields) {\n targets.push({ field, aggregations: ENUM })\n }\n\n for (const attrib of attribs) {\n if (attrib.scope && !attrib.scope.includes(entity)) continue\n if (!isActive(`attrib_${attrib.name}`)) continue\n\n let field = `attrib.${attrib.name}`\n if (['folder', 'task'].includes(entity)) {\n field = `inherited_attributes.${attrib.name}`\n }\n const type = attrib.data?.type\n if (type === 'integer' || type === 'float') {\n targets.push({ field, aggregations: NUMERIC })\n } else if (type === 'string') {\n targets.push({ field, aggregations: attrib.data?.enum?.length ? ENUM : COUNTS })\n } else if (type === 'list_of_strings' || type === 'list_of_integers') {\n // backend buckets the whole array as one serialized value; normalizeDistribution unnests it\n targets.push({ field, aggregations: ENUM })\n }\n }\n\n return targets\n}\n"],"names":["targetFields","arg","t","isSummaryActive","columnId","columnSummaries","columnSummaryScopes","calc","scope","anySummaryActive","columnVisibility","defaultColumnVisibility","ids","id","checkColumnVisibility","shouldSkipColumnStats","hasNewTargetFields","current","previous","prevFields","COUNTS","StatsOperation","NUMERIC","ENUM","SUB_TYPE_FIELD","buildMetricTargets","entity","attribs","extraFields","isVisible","isActive","targets","subTypeField","field","attrib","type"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "../../base/client.es.js";
|
|
2
|
-
import { StatsOperation as
|
|
2
|
+
import { StatsOperation as s } from "../../generated/graphql.es.js";
|
|
3
3
|
import "../../generated/graphqlLinks.es.js";
|
|
4
4
|
import "../../generated/access.es.js";
|
|
5
5
|
import "../../generated/actions.es.js";
|
|
@@ -42,68 +42,68 @@ import { checkColumnVisibility as h } from "../../../containers/ProjectTreeTable
|
|
|
42
42
|
const d = (t) => {
|
|
43
43
|
const i = t?.targets;
|
|
44
44
|
return Array.isArray(i) ? i : i ? [i] : [];
|
|
45
|
-
}, b = (t, i,
|
|
46
|
-
const o = i?.[t], a =
|
|
45
|
+
}, b = (t, i, n) => {
|
|
46
|
+
const o = i?.[t], a = n?.[t];
|
|
47
47
|
return o === "none" || a === "none" ? !1 : o != null || a != null;
|
|
48
|
-
},
|
|
48
|
+
}, k = (t, i, n, o) => {
|
|
49
49
|
const a = /* @__PURE__ */ new Set([
|
|
50
50
|
...Object.keys(t ?? {}),
|
|
51
51
|
...Object.keys(i ?? {})
|
|
52
52
|
]);
|
|
53
|
-
for (const
|
|
54
|
-
if (!(
|
|
53
|
+
for (const g of a)
|
|
54
|
+
if (!(n && !h(n, g, o)) && b(g, t, i))
|
|
55
55
|
return !0;
|
|
56
56
|
return !1;
|
|
57
|
-
},
|
|
57
|
+
}, mt = (t, i, n, o) => i?.name === "none" && !k(t, i, n, o), gt = (t, i) => {
|
|
58
58
|
if (!t) return !1;
|
|
59
59
|
if (!i) return !0;
|
|
60
|
-
const
|
|
61
|
-
return d(t).some((o) => !
|
|
62
|
-
}, u = [
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
const n = new Set(d(i).map((o) => o.field));
|
|
61
|
+
return d(t).some((o) => !n.has(o.field));
|
|
62
|
+
}, u = [s.Filled, s.NotFilled], y = [
|
|
63
|
+
s.Min,
|
|
64
|
+
s.Max,
|
|
65
|
+
s.Avg,
|
|
66
|
+
s.Sum,
|
|
67
|
+
s.Filled,
|
|
68
|
+
s.NotFilled
|
|
69
69
|
], p = [
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
],
|
|
70
|
+
s.Filled,
|
|
71
|
+
s.NotFilled,
|
|
72
|
+
s.Distribution
|
|
73
|
+
], N = {
|
|
74
74
|
folder: "folder_type",
|
|
75
75
|
task: "task_type",
|
|
76
76
|
product: "product_type",
|
|
77
77
|
version: null
|
|
78
|
-
},
|
|
78
|
+
}, ft = ({
|
|
79
79
|
entity: t,
|
|
80
80
|
attribs: i,
|
|
81
|
-
columnVisibility:
|
|
81
|
+
columnVisibility: n,
|
|
82
82
|
defaultColumnVisibility: o,
|
|
83
83
|
columnSummaries: a,
|
|
84
|
-
columnSummaryScopes:
|
|
84
|
+
columnSummaryScopes: g,
|
|
85
85
|
extraFields: F = []
|
|
86
86
|
}) => {
|
|
87
|
-
const
|
|
88
|
-
t === "version" ?
|
|
89
|
-
const c =
|
|
90
|
-
c &&
|
|
87
|
+
const _ = (e) => h(n, e, o), l = (e) => _(e) && b(e, a, g), r = [];
|
|
88
|
+
t === "version" ? r.push({ field: "status", aggregations: l("status") ? p : u }) : (r.push({ field: "name", aggregations: u }), l("status") && r.push({ field: "status", aggregations: p })), l("tags") && r.push({ field: "tags", aggregations: p }), t === "task" && l("assignees") && r.push({ field: "assignees", aggregations: p });
|
|
89
|
+
const c = N[t];
|
|
90
|
+
c && l("subType") && r.push({ field: c, aggregations: p });
|
|
91
91
|
for (const e of F)
|
|
92
|
-
|
|
92
|
+
r.push({ field: e, aggregations: p });
|
|
93
93
|
for (const e of i) {
|
|
94
|
-
if (e.scope && !e.scope.includes(t) || !
|
|
94
|
+
if (e.scope && !e.scope.includes(t) || !l(`attrib_${e.name}`)) continue;
|
|
95
95
|
let f = `attrib.${e.name}`;
|
|
96
96
|
["folder", "task"].includes(t) && (f = `inherited_attributes.${e.name}`);
|
|
97
|
-
const
|
|
98
|
-
|
|
97
|
+
const m = e.data?.type;
|
|
98
|
+
m === "integer" || m === "float" ? r.push({ field: f, aggregations: y }) : m === "string" ? r.push({ field: f, aggregations: e.data?.enum?.length ? p : u }) : (m === "list_of_strings" || m === "list_of_integers") && r.push({ field: f, aggregations: p });
|
|
99
99
|
}
|
|
100
|
-
return
|
|
100
|
+
return r;
|
|
101
101
|
};
|
|
102
102
|
export {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
k as anySummaryActive,
|
|
104
|
+
ft as buildMetricTargets,
|
|
105
|
+
gt as hasNewTargetFields,
|
|
106
106
|
b as isSummaryActive,
|
|
107
|
-
|
|
107
|
+
mt as shouldSkipColumnStats
|
|
108
108
|
};
|
|
109
109
|
//# sourceMappingURL=metricTargets.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metricTargets.es.js","sources":["../../../../../../src/api/queries/columnStats/metricTargets.ts"],"sourcesContent":["import type { VisibilityState } from '@tanstack/react-table'\nimport { StatsOperation } from '@shared/api/generated'\nimport { checkColumnVisibility } from '@shared/containers/ProjectTreeTable/utils/checkColumnVisibility'\nimport type { SummaryCalc, RowScope } from '@shared/containers/ProjectTreeTable/types/summaryTypes'\n\nexport type MetricTarget = {\n field: string // column or dot-path for JSONB, e.g. 'status' / 'attrib.fps'\n aggregations: StatsOperation[]\n}\n\nexport type StatsEntity = 'folder' | 'task' | 'product' | 'version'\n\n// matches both MetricTarget[] and the codegen'd single-or-array variables type\ntype TargetsArg = { targets?: { field: string }[] | { field: string } | null }\nconst targetFields = (arg?: TargetsArg): { field: string }[] => {\n const t = arg?.targets\n return Array.isArray(t) ? t : t ? [t] : []\n}\n\nexport const isSummaryActive = (\n columnId: string,\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n): boolean => {\n const calc = columnSummaries?.[columnId]\n const scope = columnSummaryScopes?.[columnId]\n if (calc === 'none' || scope === 'none') return false\n return calc != null || scope != null\n}\n\n// True when at least one *visible* column has an active summary — lets callers\n// skip the whole column-stats query when the user has every summary switched off.\n// Visibility matters: a hidden column can still carry a stale summary value, but\n// buildMetricTargets skips it, so it must not keep the query alive either.\nexport const anySummaryActive = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean => {\n const ids = new Set([\n ...Object.keys(columnSummaries ?? {}),\n ...Object.keys(columnSummaryScopes ?? {}),\n ])\n for (const id of ids) {\n if (columnVisibility && !checkColumnVisibility(columnVisibility, id, defaultColumnVisibility)) {\n continue\n }\n if (isSummaryActive(id, columnSummaries, columnSummaryScopes)) return true\n }\n return false\n}\n\n// The main count (name column) is on by default, so the footer always has at\n// least that to show. Skip the stats fetch only when the user has explicitly\n// turned the name count off too AND no other column has an active summary —\n// otherwise the name cell has no data and can't be re-enabled.\nexport const shouldSkipColumnStats = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean =>\n columnSummaryScopes?.['name'] === 'none' &&\n !anySummaryActive(columnSummaries, columnSummaryScopes, columnVisibility, defaultColumnVisibility)\n\n// refetch only when a target was added — hiding a column needs no query\nexport const hasNewTargetFields = (current?: TargetsArg, previous?: TargetsArg): boolean => {\n if (!current) return false\n if (!previous) return true\n const prevFields = new Set(targetFields(previous).map((t) => t.field))\n return targetFields(current).some((t) => !prevFields.has(t.field))\n}\n\nconst COUNTS: StatsOperation[] = [StatsOperation.Filled, StatsOperation.NotFilled]\n// FILLED rides along so combined-scope averages can be weighted exactly\nconst NUMERIC: StatsOperation[] = [\n StatsOperation.Min,\n StatsOperation.Max,\n StatsOperation.Avg,\n StatsOperation.Sum,\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n]\n// enum columns: counts power the fallback display, distribution the colored bar\nconst ENUM: StatsOperation[] = [\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n StatsOperation.Distribution,\n]\n\n// The table's unified subType column per entity (result columnName maps back\n// to subType via COLUMN_ALIASES in columnStats).\nconst SUB_TYPE_FIELD: Record<StatsEntity, string | null> = {\n folder: 'folder_type',\n task: 'task_type',\n product: 'product_type',\n version: null,\n}\n\n// Structural subset of ProjectTableAttribute — two near-identical versions of\n// that type exist (types/index vs hooks/useAttributesList, data.type optional\n// in the latter); only these fields are needed here so accept both.\ntype AttribFieldLike = {\n name: string\n scope?: string[] | null\n data?: { type?: string; enum?: unknown[] }\n}\n\ntype BuildMetricTargetsArgs = {\n entity: StatsEntity\n attribs: AttribFieldLike[]\n columnVisibility: VisibilityState\n // resolved the same way the table resolves it (opt-in): a column absent from\n // both maps is hidden, so it must NOT be aggregated\n defaultColumnVisibility?: VisibilityState\n columnSummaries?: Record<string, SummaryCalc>\n columnSummaryScopes?: Record<string, RowScope>\n extraFields?: string[] // visible, summary-active page columns, e.g. 'product_base_type'\n}\n\n// Targets for the footer over the columns the user can actually see.\n// Skipped on purpose (backend SQL can't aggregate them safely yet):\n// datetime (numeric cast fails), boolean attribs (text-vs-bool compare on\n// JSONB), and list-type attribs.\nexport const buildMetricTargets = ({\n entity,\n attribs,\n columnVisibility,\n defaultColumnVisibility,\n columnSummaries,\n columnSummaryScopes,\n extraFields = [],\n}: BuildMetricTargetsArgs): MetricTarget[] => {\n const isVisible = (columnId: string) =>\n checkColumnVisibility(columnVisibility, columnId, defaultColumnVisibility)\n const isActive = (columnId: string) =>\n isVisible(columnId) && isSummaryActive(columnId, columnSummaries, columnSummaryScopes)\n\n const targets: MetricTarget[] = []\n if (entity === 'version') {\n // versions have no `name` column (display name derives from the version\n // number) — status is non-null and doubles as the row-count anchor, so it\n targets.push({ field: 'status', aggregations: isActive('status') ? ENUM : COUNTS })\n } else {\n // name counts always — they feed the main folders/tasks count cell\n targets.push({ field: 'name', aggregations: COUNTS })\n if (isActive('status')) targets.push({ field: 'status', aggregations: ENUM })\n }\n if (isActive('tags')) targets.push({ field: 'tags', aggregations: ENUM })\n if (entity === 'task' && isActive('assignees')) {\n targets.push({ field: 'assignees', aggregations: ENUM })\n }\n\n const subTypeField = SUB_TYPE_FIELD[entity]\n if (subTypeField && isActive('subType')) {\n targets.push({ field: subTypeField, aggregations: ENUM })\n }\n\n for (const field of extraFields) {\n targets.push({ field, aggregations: ENUM })\n }\n\n for (const attrib of attribs) {\n if (attrib.scope && !attrib.scope.includes(entity)) continue\n if (!isActive(`attrib_${attrib.name}`)) continue\n\n let field = `attrib.${attrib.name}`\n if (['folder', 'task'].includes(entity)) {\n field = `inherited_attributes.${attrib.name}`\n }\n const type = attrib.data?.type\n if (type === 'integer' || type === 'float') {\n targets.push({ field, aggregations: NUMERIC })\n } else if (type === 'string') {\n targets.push({ field, aggregations: attrib.data?.enum?.length ? ENUM : COUNTS })\n }\n }\n\n return targets\n}\n"],"names":["targetFields","arg","t","isSummaryActive","columnId","columnSummaries","columnSummaryScopes","calc","scope","anySummaryActive","columnVisibility","defaultColumnVisibility","ids","id","checkColumnVisibility","shouldSkipColumnStats","hasNewTargetFields","current","previous","prevFields","COUNTS","StatsOperation","NUMERIC","ENUM","SUB_TYPE_FIELD","buildMetricTargets","entity","attribs","extraFields","isVisible","isActive","targets","subTypeField","field","attrib","type"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metricTargets.es.js","sources":["../../../../../../src/api/queries/columnStats/metricTargets.ts"],"sourcesContent":["import type { VisibilityState } from '@tanstack/react-table'\nimport { StatsOperation } from '@shared/api/generated'\nimport { checkColumnVisibility } from '@shared/containers/ProjectTreeTable/utils/checkColumnVisibility'\nimport type { SummaryCalc, RowScope } from '@shared/containers/ProjectTreeTable/types/summaryTypes'\n\nexport type MetricTarget = {\n field: string // column or dot-path for JSONB, e.g. 'status' / 'attrib.fps'\n aggregations: StatsOperation[]\n}\n\nexport type StatsEntity = 'folder' | 'task' | 'product' | 'version'\n\n// matches both MetricTarget[] and the codegen'd single-or-array variables type\ntype TargetsArg = { targets?: { field: string }[] | { field: string } | null }\nconst targetFields = (arg?: TargetsArg): { field: string }[] => {\n const t = arg?.targets\n return Array.isArray(t) ? t : t ? [t] : []\n}\n\nexport const isSummaryActive = (\n columnId: string,\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n): boolean => {\n const calc = columnSummaries?.[columnId]\n const scope = columnSummaryScopes?.[columnId]\n if (calc === 'none' || scope === 'none') return false\n return calc != null || scope != null\n}\n\n// True when at least one *visible* column has an active summary — lets callers\n// skip the whole column-stats query when the user has every summary switched off.\n// Visibility matters: a hidden column can still carry a stale summary value, but\n// buildMetricTargets skips it, so it must not keep the query alive either.\nexport const anySummaryActive = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean => {\n const ids = new Set([\n ...Object.keys(columnSummaries ?? {}),\n ...Object.keys(columnSummaryScopes ?? {}),\n ])\n for (const id of ids) {\n if (columnVisibility && !checkColumnVisibility(columnVisibility, id, defaultColumnVisibility)) {\n continue\n }\n if (isSummaryActive(id, columnSummaries, columnSummaryScopes)) return true\n }\n return false\n}\n\n// The main count (name column) is on by default, so the footer always has at\n// least that to show. Skip the stats fetch only when the user has explicitly\n// turned the name count off too AND no other column has an active summary —\n// otherwise the name cell has no data and can't be re-enabled.\nexport const shouldSkipColumnStats = (\n columnSummaries?: Record<string, SummaryCalc>,\n columnSummaryScopes?: Record<string, RowScope>,\n columnVisibility?: VisibilityState,\n defaultColumnVisibility?: VisibilityState,\n): boolean =>\n columnSummaryScopes?.['name'] === 'none' &&\n !anySummaryActive(columnSummaries, columnSummaryScopes, columnVisibility, defaultColumnVisibility)\n\n// refetch only when a target was added — hiding a column needs no query\nexport const hasNewTargetFields = (current?: TargetsArg, previous?: TargetsArg): boolean => {\n if (!current) return false\n if (!previous) return true\n const prevFields = new Set(targetFields(previous).map((t) => t.field))\n return targetFields(current).some((t) => !prevFields.has(t.field))\n}\n\nconst COUNTS: StatsOperation[] = [StatsOperation.Filled, StatsOperation.NotFilled]\n// FILLED rides along so combined-scope averages can be weighted exactly\nconst NUMERIC: StatsOperation[] = [\n StatsOperation.Min,\n StatsOperation.Max,\n StatsOperation.Avg,\n StatsOperation.Sum,\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n]\n// enum columns: counts power the fallback display, distribution the colored bar\nconst ENUM: StatsOperation[] = [\n StatsOperation.Filled,\n StatsOperation.NotFilled,\n StatsOperation.Distribution,\n]\n\n// The table's unified subType column per entity (result columnName maps back\n// to subType via COLUMN_ALIASES in columnStats).\nconst SUB_TYPE_FIELD: Record<StatsEntity, string | null> = {\n folder: 'folder_type',\n task: 'task_type',\n product: 'product_type',\n version: null,\n}\n\n// Structural subset of ProjectTableAttribute — two near-identical versions of\n// that type exist (types/index vs hooks/useAttributesList, data.type optional\n// in the latter); only these fields are needed here so accept both.\ntype AttribFieldLike = {\n name: string\n scope?: string[] | null\n data?: { type?: string; enum?: unknown[] }\n}\n\ntype BuildMetricTargetsArgs = {\n entity: StatsEntity\n attribs: AttribFieldLike[]\n columnVisibility: VisibilityState\n // resolved the same way the table resolves it (opt-in): a column absent from\n // both maps is hidden, so it must NOT be aggregated\n defaultColumnVisibility?: VisibilityState\n columnSummaries?: Record<string, SummaryCalc>\n columnSummaryScopes?: Record<string, RowScope>\n extraFields?: string[] // visible, summary-active page columns, e.g. 'product_base_type'\n}\n\n// Targets for the footer over the columns the user can actually see.\n// Skipped on purpose — the backend errors on these, and one bad target fails\n// the whole query, killing every other column's stats too:\n// datetime (\"cannot cast type timestamp with time zone to numeric\") and\n// boolean attribs (\"operator does not exist: text = boolean\").\nexport const buildMetricTargets = ({\n entity,\n attribs,\n columnVisibility,\n defaultColumnVisibility,\n columnSummaries,\n columnSummaryScopes,\n extraFields = [],\n}: BuildMetricTargetsArgs): MetricTarget[] => {\n const isVisible = (columnId: string) =>\n checkColumnVisibility(columnVisibility, columnId, defaultColumnVisibility)\n const isActive = (columnId: string) =>\n isVisible(columnId) && isSummaryActive(columnId, columnSummaries, columnSummaryScopes)\n\n const targets: MetricTarget[] = []\n if (entity === 'version') {\n // versions have no `name` column (display name derives from the version\n // number) — status is non-null and doubles as the row-count anchor, so it\n targets.push({ field: 'status', aggregations: isActive('status') ? ENUM : COUNTS })\n } else {\n // name counts always — they feed the main folders/tasks count cell\n targets.push({ field: 'name', aggregations: COUNTS })\n if (isActive('status')) targets.push({ field: 'status', aggregations: ENUM })\n }\n if (isActive('tags')) targets.push({ field: 'tags', aggregations: ENUM })\n if (entity === 'task' && isActive('assignees')) {\n targets.push({ field: 'assignees', aggregations: ENUM })\n }\n\n const subTypeField = SUB_TYPE_FIELD[entity]\n if (subTypeField && isActive('subType')) {\n targets.push({ field: subTypeField, aggregations: ENUM })\n }\n\n for (const field of extraFields) {\n targets.push({ field, aggregations: ENUM })\n }\n\n for (const attrib of attribs) {\n if (attrib.scope && !attrib.scope.includes(entity)) continue\n if (!isActive(`attrib_${attrib.name}`)) continue\n\n let field = `attrib.${attrib.name}`\n if (['folder', 'task'].includes(entity)) {\n field = `inherited_attributes.${attrib.name}`\n }\n const type = attrib.data?.type\n if (type === 'integer' || type === 'float') {\n targets.push({ field, aggregations: NUMERIC })\n } else if (type === 'string') {\n targets.push({ field, aggregations: attrib.data?.enum?.length ? ENUM : COUNTS })\n } else if (type === 'list_of_strings' || type === 'list_of_integers') {\n // backend buckets the whole array as one serialized value; normalizeDistribution unnests it\n targets.push({ field, aggregations: ENUM })\n }\n }\n\n return targets\n}\n"],"names":["targetFields","arg","t","isSummaryActive","columnId","columnSummaries","columnSummaryScopes","calc","scope","anySummaryActive","columnVisibility","defaultColumnVisibility","ids","id","checkColumnVisibility","shouldSkipColumnStats","hasNewTargetFields","current","previous","prevFields","COUNTS","StatsOperation","NUMERIC","ENUM","SUB_TYPE_FIELD","buildMetricTargets","entity","attribs","extraFields","isVisible","isActive","targets","subTypeField","field","attrib","type"],"mappings":"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"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../../../_virtual/jsx-runtime.cjs.js"),a=require("react"),b=require("@ynput/ayon-react-components"),x=require("clsx"),u=require("styled-components"),z=u.div`
|
|
2
2
|
display: flex;
|
|
3
3
|
gap: var(--base-gap-small);
|
|
4
4
|
align-items: center;
|
|
5
|
+
align-self: stretch;
|
|
5
6
|
width: 100%;
|
|
6
7
|
overflow: hidden;
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
&.multi-row {
|
|
10
|
+
flex-wrap: wrap;
|
|
11
|
+
align-content: center;
|
|
12
|
+
}
|
|
13
|
+
`,y=u.div`
|
|
8
14
|
background-color: var(--md-sys-color-surface-container-high);
|
|
9
15
|
border-radius: var(--border-radius-m);
|
|
10
16
|
padding: 2px 4px;
|
|
@@ -27,18 +33,18 @@
|
|
|
27
33
|
&:hover {
|
|
28
34
|
background-color: var(--md-sys-color-surface-container-high-hover);
|
|
29
35
|
}
|
|
30
|
-
`,
|
|
36
|
+
`,N=u(y)`
|
|
31
37
|
visibility: hidden;
|
|
32
38
|
position: absolute;
|
|
33
39
|
top: -9999px;
|
|
34
40
|
left: -9999px;
|
|
35
41
|
z-index: -100;
|
|
36
|
-
`,
|
|
42
|
+
`,A=u(y)`
|
|
37
43
|
flex-shrink: 0;
|
|
38
44
|
display: flex;
|
|
39
45
|
justify-content: center;
|
|
40
46
|
align-items: center;
|
|
41
|
-
`,
|
|
47
|
+
`,H=u(b.Icon)`
|
|
42
48
|
background-color: var(--md-sys-color-surface-container);
|
|
43
49
|
border-radius: var(--border-radius-m);
|
|
44
50
|
width: 24px;
|
|
@@ -51,5 +57,5 @@
|
|
|
51
57
|
&:hover {
|
|
52
58
|
background-color: var(--md-sys-color-surface-container-high-hover);
|
|
53
59
|
}
|
|
54
|
-
`,
|
|
60
|
+
`,W=({values:t,disabled:k,pt:d})=>{const w=a.useRef(null),[{visibleCount:C,rows:q},S]=a.useState({visibleCount:0,rows:1}),[c,O]=a.useState([]);if(a.useLayoutEffect(()=>{O(t)},[t]),a.useLayoutEffect(()=>{const e=w.current;if(!e||c.length===0||c.length!==t.length)return;const o=Array.from(e.querySelectorAll(".offscreen-chip"));if(o.length!==t.length)return;const f=parseFloat(getComputedStyle(e).rowGap)||0,B=o.map(l=>l.getBoundingClientRect().width),j=o[0].getBoundingClientRect().height,I=e.querySelector(".offscreen-more-chip")?.getBoundingClientRect().width||60,L=(l,p,h)=>{let n=1,r=0;const E=(s,M)=>{M?r=s:r+f+s<=h?r+=f+s:(n++,r=s)};for(let s=0;s<l;s++)E(B[s],s===0);return p&&E(p,l===0),n},R=()=>{const l=e.getBoundingClientRect().width,p=e.offsetHeight,h=j?Math.max(1,Math.floor((p+f)/(j+f))):1;let n=t.length;for(;n>1&&L(n,n<t.length?I:0,l)>h;)n--;S(r=>r.visibleCount===n&&r.rows===h?r:{visibleCount:n,rows:h})},v=new ResizeObserver(R);return v.observe(e),R(),()=>v.disconnect()},[t,c]),k)return null;if(!t.length)return i.jsxRuntimeExports.jsx(H,{icon:"add",className:d?.chip?.className});const g=t.slice(0,C),m=C?t.length-g.length:0;return i.jsxRuntimeExports.jsxs(z,{ref:w,className:x({"multi-row":q>1}),children:[g.map((e,o)=>a.createElement(y,{...d?.chip,key:e.label+o,"data-tooltip":e.tooltip,className:x("chip",{last:o===g.length-1&&m>0},d?.chip?.className)},e.prefix,e?.icon&&i.jsxRuntimeExports.jsx(b.Icon,{icon:e.icon}),e.label,e.suffix)),m>0&&i.jsxRuntimeExports.jsxs(A,{className:x("more-chip",d?.chip?.className),children:["+",m]}),c.map((e,o)=>i.jsxRuntimeExports.jsxs(N,{className:"offscreen-chip",children:[e.prefix,e?.icon&&i.jsxRuntimeExports.jsx(b.Icon,{icon:e.icon}),e.label,e.suffix]},e.label+o)),c.length>1&&i.jsxRuntimeExports.jsxs(N,{className:"offscreen-more-chip",children:["+",c.length-1]})]})};exports.Chips=W;
|
|
55
61
|
//# sourceMappingURL=Chips.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chips.cjs.js","sources":["../../../../../src/components/Chips/Chips.tsx"],"sourcesContent":["import { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport React, { FC, useRef, useState, useLayoutEffect, HTMLAttributes } from 'react'\nimport styled from 'styled-components'\n\nconst ChipsContainer = styled.div`\n display: flex;\n gap: var(--base-gap-small);\n align-items: center;\n width: 100%;\n overflow: hidden;\n`\n\nconst Chip = styled.div`\n background-color: var(--md-sys-color-surface-container-high);\n border-radius: var(--border-radius-m);\n padding: 2px 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 4px;\n\n flex-shrink: 0;\n min-width: auto;\n &.last {\n flex-shrink: 1;\n min-width: 0;\n }\n\n &:hover {\n background-color: var(--md-sys-color-surface-container-high-hover);\n }\n`\n\nconst OffscreenChip = styled(Chip)`\n visibility: hidden;\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: -100;\n`\n\nconst MoreChip = styled(Chip)`\n flex-shrink: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nconst AddIcon = styled(Icon)`\n background-color: var(--md-sys-color-surface-container);\n border-radius: var(--border-radius-m);\n width: 24px;\n height: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n\n &:hover {\n background-color: var(--md-sys-color-surface-container-high-hover);\n }\n`\n\nexport type ChipValue = {\n label: string\n tooltip: string\n icon?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n\ninterface ChipsProps {\n values: ChipValue[]\n disabled?: boolean\n pt?: {\n chip?: Partial<HTMLAttributes<HTMLDivElement>>\n }\n}\n\nexport const Chips: FC<ChipsProps> = ({ values, disabled, pt }) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const [
|
|
1
|
+
{"version":3,"file":"Chips.cjs.js","sources":["../../../../../src/components/Chips/Chips.tsx"],"sourcesContent":["import { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport React, { FC, useRef, useState, useLayoutEffect, HTMLAttributes } from 'react'\nimport styled from 'styled-components'\n\nconst ChipsContainer = styled.div`\n display: flex;\n gap: var(--base-gap-small);\n align-items: center;\n align-self: stretch;\n width: 100%;\n overflow: hidden;\n\n &.multi-row {\n flex-wrap: wrap;\n align-content: center;\n }\n`\n\nconst Chip = styled.div`\n background-color: var(--md-sys-color-surface-container-high);\n border-radius: var(--border-radius-m);\n padding: 2px 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 4px;\n\n flex-shrink: 0;\n min-width: auto;\n &.last {\n flex-shrink: 1;\n min-width: 0;\n }\n\n &:hover {\n background-color: var(--md-sys-color-surface-container-high-hover);\n }\n`\n\nconst OffscreenChip = styled(Chip)`\n visibility: hidden;\n position: absolute;\n top: -9999px;\n left: -9999px;\n z-index: -100;\n`\n\nconst MoreChip = styled(Chip)`\n flex-shrink: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nconst AddIcon = styled(Icon)`\n background-color: var(--md-sys-color-surface-container);\n border-radius: var(--border-radius-m);\n width: 24px;\n height: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n\n &:hover {\n background-color: var(--md-sys-color-surface-container-high-hover);\n }\n`\n\nexport type ChipValue = {\n label: string\n tooltip: string\n icon?: string\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n}\n\ninterface ChipsProps {\n values: ChipValue[]\n disabled?: boolean\n pt?: {\n chip?: Partial<HTMLAttributes<HTMLDivElement>>\n }\n}\n\ntype ChipsLayout = {\n visibleCount: number\n rows: number\n}\n\nexport const Chips: FC<ChipsProps> = ({ values, disabled, pt }) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const [{ visibleCount, rows }, setLayout] = useState<ChipsLayout>({\n visibleCount: 0,\n rows: 1,\n })\n const [offscreenChips, setOffscreenChips] = useState<ChipValue[]>([])\n\n useLayoutEffect(() => {\n setOffscreenChips(values)\n }, [values])\n\n useLayoutEffect(() => {\n const container = containerRef.current\n if (!container || offscreenChips.length === 0 || offscreenChips.length !== values.length) return\n\n const chipElements = Array.from(container.querySelectorAll('.offscreen-chip'))\n if (chipElements.length !== values.length) return\n\n const gap = parseFloat(getComputedStyle(container).rowGap) || 0\n const chipWidths = chipElements.map((el) => el.getBoundingClientRect().width)\n const chipHeight = chipElements[0].getBoundingClientRect().height\n // measured offscreen at its widest label, so it does not depend on the +N chip being rendered\n const moreChipWidth =\n container.querySelector('.offscreen-more-chip')?.getBoundingClientRect().width || 60\n\n const rowsNeeded = (count: number, extraWidth: number, containerWidth: number) => {\n let used = 1\n let rowWidth = 0\n const place = (width: number, isFirst: boolean) => {\n if (isFirst) rowWidth = width\n else if (rowWidth + gap + width <= containerWidth) rowWidth += gap + width\n else {\n used++\n rowWidth = width\n }\n }\n\n for (let i = 0; i < count; i++) place(chipWidths[i], i === 0)\n if (extraWidth) place(extraWidth, count === 0)\n return used\n }\n\n const calculateLayout = () => {\n const containerWidth = container.getBoundingClientRect().width\n const containerHeight = container.offsetHeight\n const rows = chipHeight\n ? Math.max(1, Math.floor((containerHeight + gap) / (chipHeight + gap)))\n : 1\n\n // drop chips until they and the more chip fit the rows available\n let visibleCount = values.length\n while (\n visibleCount > 1 &&\n rowsNeeded(visibleCount, visibleCount < values.length ? moreChipWidth : 0, containerWidth) >\n rows\n ) {\n visibleCount--\n }\n\n setLayout((prev) =>\n prev.visibleCount === visibleCount && prev.rows === rows ? prev : { visibleCount, rows },\n )\n }\n\n const resizeObserver = new ResizeObserver(calculateLayout)\n resizeObserver.observe(container)\n\n // Initial calculation\n calculateLayout()\n\n return () => resizeObserver.disconnect()\n }, [values, offscreenChips])\n\n if (disabled) return null\n\n // for no values return plus button\n if (!values.length) {\n return <AddIcon icon=\"add\" className={pt?.chip?.className} />\n }\n\n const visibleValues = values.slice(0, visibleCount)\n const hiddenCount = visibleCount ? values.length - visibleValues.length : 0\n\n return (\n <ChipsContainer ref={containerRef} className={clsx({ 'multi-row': rows > 1 })}>\n {visibleValues.map((chip, index) => (\n <Chip\n {...pt?.chip}\n key={chip.label + index}\n data-tooltip={chip.tooltip}\n className={clsx(\n 'chip',\n { last: index === visibleValues.length - 1 && hiddenCount > 0 },\n pt?.chip?.className,\n )}\n >\n {chip.prefix}\n {chip?.icon && <Icon icon={chip.icon} />}\n {chip.label}\n {chip.suffix}\n </Chip>\n ))}\n {hiddenCount > 0 && (\n <MoreChip className={clsx('more-chip', pt?.chip?.className)}>+{hiddenCount}</MoreChip>\n )}\n {offscreenChips.map((chip, index) => (\n <OffscreenChip key={chip.label + index} className=\"offscreen-chip\">\n {chip.prefix}\n {chip?.icon && <Icon icon={chip.icon} />}\n {chip.label}\n {chip.suffix}\n </OffscreenChip>\n ))}\n {offscreenChips.length > 1 && (\n <OffscreenChip className=\"offscreen-more-chip\">+{offscreenChips.length - 1}</OffscreenChip>\n )}\n </ChipsContainer>\n )\n}\n"],"names":["ChipsContainer","styled","Chip","OffscreenChip","MoreChip","AddIcon","Icon","Chips","values","disabled","pt","containerRef","useRef","visibleCount","rows","setLayout","useState","offscreenChips","setOffscreenChips","useLayoutEffect","container","chipElements","gap","chipWidths","el","chipHeight","moreChipWidth","rowsNeeded","count","extraWidth","containerWidth","used","rowWidth","place","width","isFirst","i","calculateLayout","containerHeight","prev","resizeObserver","visibleValues","hiddenCount","jsxs","clsx","chip","index","createElement","jsx"],"mappings":"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"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
import { j as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import { Icon as
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
const
|
|
1
|
+
import { j as i } from "../../../../_virtual/jsx-runtime.es.js";
|
|
2
|
+
import { useRef as W, useState as k, useLayoutEffect as R, createElement as q } from "react";
|
|
3
|
+
import { Icon as x } from "@ynput/ayon-react-components";
|
|
4
|
+
import u from "clsx";
|
|
5
|
+
import h from "styled-components";
|
|
6
|
+
const I = h.div`
|
|
7
7
|
display: flex;
|
|
8
8
|
gap: var(--base-gap-small);
|
|
9
9
|
align-items: center;
|
|
10
|
+
align-self: stretch;
|
|
10
11
|
width: 100%;
|
|
11
12
|
overflow: hidden;
|
|
12
|
-
|
|
13
|
+
|
|
14
|
+
&.multi-row {
|
|
15
|
+
flex-wrap: wrap;
|
|
16
|
+
align-content: center;
|
|
17
|
+
}
|
|
18
|
+
`, b = h.div`
|
|
13
19
|
background-color: var(--md-sys-color-surface-container-high);
|
|
14
20
|
border-radius: var(--border-radius-m);
|
|
15
21
|
padding: 2px 4px;
|
|
@@ -32,18 +38,18 @@ const O = l.div`
|
|
|
32
38
|
&:hover {
|
|
33
39
|
background-color: var(--md-sys-color-surface-container-high-hover);
|
|
34
40
|
}
|
|
35
|
-
`,
|
|
41
|
+
`, B = h(b)`
|
|
36
42
|
visibility: hidden;
|
|
37
43
|
position: absolute;
|
|
38
44
|
top: -9999px;
|
|
39
45
|
left: -9999px;
|
|
40
46
|
z-index: -100;
|
|
41
|
-
`,
|
|
47
|
+
`, F = h(b)`
|
|
42
48
|
flex-shrink: 0;
|
|
43
49
|
display: flex;
|
|
44
50
|
justify-content: center;
|
|
45
51
|
align-items: center;
|
|
46
|
-
`,
|
|
52
|
+
`, G = h(x)`
|
|
47
53
|
background-color: var(--md-sys-color-surface-container);
|
|
48
54
|
border-radius: var(--border-radius-m);
|
|
49
55
|
width: 24px;
|
|
@@ -56,73 +62,74 @@ const O = l.div`
|
|
|
56
62
|
&:hover {
|
|
57
63
|
background-color: var(--md-sys-color-surface-container-high-hover);
|
|
58
64
|
}
|
|
59
|
-
`,
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}, [
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}, [t, d]), w ? null : t.length ? /* @__PURE__ */ s.jsxs(O, { ref: r, children: [
|
|
96
|
-
g.map((e, n) => /* @__PURE__ */ B(
|
|
97
|
-
m,
|
|
65
|
+
`, Q = ({ values: t, disabled: E, pt: f }) => {
|
|
66
|
+
const w = W(null), [{ visibleCount: y, rows: O }, S] = k({
|
|
67
|
+
visibleCount: 0,
|
|
68
|
+
rows: 1
|
|
69
|
+
}), [c, z] = k([]);
|
|
70
|
+
if (R(() => {
|
|
71
|
+
z(t);
|
|
72
|
+
}, [t]), R(() => {
|
|
73
|
+
const e = w.current;
|
|
74
|
+
if (!e || c.length === 0 || c.length !== t.length) return;
|
|
75
|
+
const r = Array.from(e.querySelectorAll(".offscreen-chip"));
|
|
76
|
+
if (r.length !== t.length) return;
|
|
77
|
+
const d = parseFloat(getComputedStyle(e).rowGap) || 0, A = r.map((l) => l.getBoundingClientRect().width), C = r[0].getBoundingClientRect().height, H = e.querySelector(".offscreen-more-chip")?.getBoundingClientRect().width || 60, L = (l, p, a) => {
|
|
78
|
+
let o = 1, s = 0;
|
|
79
|
+
const N = (n, M) => {
|
|
80
|
+
M ? s = n : s + d + n <= a ? s += d + n : (o++, s = n);
|
|
81
|
+
};
|
|
82
|
+
for (let n = 0; n < l; n++) N(A[n], n === 0);
|
|
83
|
+
return p && N(p, l === 0), o;
|
|
84
|
+
}, v = () => {
|
|
85
|
+
const l = e.getBoundingClientRect().width, p = e.offsetHeight, a = C ? Math.max(1, Math.floor((p + d) / (C + d))) : 1;
|
|
86
|
+
let o = t.length;
|
|
87
|
+
for (; o > 1 && L(o, o < t.length ? H : 0, l) > a; )
|
|
88
|
+
o--;
|
|
89
|
+
S(
|
|
90
|
+
(s) => s.visibleCount === o && s.rows === a ? s : { visibleCount: o, rows: a }
|
|
91
|
+
);
|
|
92
|
+
}, j = new ResizeObserver(v);
|
|
93
|
+
return j.observe(e), v(), () => j.disconnect();
|
|
94
|
+
}, [t, c]), E) return null;
|
|
95
|
+
if (!t.length)
|
|
96
|
+
return /* @__PURE__ */ i.jsx(G, { icon: "add", className: f?.chip?.className });
|
|
97
|
+
const m = t.slice(0, y), g = y ? t.length - m.length : 0;
|
|
98
|
+
return /* @__PURE__ */ i.jsxs(I, { ref: w, className: u({ "multi-row": O > 1 }), children: [
|
|
99
|
+
m.map((e, r) => /* @__PURE__ */ q(
|
|
100
|
+
b,
|
|
98
101
|
{
|
|
99
|
-
...
|
|
100
|
-
key: e.label +
|
|
102
|
+
...f?.chip,
|
|
103
|
+
key: e.label + r,
|
|
101
104
|
"data-tooltip": e.tooltip,
|
|
102
|
-
className:
|
|
105
|
+
className: u(
|
|
103
106
|
"chip",
|
|
104
|
-
{ last:
|
|
105
|
-
|
|
107
|
+
{ last: r === m.length - 1 && g > 0 },
|
|
108
|
+
f?.chip?.className
|
|
106
109
|
)
|
|
107
110
|
},
|
|
108
111
|
e.prefix,
|
|
109
|
-
e?.icon && /* @__PURE__ */
|
|
112
|
+
e?.icon && /* @__PURE__ */ i.jsx(x, { icon: e.icon }),
|
|
110
113
|
e.label,
|
|
111
114
|
e.suffix
|
|
112
115
|
)),
|
|
113
|
-
|
|
116
|
+
g > 0 && /* @__PURE__ */ i.jsxs(F, { className: u("more-chip", f?.chip?.className), children: [
|
|
114
117
|
"+",
|
|
115
|
-
|
|
118
|
+
g
|
|
116
119
|
] }),
|
|
117
|
-
|
|
120
|
+
c.map((e, r) => /* @__PURE__ */ i.jsxs(B, { className: "offscreen-chip", children: [
|
|
118
121
|
e.prefix,
|
|
119
|
-
e?.icon && /* @__PURE__ */
|
|
122
|
+
e?.icon && /* @__PURE__ */ i.jsx(x, { icon: e.icon }),
|
|
120
123
|
e.label,
|
|
121
124
|
e.suffix
|
|
122
|
-
] }, e.label +
|
|
123
|
-
|
|
125
|
+
] }, e.label + r)),
|
|
126
|
+
c.length > 1 && /* @__PURE__ */ i.jsxs(B, { className: "offscreen-more-chip", children: [
|
|
127
|
+
"+",
|
|
128
|
+
c.length - 1
|
|
129
|
+
] })
|
|
130
|
+
] });
|
|
124
131
|
};
|
|
125
132
|
export {
|
|
126
|
-
|
|
133
|
+
Q as Chips
|
|
127
134
|
};
|
|
128
135
|
//# sourceMappingURL=Chips.es.js.map
|