@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnumWidget.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/EnumWidget.tsx"],"sourcesContent":["import { Dropdown, DropdownProps, DropdownRef } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport { forwardRef, useEffect, useRef, useState } from 'react'\nimport styled from 'styled-components'\nimport type { WidgetBaseProps } from './CellWidget'\nimport { EnumCellValue, EnumTemplateProps } from './EnumCellValue'\nimport type { AttributeData, EnumItem } from '@shared/api'\n\nconst StyledDropdown = styled(Dropdown)
|
|
1
|
+
{"version":3,"file":"EnumWidget.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/EnumWidget.tsx"],"sourcesContent":["import { Dropdown, DropdownProps, DropdownRef } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport { forwardRef, useEffect, useRef, useState } from 'react'\nimport styled from 'styled-components'\nimport type { WidgetBaseProps } from './CellWidget'\nimport { EnumCellValue, EnumTemplateProps } from './EnumCellValue'\nimport type { AttributeData, EnumItem } from '@shared/api'\nimport { wrapMode } from './wrapMode'\n\nconst StyledDropdown = styled(Dropdown)<{ $multiSelect?: boolean }>`\n height: 100%;\n width: 100%;\n\n /* the value template clips against the button, so it has to grow with the cell */\n ${({ $multiSelect }) =>\n $multiSelect &&\n wrapMode`\n .button {\n height: 100%;\n }\n `}\n`\n\nexport interface EnumWidgetProps\n extends Omit<DropdownProps, 'onChange' | 'value' | 'pt'>,\n WidgetBaseProps {\n value: (string | number | boolean)[]\n options: EnumItem[]\n type?: AttributeData['type']\n autoOpen?: boolean\n isReadOnly?: boolean\n enableCustomValues?: boolean\n pt?: {\n template?: Partial<EnumTemplateProps>\n }\n onOpen?: () => void\n onNext?: () => void\n}\n\nexport const EnumWidget = forwardRef<HTMLDivElement, EnumWidgetProps>(\n (\n {\n value,\n isEditing,\n options,\n type,\n autoOpen = true,\n isReadOnly,\n enableCustomValues,\n onOpen,\n onChange,\n onCancelEdit,\n onNext,\n pt,\n ...dropdownProps\n },\n _ref,\n ) => {\n // convert value to string array\n const valueAsStrings = value.map((v) => v?.toString()).filter((v) => !!v)\n let selectedOptions = options.filter((option) =>\n valueAsStrings.includes(option.value.toString()),\n )\n\n // Check if all values are present in options, if not, add a warning\n const invalidOptions: EnumItem[] = []\n valueAsStrings.forEach((val) => {\n if (!options.find((option) => option.value === val)) {\n const invalidOption = {\n label: val,\n value: val,\n color: enableCustomValues\n ? 'var(--md-sys-color-surface-container)'\n : 'var(--md-sys-color-error)',\n icon: enableCustomValues ? undefined : 'warning',\n }\n selectedOptions = [...selectedOptions, invalidOption]\n invalidOptions.push(invalidOption)\n }\n })\n const hasMultipleValues = selectedOptions.length > 1\n\n // Merge valid options with invalid options for the dropdown\n const allOptions = [...options, ...invalidOptions]\n\n const dropdownRef = useRef<DropdownRef>(null)\n\n const [dropdownOpen, setDropdownOpen] = useState(false)\n useEffect(() => {\n if (isEditing && dropdownRef.current && autoOpen) {\n !dropdownRef.current.isOpen && dropdownRef.current?.open()\n setDropdownOpen(true)\n } else {\n setDropdownOpen(false)\n }\n }, [isEditing, dropdownRef.current, autoOpen])\n\n // when the dropdown is open, focus the first item\n useEffect(() => {\n if (dropdownOpen && !dropdownProps.search && allOptions.length < 20) {\n const optionsUlEl = dropdownRef.current?.getOptions() as HTMLUListElement\n const firstItem = optionsUlEl?.querySelector('li')\n if (firstItem) {\n firstItem.focus()\n // set style of li to have no outline (no focus ring)\n firstItem.style.outline = 'none'\n }\n }\n }, [dropdownOpen, dropdownProps.search, allOptions.length])\n\n const isMultiSelect = !!type?.includes('list')\n\n const handleChange = (newValue: string[]) => {\n let filteredValue: string | string[] = enableCustomValues\n ? newValue\n : newValue.filter((v) => options.find((o) => o.value === v))\n\n if (type?.includes('list')) {\n onChange(filteredValue, 'Click')\n } else {\n // check if the value is an array or a string and for arrays take the first value only\n filteredValue = Array.isArray(filteredValue) ? filteredValue[0] : filteredValue\n\n // take first value as the type is not list]\n onChange(filteredValue, 'Click')\n }\n }\n\n if (isEditing) {\n return (\n <StyledDropdown\n options={allOptions}\n value={valueAsStrings}\n ref={dropdownRef}\n valueTemplate={(_value, selected, isOpen) => (\n <EnumCellValue\n selectedOptions={selectedOptions}\n hasMultipleValues={selected.length > 1}\n isOpen={isOpen}\n isReadOnly={isReadOnly}\n isMultiSelect={isMultiSelect}\n {...pt?.template}\n placeholder={dropdownProps.placeholder}\n className={clsx('enum-dropdown-value', pt?.template?.className)}\n />\n )}\n itemTemplate={(option, _isActive, isSelected) => (\n <EnumCellValue\n selectedOptions={[option]}\n hasMultipleValues={false}\n isOpen={false}\n isItem\n isMultiSelect={isMultiSelect}\n isSelected={isSelected}\n {...pt?.template}\n className={clsx('enum-dropdown-item', pt?.template?.className)}\n />\n )}\n widthExpand\n multiSelect={isMultiSelect}\n disableOpen={isReadOnly}\n disabled={isReadOnly}\n sortBySelected\n searchOnNumber={10}\n {...dropdownProps}\n $multiSelect={isMultiSelect}\n onChange={handleChange}\n onClose={onCancelEdit}\n editable={enableCustomValues}\n />\n )\n }\n\n return (\n <EnumCellValue\n selectedOptions={selectedOptions}\n hasMultipleValues={hasMultipleValues}\n isMultiSelect={isMultiSelect}\n isReadOnly={isReadOnly}\n {...pt?.template}\n placeholder={dropdownProps.placeholder}\n className={clsx('enum-value', pt?.template?.className, dropdownProps.className)}\n />\n )\n },\n)\n"],"names":["StyledDropdown","styled","Dropdown","$multiSelect","wrapMode","EnumWidget","forwardRef","value","isEditing","options","type","autoOpen","isReadOnly","enableCustomValues","onOpen","onChange","onCancelEdit","onNext","pt","dropdownProps","_ref","valueAsStrings","v","selectedOptions","option","invalidOptions","val","invalidOption","hasMultipleValues","allOptions","dropdownRef","useRef","dropdownOpen","setDropdownOpen","useState","useEffect","firstItem","isMultiSelect","handleChange","newValue","filteredValue","o","jsx","_value","selected","isOpen","EnumCellValue","clsx","_isActive","isSelected"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../../../../_virtual/jsx-runtime.cjs.js"),g=require("../../../components/Chips/Chips.cjs.js"),b=require("../../../components/DoneCheckbox/DoneCheckbox.cjs.js"),j=require("../../../components/SubtasksManager/SubtasksManagerWrapper.cjs.js"),m=require("../../../components/LinksManager/CellEditingDialog.cjs.js"),S=require("react"),h=require("./CellWidget.cjs.js"),C=require("../../../components/LinksManager/LinksManager.styled.cjs.js"),k=require("../context/ProjectTableContext.cjs.js"),R=({value:t,isEditing:r,cellId:
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../../../../_virtual/jsx-runtime.cjs.js"),g=require("../../../components/Chips/Chips.cjs.js"),b=require("../../../components/DoneCheckbox/DoneCheckbox.cjs.js"),j=require("../../../components/SubtasksManager/SubtasksManagerWrapper.cjs.js"),m=require("../../../components/LinksManager/CellEditingDialog.cjs.js"),S=require("react"),h=require("./CellWidget.cjs.js"),C=require("../../../components/LinksManager/LinksManager.styled.cjs.js"),k=require("../context/ProjectTableContext.cjs.js"),R=({value:t,isEditing:r,cellId:l,projectName:c,disabled:o,onChange:q,onCancelEdit:n})=>{const{SubtasksManager:a,useNavigate:u}=k.useProjectTableContext(),[d,x]=S.useState([]),i=t?.subtasks||[],p=i.map(s=>({label:s.label||s.name,tooltip:s.description||s.label||s.name,prefix:e.jsxRuntimeExports.jsx(b.DoneCheckbox,{checked:s.isDone,isReadOnly:!0,style:{fontSize:20}})}));return e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[e.jsxRuntimeExports.jsx(g.Chips,{values:p,pt:{chip:{className:h.EDIT_TRIGGER_CLASS}},disabled:o}),r&&t&&a&&e.jsxRuntimeExports.jsx(m.CellEditingDialog,{isEditing:r,anchorId:l,onClose:n,children:o?e.jsxRuntimeExports.jsx(C.Container,{style:{color:"var(--md-sys-color-outline)"},children:"Subtasks are disabled for this task"}):e.jsxRuntimeExports.jsx(j.SubtasksManagerWrapper,{projectName:c,taskId:t.taskId,folderId:t.folderId,subtasks:i,selectedSubtaskIds:d,onSelectSubtasks:x,onClose:n,SubtasksManager:a,useNavigate:u,style:{padding:"var(--padding-m)",backgroundColor:"var(--md-sys-color-surface-container-high)",borderRadius:"var(--border-radius-l)"}})})]})};exports.SubtasksWidget=R;
|
|
2
2
|
//# sourceMappingURL=SubtasksWidget.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubtasksWidget.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/SubtasksWidget.tsx"],"sourcesContent":["import { Chips } from '@shared/components/Chips/Chips'\nimport type { ChipValue } from '@shared/components/Chips/Chips'\nimport { DoneCheckbox } from '@shared/components/DoneCheckbox/DoneCheckbox'\nimport { SubtasksManagerWrapper } from '@shared/components/SubtasksManager/SubtasksManagerWrapper'\nimport { CellEditingDialog } from '@shared/components/LinksManager/CellEditingDialog'\nimport { FC, useState } from 'react'\nimport { EDIT_TRIGGER_CLASS, WidgetBaseProps } from './CellWidget'\nimport { Container } from '@shared/components/LinksManager/LinksManager.styled'\nimport type { SubTaskNode } from '@shared/api'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\n\nexport type SubtasksWidgetData = {\n taskId: string\n subtasks: SubTaskNode[]\n}\n\nexport interface SubtasksWidgetProps extends WidgetBaseProps {\n value?: SubtasksWidgetData\n projectName: string\n cellId: string\n disabled?: boolean\n}\n\nexport const SubtasksWidget: FC<SubtasksWidgetProps> = ({\n value,\n isEditing,\n cellId,\n projectName,\n disabled,\n onChange: _onChange,\n onCancelEdit,\n}) => {\n const { SubtasksManager, useNavigate } = useProjectTableContext()\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const subtasks = value?.subtasks || []\n\n // Create chip values from subtasks\n const chipValues: ChipValue[] = subtasks.map((subtask) => ({\n label: subtask.label || subtask.name,\n tooltip: subtask.description || subtask.label || subtask.name,\n prefix: <DoneCheckbox checked={subtask.isDone} isReadOnly style={{ fontSize: 20 }} />,\n }))\n\n return (\n <>\n <Chips\n values={chipValues}\n pt={{ chip: { className: EDIT_TRIGGER_CLASS } }}\n disabled={disabled}\n />\n {isEditing && value && SubtasksManager && (\n <CellEditingDialog isEditing={isEditing} anchorId={cellId} onClose={onCancelEdit}>\n {disabled ? (\n <Container style={{ color: 'var(--md-sys-color-outline)' }}>\n Subtasks are disabled for this task\n </Container>\n ) : (\n <SubtasksManagerWrapper\n projectName={projectName}\n taskId={value.taskId}\n subtasks={subtasks}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n onClose={onCancelEdit}\n SubtasksManager={SubtasksManager}\n useNavigate={useNavigate!}\n style={{\n padding: 'var(--padding-m)',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n borderRadius: 'var(--border-radius-l)',\n }}\n />\n )}\n </CellEditingDialog>\n )}\n </>\n )\n}\n"],"names":["SubtasksWidget","value","isEditing","cellId","projectName","disabled","_onChange","onCancelEdit","SubtasksManager","useNavigate","useProjectTableContext","selectedSubtaskIds","setSelectedSubtaskIds","useState","subtasks","chipValues","subtask","jsx","DoneCheckbox","jsxs","Fragment","Chips","EDIT_TRIGGER_CLASS","CellEditingDialog","Container","SubtasksManagerWrapper"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SubtasksWidget.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/SubtasksWidget.tsx"],"sourcesContent":["import { Chips } from '@shared/components/Chips/Chips'\nimport type { ChipValue } from '@shared/components/Chips/Chips'\nimport { DoneCheckbox } from '@shared/components/DoneCheckbox/DoneCheckbox'\nimport { SubtasksManagerWrapper } from '@shared/components/SubtasksManager/SubtasksManagerWrapper'\nimport { CellEditingDialog } from '@shared/components/LinksManager/CellEditingDialog'\nimport { FC, useState } from 'react'\nimport { EDIT_TRIGGER_CLASS, WidgetBaseProps } from './CellWidget'\nimport { Container } from '@shared/components/LinksManager/LinksManager.styled'\nimport type { SubTaskNode } from '@shared/api'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\n\nexport type SubtasksWidgetData = {\n taskId: string\n folderId?: string\n subtasks: SubTaskNode[]\n}\n\nexport interface SubtasksWidgetProps extends WidgetBaseProps {\n value?: SubtasksWidgetData\n projectName: string\n cellId: string\n disabled?: boolean\n}\n\nexport const SubtasksWidget: FC<SubtasksWidgetProps> = ({\n value,\n isEditing,\n cellId,\n projectName,\n disabled,\n onChange: _onChange,\n onCancelEdit,\n}) => {\n const { SubtasksManager, useNavigate } = useProjectTableContext()\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const subtasks = value?.subtasks || []\n\n // Create chip values from subtasks\n const chipValues: ChipValue[] = subtasks.map((subtask) => ({\n label: subtask.label || subtask.name,\n tooltip: subtask.description || subtask.label || subtask.name,\n prefix: <DoneCheckbox checked={subtask.isDone} isReadOnly style={{ fontSize: 20 }} />,\n }))\n\n return (\n <>\n <Chips\n values={chipValues}\n pt={{ chip: { className: EDIT_TRIGGER_CLASS } }}\n disabled={disabled}\n />\n {isEditing && value && SubtasksManager && (\n <CellEditingDialog isEditing={isEditing} anchorId={cellId} onClose={onCancelEdit}>\n {disabled ? (\n <Container style={{ color: 'var(--md-sys-color-outline)' }}>\n Subtasks are disabled for this task\n </Container>\n ) : (\n <SubtasksManagerWrapper\n projectName={projectName}\n taskId={value.taskId}\n folderId={value.folderId}\n subtasks={subtasks}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n onClose={onCancelEdit}\n SubtasksManager={SubtasksManager}\n useNavigate={useNavigate!}\n style={{\n padding: 'var(--padding-m)',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n borderRadius: 'var(--border-radius-l)',\n }}\n />\n )}\n </CellEditingDialog>\n )}\n </>\n )\n}\n"],"names":["SubtasksWidget","value","isEditing","cellId","projectName","disabled","_onChange","onCancelEdit","SubtasksManager","useNavigate","useProjectTableContext","selectedSubtaskIds","setSelectedSubtaskIds","useState","subtasks","chipValues","subtask","jsx","DoneCheckbox","jsxs","Fragment","Chips","EDIT_TRIGGER_CLASS","CellEditingDialog","Container","SubtasksManagerWrapper"],"mappings":"0kBAwBaA,EAA0C,CAAC,CACtD,MAAAC,EACA,UAAAC,EACA,OAAAC,EACA,YAAAC,EACA,SAAAC,EACA,SAAUC,EACV,aAAAC,CACF,IAAM,CACJ,KAAM,CAAE,gBAAAC,EAAiB,YAAAC,CAAA,EAAgBC,yBAAA,EACnC,CAACC,EAAoBC,CAAqB,EAAIC,EAAAA,SAAmB,CAAA,CAAE,EAEnEC,EAAWb,GAAO,UAAY,CAAA,EAG9Bc,EAA0BD,EAAS,IAAKE,IAAa,CACzD,MAAOA,EAAQ,OAASA,EAAQ,KAChC,QAASA,EAAQ,aAAeA,EAAQ,OAASA,EAAQ,KACzD,OAAQC,EAAAA,kBAAAA,IAACC,EAAAA,aAAA,CAAa,QAASF,EAAQ,OAAQ,WAAU,GAAC,MAAO,CAAE,SAAU,EAAA,CAAG,CAAG,CAAA,EACnF,EAEF,OACEG,EAAAA,kBAAAA,KAAAC,6BAAA,CACE,SAAA,CAAAH,EAAAA,kBAAAA,IAACI,EAAAA,MAAA,CACC,OAAQN,EACR,GAAI,CAAE,KAAM,CAAE,UAAWO,EAAAA,mBAAmB,EAC5C,SAAAjB,CAAA,CAAA,EAEDH,GAAaD,GAASO,2BACpBe,EAAAA,kBAAA,CAAkB,UAAArB,EAAsB,SAAUC,EAAQ,QAASI,EACjE,SAAAF,EACCY,wBAACO,EAAAA,WAAU,MAAO,CAAE,MAAO,6BAAA,EAAiC,+CAE5D,EAEAP,EAAAA,kBAAAA,IAACQ,EAAAA,uBAAA,CACC,YAAArB,EACA,OAAQH,EAAM,OACd,SAAUA,EAAM,SAChB,SAAAa,EACA,mBAAAH,EACA,iBAAkBC,EAClB,QAASL,EACT,gBAAAC,EACA,YAAAC,EACA,MAAO,CACL,QAAS,mBACT,gBAAiB,6CACjB,aAAc,wBAAA,CAChB,CAAA,CACF,CAEJ,CAAA,EAEJ,CAEJ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { j as e } from "../../../../../_virtual/jsx-runtime.es.js";
|
|
2
2
|
import { Chips as h } from "../../../components/Chips/Chips.es.js";
|
|
3
|
-
import { DoneCheckbox as
|
|
3
|
+
import { DoneCheckbox as u } from "../../../components/DoneCheckbox/DoneCheckbox.es.js";
|
|
4
4
|
import { SubtasksManagerWrapper as S } from "../../../components/SubtasksManager/SubtasksManagerWrapper.es.js";
|
|
5
5
|
import { CellEditingDialog as b } from "../../../components/LinksManager/CellEditingDialog.es.js";
|
|
6
6
|
import { useState as g } from "react";
|
|
@@ -11,21 +11,21 @@ const M = ({
|
|
|
11
11
|
value: r,
|
|
12
12
|
isEditing: s,
|
|
13
13
|
cellId: l,
|
|
14
|
-
projectName:
|
|
14
|
+
projectName: d,
|
|
15
15
|
disabled: t,
|
|
16
16
|
onChange: j,
|
|
17
17
|
onCancelEdit: a
|
|
18
18
|
}) => {
|
|
19
|
-
const { SubtasksManager: n, useNavigate:
|
|
19
|
+
const { SubtasksManager: n, useNavigate: m } = C(), [c, p] = g([]), i = r?.subtasks || [], f = i.map((o) => ({
|
|
20
20
|
label: o.label || o.name,
|
|
21
21
|
tooltip: o.description || o.label || o.name,
|
|
22
|
-
prefix: /* @__PURE__ */ e.jsx(
|
|
22
|
+
prefix: /* @__PURE__ */ e.jsx(u, { checked: o.isDone, isReadOnly: !0, style: { fontSize: 20 } })
|
|
23
23
|
}));
|
|
24
24
|
return /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
25
25
|
/* @__PURE__ */ e.jsx(
|
|
26
26
|
h,
|
|
27
27
|
{
|
|
28
|
-
values:
|
|
28
|
+
values: f,
|
|
29
29
|
pt: { chip: { className: x } },
|
|
30
30
|
disabled: t
|
|
31
31
|
}
|
|
@@ -33,14 +33,15 @@ const M = ({
|
|
|
33
33
|
s && r && n && /* @__PURE__ */ e.jsx(b, { isEditing: s, anchorId: l, onClose: a, children: t ? /* @__PURE__ */ e.jsx(k, { style: { color: "var(--md-sys-color-outline)" }, children: "Subtasks are disabled for this task" }) : /* @__PURE__ */ e.jsx(
|
|
34
34
|
S,
|
|
35
35
|
{
|
|
36
|
-
projectName:
|
|
36
|
+
projectName: d,
|
|
37
37
|
taskId: r.taskId,
|
|
38
|
+
folderId: r.folderId,
|
|
38
39
|
subtasks: i,
|
|
39
|
-
selectedSubtaskIds:
|
|
40
|
+
selectedSubtaskIds: c,
|
|
40
41
|
onSelectSubtasks: p,
|
|
41
42
|
onClose: a,
|
|
42
43
|
SubtasksManager: n,
|
|
43
|
-
useNavigate:
|
|
44
|
+
useNavigate: m,
|
|
44
45
|
style: {
|
|
45
46
|
padding: "var(--padding-m)",
|
|
46
47
|
backgroundColor: "var(--md-sys-color-surface-container-high)",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubtasksWidget.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/SubtasksWidget.tsx"],"sourcesContent":["import { Chips } from '@shared/components/Chips/Chips'\nimport type { ChipValue } from '@shared/components/Chips/Chips'\nimport { DoneCheckbox } from '@shared/components/DoneCheckbox/DoneCheckbox'\nimport { SubtasksManagerWrapper } from '@shared/components/SubtasksManager/SubtasksManagerWrapper'\nimport { CellEditingDialog } from '@shared/components/LinksManager/CellEditingDialog'\nimport { FC, useState } from 'react'\nimport { EDIT_TRIGGER_CLASS, WidgetBaseProps } from './CellWidget'\nimport { Container } from '@shared/components/LinksManager/LinksManager.styled'\nimport type { SubTaskNode } from '@shared/api'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\n\nexport type SubtasksWidgetData = {\n taskId: string\n subtasks: SubTaskNode[]\n}\n\nexport interface SubtasksWidgetProps extends WidgetBaseProps {\n value?: SubtasksWidgetData\n projectName: string\n cellId: string\n disabled?: boolean\n}\n\nexport const SubtasksWidget: FC<SubtasksWidgetProps> = ({\n value,\n isEditing,\n cellId,\n projectName,\n disabled,\n onChange: _onChange,\n onCancelEdit,\n}) => {\n const { SubtasksManager, useNavigate } = useProjectTableContext()\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const subtasks = value?.subtasks || []\n\n // Create chip values from subtasks\n const chipValues: ChipValue[] = subtasks.map((subtask) => ({\n label: subtask.label || subtask.name,\n tooltip: subtask.description || subtask.label || subtask.name,\n prefix: <DoneCheckbox checked={subtask.isDone} isReadOnly style={{ fontSize: 20 }} />,\n }))\n\n return (\n <>\n <Chips\n values={chipValues}\n pt={{ chip: { className: EDIT_TRIGGER_CLASS } }}\n disabled={disabled}\n />\n {isEditing && value && SubtasksManager && (\n <CellEditingDialog isEditing={isEditing} anchorId={cellId} onClose={onCancelEdit}>\n {disabled ? (\n <Container style={{ color: 'var(--md-sys-color-outline)' }}>\n Subtasks are disabled for this task\n </Container>\n ) : (\n <SubtasksManagerWrapper\n projectName={projectName}\n taskId={value.taskId}\n subtasks={subtasks}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n onClose={onCancelEdit}\n SubtasksManager={SubtasksManager}\n useNavigate={useNavigate!}\n style={{\n padding: 'var(--padding-m)',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n borderRadius: 'var(--border-radius-l)',\n }}\n />\n )}\n </CellEditingDialog>\n )}\n </>\n )\n}\n"],"names":["SubtasksWidget","value","isEditing","cellId","projectName","disabled","_onChange","onCancelEdit","SubtasksManager","useNavigate","useProjectTableContext","selectedSubtaskIds","setSelectedSubtaskIds","useState","subtasks","chipValues","subtask","jsx","DoneCheckbox","jsxs","Fragment","Chips","EDIT_TRIGGER_CLASS","CellEditingDialog","Container","SubtasksManagerWrapper"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"SubtasksWidget.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/SubtasksWidget.tsx"],"sourcesContent":["import { Chips } from '@shared/components/Chips/Chips'\nimport type { ChipValue } from '@shared/components/Chips/Chips'\nimport { DoneCheckbox } from '@shared/components/DoneCheckbox/DoneCheckbox'\nimport { SubtasksManagerWrapper } from '@shared/components/SubtasksManager/SubtasksManagerWrapper'\nimport { CellEditingDialog } from '@shared/components/LinksManager/CellEditingDialog'\nimport { FC, useState } from 'react'\nimport { EDIT_TRIGGER_CLASS, WidgetBaseProps } from './CellWidget'\nimport { Container } from '@shared/components/LinksManager/LinksManager.styled'\nimport type { SubTaskNode } from '@shared/api'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\n\nexport type SubtasksWidgetData = {\n taskId: string\n folderId?: string\n subtasks: SubTaskNode[]\n}\n\nexport interface SubtasksWidgetProps extends WidgetBaseProps {\n value?: SubtasksWidgetData\n projectName: string\n cellId: string\n disabled?: boolean\n}\n\nexport const SubtasksWidget: FC<SubtasksWidgetProps> = ({\n value,\n isEditing,\n cellId,\n projectName,\n disabled,\n onChange: _onChange,\n onCancelEdit,\n}) => {\n const { SubtasksManager, useNavigate } = useProjectTableContext()\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const subtasks = value?.subtasks || []\n\n // Create chip values from subtasks\n const chipValues: ChipValue[] = subtasks.map((subtask) => ({\n label: subtask.label || subtask.name,\n tooltip: subtask.description || subtask.label || subtask.name,\n prefix: <DoneCheckbox checked={subtask.isDone} isReadOnly style={{ fontSize: 20 }} />,\n }))\n\n return (\n <>\n <Chips\n values={chipValues}\n pt={{ chip: { className: EDIT_TRIGGER_CLASS } }}\n disabled={disabled}\n />\n {isEditing && value && SubtasksManager && (\n <CellEditingDialog isEditing={isEditing} anchorId={cellId} onClose={onCancelEdit}>\n {disabled ? (\n <Container style={{ color: 'var(--md-sys-color-outline)' }}>\n Subtasks are disabled for this task\n </Container>\n ) : (\n <SubtasksManagerWrapper\n projectName={projectName}\n taskId={value.taskId}\n folderId={value.folderId}\n subtasks={subtasks}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n onClose={onCancelEdit}\n SubtasksManager={SubtasksManager}\n useNavigate={useNavigate!}\n style={{\n padding: 'var(--padding-m)',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n borderRadius: 'var(--border-radius-l)',\n }}\n />\n )}\n </CellEditingDialog>\n )}\n </>\n )\n}\n"],"names":["SubtasksWidget","value","isEditing","cellId","projectName","disabled","_onChange","onCancelEdit","SubtasksManager","useNavigate","useProjectTableContext","selectedSubtaskIds","setSelectedSubtaskIds","useState","subtasks","chipValues","subtask","jsx","DoneCheckbox","jsxs","Fragment","Chips","EDIT_TRIGGER_CLASS","CellEditingDialog","Container","SubtasksManagerWrapper"],"mappings":";;;;;;;;;AAwBO,MAAMA,IAA0C,CAAC;AAAA,EACtD,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAUC;AAAA,EACV,cAAAC;AACF,MAAM;AACJ,QAAM,EAAE,iBAAAC,GAAiB,aAAAC,EAAA,IAAgBC,EAAA,GACnC,CAACC,GAAoBC,CAAqB,IAAIC,EAAmB,CAAA,CAAE,GAEnEC,IAAWb,GAAO,YAAY,CAAA,GAG9Bc,IAA0BD,EAAS,IAAI,CAACE,OAAa;AAAA,IACzD,OAAOA,EAAQ,SAASA,EAAQ;AAAA,IAChC,SAASA,EAAQ,eAAeA,EAAQ,SAASA,EAAQ;AAAA,IACzD,QAAQC,gBAAAA,EAAAA,IAACC,GAAA,EAAa,SAASF,EAAQ,QAAQ,YAAU,IAAC,OAAO,EAAE,UAAU,GAAA,EAAG,CAAG;AAAA,EAAA,EACnF;AAEF,SACEG,gBAAAA,EAAAA,KAAAC,YAAA,EACE,UAAA;AAAA,IAAAH,gBAAAA,EAAAA;AAAAA,MAACI;AAAA,MAAA;AAAA,QACC,QAAQN;AAAA,QACR,IAAI,EAAE,MAAM,EAAE,WAAWO,IAAmB;AAAA,QAC5C,UAAAjB;AAAA,MAAA;AAAA,IAAA;AAAA,IAEDH,KAAaD,KAASO,2BACpBe,GAAA,EAAkB,WAAArB,GAAsB,UAAUC,GAAQ,SAASI,GACjE,UAAAF,IACCY,gBAAAA,MAACO,KAAU,OAAO,EAAE,OAAO,8BAAA,GAAiC,iDAE5D,IAEAP,gBAAAA,EAAAA;AAAAA,MAACQ;AAAA,MAAA;AAAA,QACC,aAAArB;AAAA,QACA,QAAQH,EAAM;AAAA,QACd,UAAUA,EAAM;AAAA,QAChB,UAAAa;AAAA,QACA,oBAAAH;AAAA,QACA,kBAAkBC;AAAA,QAClB,SAASL;AAAA,QACT,iBAAAC;AAAA,QACA,aAAAC;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,cAAc;AAAA,QAAA;AAAA,MAChB;AAAA,IAAA,EACF,CAEJ;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../../../../../_virtual/jsx-runtime.cjs.js"),n=require("react"),I=require("react-markdown"),ee=require("remark-gfm"),te=require("rehype-raw"),re=require("./TextWidgetInput.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../../../../../_virtual/jsx-runtime.cjs.js"),n=require("react"),I=require("react-markdown"),ee=require("remark-gfm"),te=require("rehype-raw"),re=require("./TextWidgetInput.cjs.js"),j=require("styled-components"),ne=require("@ynput/ayon-react-components"),oe=require("clsx");require("lodash");require("react-toastify");require("uuid");const se=require("../../../util/parseHtmlToPlainTextWithLinks.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../util/pubsub.cjs.js");const O=require("./TextContentWidget.cjs.js"),ie=require("../../../components/LinksManager/CellEditingDialog.cjs.js"),ae=require("./wrapMode.cjs.js"),U=j.span`
|
|
2
2
|
overflow: hidden;
|
|
3
3
|
text-overflow: ellipsis;
|
|
4
4
|
white-space: nowrap;
|
|
@@ -13,12 +13,28 @@
|
|
|
13
13
|
display: block;
|
|
14
14
|
overflow: hidden;
|
|
15
15
|
width: 100%;
|
|
16
|
+
max-height: 100%;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
&.regular {
|
|
19
20
|
display: block;
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
+
|
|
23
|
+
${ae.wrapMode`
|
|
24
|
+
&:not(.markdown) {
|
|
25
|
+
white-space: normal;
|
|
26
|
+
word-break: break-word;
|
|
27
|
+
display: block;
|
|
28
|
+
overflow: hidden;
|
|
29
|
+
width: 100%;
|
|
30
|
+
max-height: 100%;
|
|
31
|
+
|
|
32
|
+
> .icon {
|
|
33
|
+
margin-right: 4px;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
`}
|
|
37
|
+
`,R=j.a`
|
|
22
38
|
color: var(--md-sys-color-primary, #0066cc);
|
|
23
39
|
text-decoration: none;
|
|
24
40
|
cursor: pointer;
|
|
@@ -29,7 +45,7 @@
|
|
|
29
45
|
&:hover {
|
|
30
46
|
text-decoration: underline;
|
|
31
47
|
}
|
|
32
|
-
`,
|
|
48
|
+
`,le=j.div`
|
|
33
49
|
background: var(--md-sys-color-surface-container-lowest);
|
|
34
50
|
border-radius: 8px;
|
|
35
51
|
padding: 12px;
|
|
@@ -55,5 +71,5 @@
|
|
|
55
71
|
text-decoration: underline;
|
|
56
72
|
}
|
|
57
73
|
}
|
|
58
|
-
`;class
|
|
74
|
+
`;class ce{lastShownTime=0;warmTimeout=500;coldDelay=600;getDelay(){return Date.now()-this.lastShownTime<this.warmTimeout?0:this.coldDelay}markShown(){this.lastShownTime=Date.now()}}const H=new ce,T="projectTreeTextPreviewOpen",ue=i=>{try{const a=new URL(i.trim());return a.protocol==="http:"||a.protocol==="https:"}catch{return!1}},de=i=>{const a=/(https?:\/\/[^\s<>"]+[^\s.,!?;:<>\")\]])/gi;return i.split(a).map((c,x)=>ue(c)?{type:"url",content:c,key:x}:{type:"text",content:c,key:x})},M=i=>/<[^>]*>/.test(i),pe=n.forwardRef(({value:i,option:a,isMarkdown:p,isEditing:c,isInherited:x,onChange:f,onCancelEdit:h,style:V,type:b,columnId:fe,cellId:s,onRequestEdit:_,getDraftValue:A,setDraftValue:F,className:N,...B},m)=>{const C=_||(()=>{}),z=A||(()=>null),G=F||(()=>{}),[$,P]=n.useState(!1),[J,w]=n.useState(!1),[S,K]=n.useState(!1),[q,Q]=n.useState(!1),v=n.useRef(null),g=n.useRef(),y=n.useRef(),E=n.useRef(!1),D=$||J,k=a?.label||i,d=typeof k=="string"?k:String(k??""),X=!p&&!M(d)&&!d.match(/(https?:\/\/\S+)/gi);n.useEffect(()=>{const e=v.current;if(!e)return;let t=null;const r=()=>{t!==null&&cancelAnimationFrame(t),t=requestAnimationFrame(()=>{t=null,Q(e.scrollHeight>e.clientHeight+1||e.scrollWidth>e.clientWidth+1)})},l=new ResizeObserver(r);return l.observe(e),r(),()=>{t!==null&&cancelAnimationFrame(t),l.disconnect()}},[d]),n.useEffect(()=>{const e=v.current;if(!e)return;const t=e.closest("td");if(!t)return;const r=()=>P(!0),l=()=>P(!1);return t.addEventListener("mouseenter",r),t.addEventListener("mouseleave",l),()=>{t.removeEventListener("mouseenter",r),t.removeEventListener("mouseleave",l)}},[]);const u=n.useCallback(e=>{E.current=e,K(e)},[]);n.useEffect(()=>(clearTimeout(g.current),clearTimeout(y.current),c?u(!1):D?E.current||q&&s&&(g.current=setTimeout(()=>{E.current||(u(!0),H.markShown(),window.dispatchEvent(new CustomEvent(T,{detail:{cellId:s}})))},H.getDelay())):y.current=setTimeout(()=>u(!1),300),()=>{clearTimeout(g.current),clearTimeout(y.current)}),[D,q,c,s,u]),n.useEffect(()=>{const e=t=>{t.detail?.cellId!==s&&u(!1)};return window.addEventListener(T,e),()=>window.removeEventListener(T,e)},[s,u]);const W=n.useCallback(()=>{u(!1),s&&C(s)},[s,C,u]),Y=n.useCallback((e,t)=>{f(e,t==="Enter"?"Click":t)},[f]),L=()=>p?o.jsxRuntimeExports.jsx(I,{remarkPlugins:[ee],rehypePlugins:[te],components:{p:({children:t})=>o.jsxRuntimeExports.jsx("span",{children:t}),a:({href:t,children:r})=>o.jsxRuntimeExports.jsx(R,{href:t||"#",onMouseDown:l=>l.stopPropagation(),target:"_blank",rel:"noopener noreferrer",children:r})},children:d}):M(d)?se.parseHtmlToPlainTextWithLinks(d).map(r=>r.type==="url"&&r.href?o.jsxRuntimeExports.jsx(R,{href:r.href,onMouseDown:l=>l.stopPropagation(),target:"_blank",rel:"noopener noreferrer",children:r.content},r.key):o.jsxRuntimeExports.jsx("span",{style:{whiteSpace:"pre-line"},children:r.content},r.key)):d.match(/(https?:\/\/\S+)/gi)?de(d).map(r=>r.type==="url"?o.jsxRuntimeExports.jsx(R,{href:r.content,onMouseDown:l=>l.stopPropagation(),target:"_blank",rel:"noopener noreferrer",children:r.content},r.key):r.content):d;if(c&&!p)return o.jsxRuntimeExports.jsx(re.TextWidgetInput,{value:i,onChange:f,onCancel:h,type:b||"string"});const Z=oe(N,{markdown:p,regular:X});return o.jsxRuntimeExports.jsxs(o.jsxRuntimeExports.Fragment,{children:[o.jsxRuntimeExports.jsxs(U,{className:Z,style:{color:a?.color,...V},...B,ref:e=>{v.current=e,typeof m=="function"?m(e):m&&(m.current=e)},children:[a?.icon&&o.jsxRuntimeExports.jsx(ne.Icon,{icon:a.icon,style:{color:a.color}}),L()]}),c&&p&&s&&o.jsxRuntimeExports.jsx(O.TextContentWidget,{value:i,cellId:s,isEditing:!0,variant:"edit",allowMarkdown:!0,valueType:b||"string",onChange:Y,onCancelEdit:h,onDismissWithoutSave:h,draftValue:z(),onEditingDraftChange:G}),S&&!c&&p&&s&&o.jsxRuntimeExports.jsx(O.TextContentWidget,{value:i,cellId:s,isEditing:!0,variant:"preview",allowMarkdown:!0,onChange:f,onCancelEdit:()=>u(!1),onPreviewClick:W,onPreviewMouseEnter:()=>w(!0),onPreviewMouseLeave:()=>w(!1)}),S&&!c&&!p&&s&&o.jsxRuntimeExports.jsx(ie.CellEditingDialog,{isEditing:!0,anchorId:s,onClose:()=>u(!1),children:o.jsxRuntimeExports.jsx(le,{onClick:W,onMouseEnter:()=>w(!0),onMouseLeave:()=>w(!1),onMouseDown:e=>e.stopPropagation(),children:L()})})]})});exports.StyledBaseTextWidget=U;exports.TextWidget=pe;
|
|
59
75
|
//# sourceMappingURL=TextWidget.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextWidget.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/TextWidget.tsx"],"sourcesContent":["import { forwardRef, useState, useEffect, useRef, useCallback } from 'react'\nimport Markdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport rehypeRaw from 'rehype-raw'\nimport { TextWidgetInput } from './TextWidgetInput'\nimport { WidgetBaseProps } from './CellWidget'\nimport styled from 'styled-components'\nimport type { AttributeData } from '@shared/api/generated/entityLists'\nimport type { EnumItem } from '@shared/api/generated/projects'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport { parseHtmlToPlainTextWithLinks } from '@shared/util'\nimport { TextContentWidget } from './TextContentWidget'\nimport { CellEditingDialog } from '@shared/components/LinksManager/CellEditingDialog'\nimport { CellId } from '../utils/cellUtils'\n\n// ── Styled components ──────────────────────────────────────────────\n\nexport const StyledBaseTextWidget = styled.span`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n\n display: flex;\n gap: 4px;\n\n &.markdown {\n white-space: normal;\n word-break: break-word;\n display: block;\n overflow: hidden;\n width: 100%;\n }\n\n &.regular {\n display: block;\n }\n`\n\nconst StyledLink = styled.a`\n color: var(--md-sys-color-primary, #0066cc);\n text-decoration: none;\n cursor: pointer;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover {\n text-decoration: underline;\n }\n`\n\nconst StyledPreviewContent = styled.div`\n background: var(--md-sys-color-surface-container-lowest);\n border-radius: 8px;\n padding: 12px;\n white-space: pre-wrap;\n word-break: break-word;\n min-height: 40px;\n max-height: none;\n flex: 1;\n overflow: auto;\n border: 2px solid transparent;\n cursor: pointer;\n\n a {\n color: var(--md-sys-color-primary, #0066cc);\n text-decoration: none;\n white-space: normal;\n word-break: break-all;\n overflow-wrap: break-word;\n overflow: visible;\n text-overflow: unset;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`\n\n// ── Preview delay controller (module singleton) ────────────────────\n\nclass PreviewDelayController {\n private lastShownTime = 0\n private warmTimeout = 500 // ms idle before resetting to cold mode\n private coldDelay = 600 // ms delay before first preview\n\n getDelay(): number {\n const elapsed = Date.now() - this.lastShownTime\n return elapsed < this.warmTimeout ? 0 : this.coldDelay\n }\n\n markShown(): void {\n this.lastShownTime = Date.now()\n }\n}\n\nconst previewDelayController = new PreviewDelayController()\n\n// Custom event dispatched when a preview opens (ensures single preview at a time)\nconst PREVIEW_OPEN_EVENT = 'projectTreeTextPreviewOpen'\n\n// ── Helpers ────────────────────────────────────────────────────────\n\n// Function to check if a string is a valid URL\nconst isValidUrl = (text: string): boolean => {\n try {\n const url = new URL(text.trim())\n return url.protocol === 'http:' || url.protocol === 'https:'\n } catch {\n return false\n }\n}\n\n// Function to parse text and extract URLs\nconst parseTextWithUrls = (text: string) => {\n // Regex to match HTTP/HTTPS URLs\n const urlRegex = /(https?:\\/\\/[^\\s<>\"]+[^\\s.,!?;:<>\\\")\\]])/gi\n const parts = text.split(urlRegex)\n\n return parts.map((part, index) => {\n if (isValidUrl(part)) {\n return { type: 'url', content: part, key: index }\n }\n return { type: 'text', content: part, key: index }\n })\n}\n\n// Function to check if content contains HTML tags\nconst containsHtml = (text: string): boolean => {\n return /<[^>]*>/.test(text)\n}\n\ntype AttributeType = AttributeData['type']\nexport type TextWidgetType = Extract<AttributeType, 'string' | 'integer' | 'float'>\n\nexport interface TextWidgetProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'onChange'>,\n WidgetBaseProps {\n value: string\n isMarkdown?: boolean\n option?: EnumItem\n isInherited?: boolean\n type?: TextWidgetType\n columnId?: string\n cellId?: string\n onRequestEdit?: (id: CellId | null) => void\n getDraftValue?: () => string | null\n setDraftValue?: (value: string | null) => void\n}\n\nexport const TextWidget = forwardRef<HTMLSpanElement, TextWidgetProps>(\n (\n {\n value,\n option,\n isMarkdown,\n isEditing,\n isInherited,\n onChange,\n onCancelEdit,\n style,\n type,\n columnId,\n cellId,\n onRequestEdit,\n getDraftValue,\n setDraftValue,\n className,\n ...props\n },\n ref,\n ) => {\n const requestEdit = onRequestEdit || (() => undefined)\n const getCurrentDraft = getDraftValue || (() => null)\n const setCurrentDraft = setDraftValue || (() => undefined)\n\n const [isHoveredOnCell, setIsHoveredOnCell] = useState(false)\n const [isHoveredOnPreview, setIsHoveredOnPreview] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [isOverflowing, setIsOverflowing] = useState(false)\n\n const textRef = useRef<HTMLSpanElement>(null)\n const showTimerRef = useRef<ReturnType<typeof setTimeout>>()\n const closeTimerRef = useRef<ReturnType<typeof setTimeout>>()\n const showPreviewRef = useRef(false)\n const isAnythingHovered = isHoveredOnCell || isHoveredOnPreview\n\n const displayText = option?.label || value\n const textValue = typeof displayText === 'string' ? displayText : String(displayText ?? '')\n // does the content contain only regular text?\n const isRegularText =\n !isMarkdown && !containsHtml(textValue) && !textValue.match(/(https?:\\/\\/\\S+)/gi)\n\n useEffect(() => {\n const el = textRef.current\n if (!el) return\n\n let rafId: number | null = null\n const checkOverflow = () => {\n // Debounce via rAF so rapid resize events don't toggle state every frame\n if (rafId !== null) cancelAnimationFrame(rafId)\n rafId = requestAnimationFrame(() => {\n rafId = null\n if (isMarkdown) {\n // Vertical overflow (text wraps but exceeds cell height)\n setIsOverflowing(el.scrollHeight > el.clientHeight + 1)\n } else {\n // Horizontal overflow (text is truncated with ellipsis)\n setIsOverflowing(el.scrollWidth > el.clientWidth + 1)\n }\n })\n }\n\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n checkOverflow()\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId)\n observer.disconnect()\n }\n }, [textValue, isMarkdown])\n\n // ── Hover tracking on parent <td>\n useEffect(() => {\n const el = textRef.current\n if (!el) return\n\n const td = el.closest('td')\n if (!td) return\n\n const handleMouseEnter = () => setIsHoveredOnCell(true)\n const handleMouseLeave = () => setIsHoveredOnCell(false)\n\n td.addEventListener('mouseenter', handleMouseEnter)\n td.addEventListener('mouseleave', handleMouseLeave)\n\n return () => {\n td.removeEventListener('mouseenter', handleMouseEnter)\n td.removeEventListener('mouseleave', handleMouseLeave)\n }\n }, [])\n\n // ── Preview show/hide logic\n // Keep ref in sync so timers can check current visibility without re-triggering the effect\n const updatePreview = useCallback((value: boolean) => {\n showPreviewRef.current = value\n setShowPreview(value)\n }, [])\n\n useEffect(() => {\n clearTimeout(showTimerRef.current)\n clearTimeout(closeTimerRef.current)\n\n if (isEditing) {\n updatePreview(false)\n } else if (!isAnythingHovered) {\n // Grace period before closing (handles cell→popup mouse transition)\n closeTimerRef.current = setTimeout(() => updatePreview(false), 300)\n } else if (showPreviewRef.current) {\n // Preview already visible — keep it open regardless of overflow changes\n // (overflow can toggle during column resize; don't flicker)\n } else if (isOverflowing && cellId) {\n // Start delay timer to show preview\n showTimerRef.current = setTimeout(() => {\n if (showPreviewRef.current) return // double-check, already visible\n updatePreview(true)\n previewDelayController.markShown()\n window.dispatchEvent(new CustomEvent(PREVIEW_OPEN_EVENT, { detail: { cellId } }))\n }, previewDelayController.getDelay())\n }\n\n return () => {\n clearTimeout(showTimerRef.current)\n clearTimeout(closeTimerRef.current)\n }\n }, [isAnythingHovered, isOverflowing, isEditing, cellId, updatePreview])\n\n // ── Listen for other previews opening → close this one ───────\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail\n if (detail?.cellId !== cellId) {\n updatePreview(false)\n }\n }\n\n window.addEventListener(PREVIEW_OPEN_EVENT, handler)\n return () => window.removeEventListener(PREVIEW_OPEN_EVENT, handler)\n }, [cellId, updatePreview])\n\n // ── Preview click → start editing\n const handlePreviewClick = useCallback(() => {\n updatePreview(false)\n if (cellId) requestEdit(cellId)\n }, [cellId, requestEdit, updatePreview])\n\n // For description columns, Ctrl+Enter should save and close — not jump to next row.\n // Remap 'Enter' → 'Click' so CellWidget doesn't call moveToNextRow.\n const handleDescriptionChange: WidgetBaseProps['onChange'] = useCallback(\n (val, key) => {\n onChange(val, key === 'Enter' ? 'Click' : key)\n },\n [onChange],\n )\n\n // ── Render content\n const renderContent = () => {\n // For description columns, keep markdown rendering\n if (isMarkdown) {\n return (\n <Markdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n p: ({ children }) => <span>{children}</span>,\n a: ({ href, children }) => (\n <StyledLink\n href={href || '#'}\n onMouseDown={(e) => e.stopPropagation()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </StyledLink>\n ),\n }}\n >\n {textValue}\n </Markdown>\n )\n }\n\n // Check if content contains HTML\n if (containsHtml(textValue)) {\n // Parse HTML to plain text with preserved links\n const parts = parseHtmlToPlainTextWithLinks(textValue)\n return parts.map((part) => {\n if (part.type === 'url' && part.href) {\n return (\n <StyledLink\n key={part.key}\n href={part.href}\n onMouseDown={(e) => e.stopPropagation()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {part.content}\n </StyledLink>\n )\n }\n return (\n <span key={part.key} style={{ whiteSpace: 'pre-line' }}>\n {part.content}\n </span>\n )\n })\n }\n\n // Check for URLs in plain text\n const hasUrls = textValue.match(/(https?:\\/\\/\\S+)/gi)\n if (hasUrls) {\n // Text with URLs (handles both single URL and mixed content)\n const parts = parseTextWithUrls(textValue)\n return parts.map((part) => {\n if (part.type === 'url') {\n return (\n <StyledLink\n key={part.key}\n href={part.content}\n onMouseDown={(e) => e.stopPropagation()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {part.content}\n </StyledLink>\n )\n }\n return part.content\n })\n }\n\n // Regular text\n return textValue\n }\n\n // ── Non-description editing: inline TextWidgetInput\n if (isEditing && !isMarkdown) {\n return (\n <TextWidgetInput\n value={value}\n onChange={onChange}\n onCancel={onCancelEdit}\n type={type || 'string'}\n />\n )\n }\n\n // ── Render: display content + any overlays ───────────────────\n const combinedClassName = clsx(className, {\n markdown: isMarkdown,\n regular: isRegularText,\n })\n\n return (\n <>\n <StyledBaseTextWidget\n className={combinedClassName}\n style={{ color: option?.color, ...style }}\n {...props}\n ref={(node) => {\n // Merge external ref with internal ref\n ;(textRef as React.MutableRefObject<HTMLSpanElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLSpanElement | null>).current = node\n }}\n >\n {option?.icon && (\n <Icon\n icon={option.icon as string}\n style={{\n color: option.color,\n }}\n />\n )}\n {renderContent()}\n </StyledBaseTextWidget>\n\n {/* Description column editing (Quill editor in popup) */}\n {isEditing && isMarkdown && cellId && (\n <TextContentWidget\n value={value}\n cellId={cellId}\n isEditing={true}\n variant=\"edit\"\n allowMarkdown={true}\n valueType={type || 'string'}\n onChange={handleDescriptionChange}\n onCancelEdit={onCancelEdit}\n onDismissWithoutSave={onCancelEdit}\n draftValue={getCurrentDraft()}\n onEditingDraftChange={setCurrentDraft}\n />\n )}\n\n {/* Description column hover preview (markdown in popup) */}\n {showPreview && !isEditing && isMarkdown && cellId && (\n <TextContentWidget\n value={value}\n cellId={cellId}\n isEditing={true}\n variant=\"preview\"\n allowMarkdown={true}\n onChange={onChange}\n onCancelEdit={() => updatePreview(false)}\n onPreviewClick={handlePreviewClick}\n onPreviewMouseEnter={() => setIsHoveredOnPreview(true)}\n onPreviewMouseLeave={() => setIsHoveredOnPreview(false)}\n />\n )}\n\n {/* Non-description column hover preview (plain text in popup) */}\n {showPreview && !isEditing && !isMarkdown && cellId && (\n <CellEditingDialog\n isEditing={true}\n anchorId={cellId}\n onClose={() => updatePreview(false)}\n >\n <StyledPreviewContent\n onClick={handlePreviewClick}\n onMouseEnter={() => setIsHoveredOnPreview(true)}\n onMouseLeave={() => setIsHoveredOnPreview(false)}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {renderContent()}\n </StyledPreviewContent>\n </CellEditingDialog>\n )}\n </>\n )\n },\n)\n"],"names":["StyledBaseTextWidget","styled","StyledLink","StyledPreviewContent","PreviewDelayController","previewDelayController","PREVIEW_OPEN_EVENT","isValidUrl","text","url","parseTextWithUrls","urlRegex","part","index","containsHtml","TextWidget","forwardRef","value","option","isMarkdown","isEditing","isInherited","onChange","onCancelEdit","style","type","columnId","cellId","onRequestEdit","getDraftValue","setDraftValue","className","props","ref","requestEdit","getCurrentDraft","setCurrentDraft","isHoveredOnCell","setIsHoveredOnCell","useState","isHoveredOnPreview","setIsHoveredOnPreview","showPreview","setShowPreview","isOverflowing","setIsOverflowing","textRef","useRef","showTimerRef","closeTimerRef","showPreviewRef","isAnythingHovered","displayText","textValue","isRegularText","useEffect","el","rafId","checkOverflow","observer","td","handleMouseEnter","handleMouseLeave","updatePreview","useCallback","handler","e","handlePreviewClick","handleDescriptionChange","val","key","renderContent","jsx","Markdown","remarkGfm","rehypeRaw","children","href","parseHtmlToPlainTextWithLinks","TextWidgetInput","combinedClassName","clsx","jsxs","Fragment","node","Icon","TextContentWidget","CellEditingDialog"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextWidget.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/TextWidget.tsx"],"sourcesContent":["import { forwardRef, useState, useEffect, useRef, useCallback } from 'react'\nimport Markdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport rehypeRaw from 'rehype-raw'\nimport { TextWidgetInput } from './TextWidgetInput'\nimport { WidgetBaseProps } from './CellWidget'\nimport styled from 'styled-components'\nimport type { AttributeData } from '@shared/api/generated/entityLists'\nimport type { EnumItem } from '@shared/api/generated/projects'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport { parseHtmlToPlainTextWithLinks } from '@shared/util'\nimport { TextContentWidget } from './TextContentWidget'\nimport { CellEditingDialog } from '@shared/components/LinksManager/CellEditingDialog'\nimport { CellId } from '../utils/cellUtils'\nimport { wrapMode } from './wrapMode'\n\n// ── Styled components ──────────────────────────────────────────────\n\nexport const StyledBaseTextWidget = styled.span`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n\n display: flex;\n gap: 4px;\n\n &.markdown {\n white-space: normal;\n word-break: break-word;\n display: block;\n overflow: hidden;\n width: 100%;\n max-height: 100%;\n }\n\n &.regular {\n display: block;\n }\n\n ${wrapMode`\n &:not(.markdown) {\n white-space: normal;\n word-break: break-word;\n display: block;\n overflow: hidden;\n width: 100%;\n max-height: 100%;\n\n > .icon {\n margin-right: 4px;\n }\n }\n `}\n`\n\nconst StyledLink = styled.a`\n color: var(--md-sys-color-primary, #0066cc);\n text-decoration: none;\n cursor: pointer;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover {\n text-decoration: underline;\n }\n`\n\nconst StyledPreviewContent = styled.div`\n background: var(--md-sys-color-surface-container-lowest);\n border-radius: 8px;\n padding: 12px;\n white-space: pre-wrap;\n word-break: break-word;\n min-height: 40px;\n max-height: none;\n flex: 1;\n overflow: auto;\n border: 2px solid transparent;\n cursor: pointer;\n\n a {\n color: var(--md-sys-color-primary, #0066cc);\n text-decoration: none;\n white-space: normal;\n word-break: break-all;\n overflow-wrap: break-word;\n overflow: visible;\n text-overflow: unset;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`\n\n// ── Preview delay controller (module singleton) ────────────────────\n\nclass PreviewDelayController {\n private lastShownTime = 0\n private warmTimeout = 500 // ms idle before resetting to cold mode\n private coldDelay = 600 // ms delay before first preview\n\n getDelay(): number {\n const elapsed = Date.now() - this.lastShownTime\n return elapsed < this.warmTimeout ? 0 : this.coldDelay\n }\n\n markShown(): void {\n this.lastShownTime = Date.now()\n }\n}\n\nconst previewDelayController = new PreviewDelayController()\n\n// Custom event dispatched when a preview opens (ensures single preview at a time)\nconst PREVIEW_OPEN_EVENT = 'projectTreeTextPreviewOpen'\n\n// ── Helpers ────────────────────────────────────────────────────────\n\n// Function to check if a string is a valid URL\nconst isValidUrl = (text: string): boolean => {\n try {\n const url = new URL(text.trim())\n return url.protocol === 'http:' || url.protocol === 'https:'\n } catch {\n return false\n }\n}\n\n// Function to parse text and extract URLs\nconst parseTextWithUrls = (text: string) => {\n // Regex to match HTTP/HTTPS URLs\n const urlRegex = /(https?:\\/\\/[^\\s<>\"]+[^\\s.,!?;:<>\\\")\\]])/gi\n const parts = text.split(urlRegex)\n\n return parts.map((part, index) => {\n if (isValidUrl(part)) {\n return { type: 'url', content: part, key: index }\n }\n return { type: 'text', content: part, key: index }\n })\n}\n\n// Function to check if content contains HTML tags\nconst containsHtml = (text: string): boolean => {\n return /<[^>]*>/.test(text)\n}\n\ntype AttributeType = AttributeData['type']\nexport type TextWidgetType = Extract<AttributeType, 'string' | 'integer' | 'float'>\n\nexport interface TextWidgetProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'onChange'>,\n WidgetBaseProps {\n value: string\n isMarkdown?: boolean\n option?: EnumItem\n isInherited?: boolean\n type?: TextWidgetType\n columnId?: string\n cellId?: string\n onRequestEdit?: (id: CellId | null) => void\n getDraftValue?: () => string | null\n setDraftValue?: (value: string | null) => void\n}\n\nexport const TextWidget = forwardRef<HTMLSpanElement, TextWidgetProps>(\n (\n {\n value,\n option,\n isMarkdown,\n isEditing,\n isInherited,\n onChange,\n onCancelEdit,\n style,\n type,\n columnId,\n cellId,\n onRequestEdit,\n getDraftValue,\n setDraftValue,\n className,\n ...props\n },\n ref,\n ) => {\n const requestEdit = onRequestEdit || (() => undefined)\n const getCurrentDraft = getDraftValue || (() => null)\n const setCurrentDraft = setDraftValue || (() => undefined)\n\n const [isHoveredOnCell, setIsHoveredOnCell] = useState(false)\n const [isHoveredOnPreview, setIsHoveredOnPreview] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [isOverflowing, setIsOverflowing] = useState(false)\n\n const textRef = useRef<HTMLSpanElement>(null)\n const showTimerRef = useRef<ReturnType<typeof setTimeout>>()\n const closeTimerRef = useRef<ReturnType<typeof setTimeout>>()\n const showPreviewRef = useRef(false)\n const isAnythingHovered = isHoveredOnCell || isHoveredOnPreview\n\n const displayText = option?.label || value\n const textValue = typeof displayText === 'string' ? displayText : String(displayText ?? '')\n // does the content contain only regular text?\n const isRegularText =\n !isMarkdown && !containsHtml(textValue) && !textValue.match(/(https?:\\/\\/\\S+)/gi)\n\n useEffect(() => {\n const el = textRef.current\n if (!el) return\n\n let rafId: number | null = null\n const checkOverflow = () => {\n // Debounce via rAF so rapid resize events don't toggle state every frame\n if (rafId !== null) cancelAnimationFrame(rafId)\n rafId = requestAnimationFrame(() => {\n rafId = null\n setIsOverflowing(\n el.scrollHeight > el.clientHeight + 1 || el.scrollWidth > el.clientWidth + 1,\n )\n })\n }\n\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n checkOverflow()\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId)\n observer.disconnect()\n }\n }, [textValue])\n\n // ── Hover tracking on parent <td>\n useEffect(() => {\n const el = textRef.current\n if (!el) return\n\n const td = el.closest('td')\n if (!td) return\n\n const handleMouseEnter = () => setIsHoveredOnCell(true)\n const handleMouseLeave = () => setIsHoveredOnCell(false)\n\n td.addEventListener('mouseenter', handleMouseEnter)\n td.addEventListener('mouseleave', handleMouseLeave)\n\n return () => {\n td.removeEventListener('mouseenter', handleMouseEnter)\n td.removeEventListener('mouseleave', handleMouseLeave)\n }\n }, [])\n\n // ── Preview show/hide logic\n // Keep ref in sync so timers can check current visibility without re-triggering the effect\n const updatePreview = useCallback((value: boolean) => {\n showPreviewRef.current = value\n setShowPreview(value)\n }, [])\n\n useEffect(() => {\n clearTimeout(showTimerRef.current)\n clearTimeout(closeTimerRef.current)\n\n if (isEditing) {\n updatePreview(false)\n } else if (!isAnythingHovered) {\n // Grace period before closing (handles cell→popup mouse transition)\n closeTimerRef.current = setTimeout(() => updatePreview(false), 300)\n } else if (showPreviewRef.current) {\n // Preview already visible — keep it open regardless of overflow changes\n // (overflow can toggle during column resize; don't flicker)\n } else if (isOverflowing && cellId) {\n // Start delay timer to show preview\n showTimerRef.current = setTimeout(() => {\n if (showPreviewRef.current) return // double-check, already visible\n updatePreview(true)\n previewDelayController.markShown()\n window.dispatchEvent(new CustomEvent(PREVIEW_OPEN_EVENT, { detail: { cellId } }))\n }, previewDelayController.getDelay())\n }\n\n return () => {\n clearTimeout(showTimerRef.current)\n clearTimeout(closeTimerRef.current)\n }\n }, [isAnythingHovered, isOverflowing, isEditing, cellId, updatePreview])\n\n // ── Listen for other previews opening → close this one ───────\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail\n if (detail?.cellId !== cellId) {\n updatePreview(false)\n }\n }\n\n window.addEventListener(PREVIEW_OPEN_EVENT, handler)\n return () => window.removeEventListener(PREVIEW_OPEN_EVENT, handler)\n }, [cellId, updatePreview])\n\n // ── Preview click → start editing\n const handlePreviewClick = useCallback(() => {\n updatePreview(false)\n if (cellId) requestEdit(cellId)\n }, [cellId, requestEdit, updatePreview])\n\n // For description columns, Ctrl+Enter should save and close — not jump to next row.\n // Remap 'Enter' → 'Click' so CellWidget doesn't call moveToNextRow.\n const handleDescriptionChange: WidgetBaseProps['onChange'] = useCallback(\n (val, key) => {\n onChange(val, key === 'Enter' ? 'Click' : key)\n },\n [onChange],\n )\n\n // ── Render content\n const renderContent = () => {\n // For description columns, keep markdown rendering\n if (isMarkdown) {\n return (\n <Markdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n p: ({ children }) => <span>{children}</span>,\n a: ({ href, children }) => (\n <StyledLink\n href={href || '#'}\n onMouseDown={(e) => e.stopPropagation()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </StyledLink>\n ),\n }}\n >\n {textValue}\n </Markdown>\n )\n }\n\n // Check if content contains HTML\n if (containsHtml(textValue)) {\n // Parse HTML to plain text with preserved links\n const parts = parseHtmlToPlainTextWithLinks(textValue)\n return parts.map((part) => {\n if (part.type === 'url' && part.href) {\n return (\n <StyledLink\n key={part.key}\n href={part.href}\n onMouseDown={(e) => e.stopPropagation()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {part.content}\n </StyledLink>\n )\n }\n return (\n <span key={part.key} style={{ whiteSpace: 'pre-line' }}>\n {part.content}\n </span>\n )\n })\n }\n\n // Check for URLs in plain text\n const hasUrls = textValue.match(/(https?:\\/\\/\\S+)/gi)\n if (hasUrls) {\n // Text with URLs (handles both single URL and mixed content)\n const parts = parseTextWithUrls(textValue)\n return parts.map((part) => {\n if (part.type === 'url') {\n return (\n <StyledLink\n key={part.key}\n href={part.content}\n onMouseDown={(e) => e.stopPropagation()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {part.content}\n </StyledLink>\n )\n }\n return part.content\n })\n }\n\n // Regular text\n return textValue\n }\n\n // ── Non-description editing: inline TextWidgetInput\n if (isEditing && !isMarkdown) {\n return (\n <TextWidgetInput\n value={value}\n onChange={onChange}\n onCancel={onCancelEdit}\n type={type || 'string'}\n />\n )\n }\n\n // ── Render: display content + any overlays ───────────────────\n const combinedClassName = clsx(className, {\n markdown: isMarkdown,\n regular: isRegularText,\n })\n\n return (\n <>\n <StyledBaseTextWidget\n className={combinedClassName}\n style={{ color: option?.color, ...style }}\n {...props}\n ref={(node) => {\n // Merge external ref with internal ref\n ;(textRef as React.MutableRefObject<HTMLSpanElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLSpanElement | null>).current = node\n }}\n >\n {option?.icon && (\n <Icon\n icon={option.icon as string}\n style={{\n color: option.color,\n }}\n />\n )}\n {renderContent()}\n </StyledBaseTextWidget>\n\n {/* Description column editing (Quill editor in popup) */}\n {isEditing && isMarkdown && cellId && (\n <TextContentWidget\n value={value}\n cellId={cellId}\n isEditing={true}\n variant=\"edit\"\n allowMarkdown={true}\n valueType={type || 'string'}\n onChange={handleDescriptionChange}\n onCancelEdit={onCancelEdit}\n onDismissWithoutSave={onCancelEdit}\n draftValue={getCurrentDraft()}\n onEditingDraftChange={setCurrentDraft}\n />\n )}\n\n {/* Description column hover preview (markdown in popup) */}\n {showPreview && !isEditing && isMarkdown && cellId && (\n <TextContentWidget\n value={value}\n cellId={cellId}\n isEditing={true}\n variant=\"preview\"\n allowMarkdown={true}\n onChange={onChange}\n onCancelEdit={() => updatePreview(false)}\n onPreviewClick={handlePreviewClick}\n onPreviewMouseEnter={() => setIsHoveredOnPreview(true)}\n onPreviewMouseLeave={() => setIsHoveredOnPreview(false)}\n />\n )}\n\n {/* Non-description column hover preview (plain text in popup) */}\n {showPreview && !isEditing && !isMarkdown && cellId && (\n <CellEditingDialog\n isEditing={true}\n anchorId={cellId}\n onClose={() => updatePreview(false)}\n >\n <StyledPreviewContent\n onClick={handlePreviewClick}\n onMouseEnter={() => setIsHoveredOnPreview(true)}\n onMouseLeave={() => setIsHoveredOnPreview(false)}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {renderContent()}\n </StyledPreviewContent>\n </CellEditingDialog>\n )}\n </>\n )\n },\n)\n"],"names":["StyledBaseTextWidget","styled","wrapMode","StyledLink","StyledPreviewContent","PreviewDelayController","previewDelayController","PREVIEW_OPEN_EVENT","isValidUrl","text","url","parseTextWithUrls","urlRegex","part","index","containsHtml","TextWidget","forwardRef","value","option","isMarkdown","isEditing","isInherited","onChange","onCancelEdit","style","type","columnId","cellId","onRequestEdit","getDraftValue","setDraftValue","className","props","ref","requestEdit","getCurrentDraft","setCurrentDraft","isHoveredOnCell","setIsHoveredOnCell","useState","isHoveredOnPreview","setIsHoveredOnPreview","showPreview","setShowPreview","isOverflowing","setIsOverflowing","textRef","useRef","showTimerRef","closeTimerRef","showPreviewRef","isAnythingHovered","displayText","textValue","isRegularText","useEffect","el","rafId","checkOverflow","observer","td","handleMouseEnter","handleMouseLeave","updatePreview","useCallback","handler","e","handlePreviewClick","handleDescriptionChange","val","key","renderContent","jsx","Markdown","remarkGfm","rehypeRaw","children","href","parseHtmlToPlainTextWithLinks","TextWidgetInput","combinedClassName","clsx","jsxs","Fragment","node","Icon","TextContentWidget","CellEditingDialog"],"mappings":"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"}
|