@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.
Files changed (179) hide show
  1. package/dist/ProjectTreeTable.cjs.js +1 -1
  2. package/dist/ProjectTreeTable.es.js +247 -243
  3. package/dist/_virtual/index.cjs22.js +1 -1
  4. package/dist/_virtual/index.cjs23.js +1 -1
  5. package/dist/_virtual/index.cjs24.js +1 -1
  6. package/dist/_virtual/index.cjs4.js +1 -1
  7. package/dist/_virtual/index.cjs5.js +1 -1
  8. package/dist/_virtual/index.cjs6.js +1 -1
  9. package/dist/_virtual/index.cjs8.js +1 -1
  10. package/dist/_virtual/index.es22.js +3 -3
  11. package/dist/_virtual/index.es23.js +5 -5
  12. package/dist/_virtual/index.es24.js +5 -5
  13. package/dist/_virtual/index.es4.js +2 -5
  14. package/dist/_virtual/index.es4.js.map +1 -1
  15. package/dist/_virtual/index.es5.js +5 -2
  16. package/dist/_virtual/index.es5.js.map +1 -1
  17. package/dist/_virtual/index.es6.js +2 -2
  18. package/dist/_virtual/index.es8.js +2 -2
  19. package/dist/api.cjs.js +1 -1
  20. package/dist/api.es.js +446 -445
  21. package/dist/index.cjs.js +1 -1
  22. package/dist/index.es.js +20 -9
  23. package/dist/index.es.js.map +1 -1
  24. package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
  25. package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
  26. package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
  27. package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
  28. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
  29. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  30. package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
  31. package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
  32. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  33. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  34. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  35. package/dist/node_modules/remove-accents/index.es.js +1 -1
  36. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  37. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  38. package/dist/shared/node_modules/@module-federation/runtime/dist/index.cjs.js +1 -1
  39. package/dist/shared/node_modules/@module-federation/runtime/dist/index.es.js +1 -1
  40. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  41. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  42. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  43. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  44. package/dist/shared/src/api/generated/graphql.cjs.js +85 -28
  45. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  46. package/dist/shared/src/api/generated/graphql.es.js +129 -68
  47. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  48. package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js +1 -1
  49. package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js.map +1 -1
  50. package/dist/shared/src/api/queries/columnStats/metricTargets.es.js +36 -36
  51. package/dist/shared/src/api/queries/columnStats/metricTargets.es.js.map +1 -1
  52. package/dist/shared/src/components/Chips/Chips.cjs.js +12 -6
  53. package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
  54. package/dist/shared/src/components/Chips/Chips.es.js +69 -62
  55. package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
  56. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
  57. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  58. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +32 -12
  59. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  60. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -2
  61. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  62. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +33 -33
  63. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  64. package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
  65. package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
  66. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
  67. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
  68. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +39 -8
  69. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
  70. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  71. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  72. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +32 -31
  73. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  74. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
  75. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
  76. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js +1 -1
  77. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js.map +1 -1
  78. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js +24 -18
  79. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js.map +1 -1
  80. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js +1 -1
  81. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js.map +1 -1
  82. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js +26 -25
  83. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js.map +1 -1
  84. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
  85. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
  86. package/dist/shared/src/containers/ListTable/ListTableCell.es.js +14 -2
  87. package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
  88. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  89. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  90. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +125 -126
  91. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  92. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +6 -0
  93. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
  94. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +14 -8
  95. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
  96. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  97. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  98. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +200 -178
  99. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  100. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
  101. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  102. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +14 -3
  103. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  104. package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js +1 -1
  105. package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js.map +1 -1
  106. package/dist/shared/src/containers/ProjectTreeTable/constants.es.js +6 -3
  107. package/dist/shared/src/containers/ProjectTreeTable/constants.es.js.map +1 -1
  108. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
  109. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
  110. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +19 -19
  111. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
  112. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +5 -3
  113. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
  114. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +100 -97
  115. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
  116. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +9 -1
  117. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
  118. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +47 -31
  119. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
  120. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +28 -9
  121. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
  122. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +58 -39
  123. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
  124. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +53 -25
  125. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
  126. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +150 -103
  127. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
  128. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +9 -2
  129. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
  130. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +66 -57
  131. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
  132. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
  133. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
  134. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +9 -8
  135. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
  136. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +20 -4
  137. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
  138. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +86 -67
  139. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js.map +1 -1
  140. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js +6 -0
  141. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js.map +1 -0
  142. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js +11 -0
  143. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js.map +1 -0
  144. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
  145. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
  146. package/dist/shared/src/containers/Views/context/ViewsContext.es.js +67 -62
  147. package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
  148. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
  149. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
  150. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +47 -46
  151. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
  152. package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
  153. package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
  154. package/dist/shared/src/context/ProjectContext.es.js +1 -1
  155. package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
  156. package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js +1 -1
  157. package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js.map +1 -1
  158. package/dist/shared/src/util/buildHierarchicalTableRows.es.js +36 -33
  159. package/dist/shared/src/util/buildHierarchicalTableRows.es.js.map +1 -1
  160. package/dist/types/api/generated/graphql.d.ts +71 -0
  161. package/dist/types/api/queries/activities/getActivities.d.ts +28 -0
  162. package/dist/types/api/queries/entities/getEntity.d.ts +14 -0
  163. package/dist/types/api/queries/entities/getEntityPanel.d.ts +14 -0
  164. package/dist/types/api/queries/entities/updateEntity.d.ts +14 -0
  165. package/dist/types/api/queries/entityLists/getLists.d.ts +14 -0
  166. package/dist/types/api/queries/overview/getOverview.d.ts +14 -0
  167. package/dist/types/api/queries/project/getProject.d.ts +14 -0
  168. package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +14 -0
  169. package/dist/types/api/queries/users/getUsers.d.ts +14 -0
  170. package/dist/types/api/queries/versions/getVersionsProducts.d.ts +28 -0
  171. package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +4 -1
  172. package/dist/types/containers/Feed/helpers/buildBackendFilter.d.ts +1 -0
  173. package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +1 -0
  174. package/dist/types/containers/ProjectTreeTable/constants.d.ts +3 -0
  175. package/dist/types/containers/ProjectTreeTable/widgets/SubtasksWidget.d.ts +1 -0
  176. package/dist/types/containers/ProjectTreeTable/widgets/wrapMode.d.ts +2 -0
  177. package/dist/types/containers/Views/context/ViewsContext.d.ts +1 -0
  178. package/dist/types/util/buildHierarchicalTableRows.d.ts +2 -0
  179. 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)`\n height: 100%;\n width: 100%;\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 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","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":";;;;;;AAQA,MAAMA,IAAiBC,EAAOC,CAAQ;AAAA;AAAA;AAAA,GAqBzBC,IAAaC;AAAA,EACxB,CACE;AAAA,IACE,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,MAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,YAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,cAAAC;AAAA,IACA,QAAAC;AAAA,IACA,IAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AAEH,UAAMC,IAAiBd,EAAM,IAAI,CAACe,MAAMA,GAAG,SAAA,CAAU,EAAE,OAAO,CAACA,MAAM,CAAC,CAACA,CAAC;AACxE,QAAIC,IAAkBd,EAAQ;AAAA,MAAO,CAACe,MACpCH,EAAe,SAASG,EAAO,MAAM,UAAU;AAAA,IAAA;AAIjD,UAAMC,IAA6B,CAAA;AACnC,IAAAJ,EAAe,QAAQ,CAACK,MAAQ;AAC9B,UAAI,CAACjB,EAAQ,KAAK,CAACe,MAAWA,EAAO,UAAUE,CAAG,GAAG;AACnD,cAAMC,IAAgB;AAAA,UACpB,OAAOD;AAAA,UACP,OAAOA;AAAA,UACP,OAAOb,IACH,0CACA;AAAA,UACJ,MAAMA,IAAqB,SAAY;AAAA,QAAA;AAEzC,QAAAU,IAAkB,CAAC,GAAGA,GAAiBI,CAAa,GACpDF,EAAe,KAAKE,CAAa;AAAA,MACnC;AAAA,IACF,CAAC;AACD,UAAMC,IAAoBL,EAAgB,SAAS,GAG7CM,IAAa,CAAC,GAAGpB,GAAS,GAAGgB,CAAc,GAE3CK,IAAcC,EAAoB,IAAI,GAEtC,CAACC,GAAcC,CAAe,IAAIC,EAAS,EAAK;AACtD,IAAAC,EAAU,MAAM;AACd,MAAI3B,KAAasB,EAAY,WAAWnB,KACtC,CAACmB,EAAY,QAAQ,UAAUA,EAAY,SAAS,KAAA,GACpDG,EAAgB,EAAI,KAEpBA,EAAgB,EAAK;AAAA,IAEzB,GAAG,CAACzB,GAAWsB,EAAY,SAASnB,CAAQ,CAAC,GAG7CwB,EAAU,MAAM;AACd,UAAIH,KAAgB,CAACb,EAAc,UAAUU,EAAW,SAAS,IAAI;AAEnE,cAAMO,IADcN,EAAY,SAAS,WAAA,GACV,cAAc,IAAI;AACjD,QAAIM,MACFA,EAAU,MAAA,GAEVA,EAAU,MAAM,UAAU;AAAA,MAE9B;AAAA,IACF,GAAG,CAACJ,GAAcb,EAAc,QAAQU,EAAW,MAAM,CAAC;AAE1D,UAAMQ,IAAgB,CAAC,CAAC3B,GAAM,SAAS,MAAM,GAEvC4B,IAAe,CAACC,MAAuB;AAC3C,UAAIC,IAAmC3B,IACnC0B,IACAA,EAAS,OAAO,CAACjB,MAAMb,EAAQ,KAAK,CAACgC,MAAMA,EAAE,UAAUnB,CAAC,CAAC;AAE7D,MAAIZ,GAAM,SAAS,MAAM,MAIvB8B,IAAgB,MAAM,QAAQA,CAAa,IAAIA,EAAc,CAAC,IAAIA,IAGlEzB,EAASyB,GAAe,OAAO;AAAA,IAEnC;AAEA,WAAIhC,IAEAkC,gBAAAA,EAAAA;AAAAA,MAACxC;AAAA,MAAA;AAAA,QACC,SAAS2B;AAAA,QACT,OAAOR;AAAA,QACP,KAAKS;AAAA,QACL,eAAe,CAACa,GAAQC,GAAUC,MAChCH,gBAAAA,EAAAA;AAAAA,UAACI;AAAA,UAAA;AAAA,YACC,iBAAAvB;AAAA,YACA,mBAAmBqB,EAAS,SAAS;AAAA,YACrC,QAAAC;AAAA,YACA,YAAAjC;AAAA,YACA,eAAAyB;AAAA,YACC,GAAGnB,GAAI;AAAA,YACR,aAAaC,EAAc;AAAA,YAC3B,WAAW4B,EAAK,uBAAuB7B,GAAI,UAAU,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAGlE,cAAc,CAACM,GAAQwB,GAAWC,MAChCP,gBAAAA,EAAAA;AAAAA,UAACI;AAAA,UAAA;AAAA,YACC,iBAAiB,CAACtB,CAAM;AAAA,YACxB,mBAAmB;AAAA,YACnB,QAAQ;AAAA,YACR,QAAM;AAAA,YACN,eAAAa;AAAA,YACA,YAAAY;AAAA,YACC,GAAG/B,GAAI;AAAA,YACR,WAAW6B,EAAK,sBAAsB7B,GAAI,UAAU,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAGjE,aAAW;AAAA,QACX,aAAamB;AAAA,QACb,aAAazB;AAAA,QACb,UAAUA;AAAA,QACV,gBAAc;AAAA,QACd,gBAAgB;AAAA,QACf,GAAGO;AAAA,QACJ,UAAUmB;AAAA,QACV,SAAStB;AAAA,QACT,UAAUH;AAAA,MAAA;AAAA,IAAA,IAMd6B,gBAAAA,EAAAA;AAAAA,MAACI;AAAA,MAAA;AAAA,QACC,iBAAAvB;AAAA,QACA,mBAAAK;AAAA,QACA,eAAAS;AAAA,QACA,YAAAzB;AAAA,QACC,GAAGM,GAAI;AAAA,QACR,aAAaC,EAAc;AAAA,QAC3B,WAAW4B,EAAK,cAAc7B,GAAI,UAAU,WAAWC,EAAc,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAGpF;AACF;"}
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:c,projectName:l,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:c,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:l,taskId:t.taskId,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;
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":"0kBAuBaA,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,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
+ {"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 f } from "../../../components/DoneCheckbox/DoneCheckbox.es.js";
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: m,
14
+ projectName: d,
15
15
  disabled: t,
16
16
  onChange: j,
17
17
  onCancelEdit: a
18
18
  }) => {
19
- const { SubtasksManager: n, useNavigate: c } = C(), [d, p] = g([]), i = r?.subtasks || [], u = i.map((o) => ({
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(f, { checked: o.isDone, isReadOnly: !0, style: { fontSize: 20 } })
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: u,
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: m,
36
+ projectName: d,
37
37
  taskId: r.taskId,
38
+ folderId: r.folderId,
38
39
  subtasks: i,
39
- selectedSubtaskIds: d,
40
+ selectedSubtaskIds: c,
40
41
  onSelectSubtasks: p,
41
42
  onClose: a,
42
43
  SubtasksManager: n,
43
- useNavigate: c,
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":";;;;;;;;;AAuBO,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,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
+ {"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"),k=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 H=require("./TextContentWidget.cjs.js"),ie=require("../../../components/LinksManager/CellEditingDialog.cjs.js"),V=k.span`
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
- `,T=k.a`
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
- `,ae=k.div`
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 le{lastShownTime=0;warmTimeout=500;coldDelay=600;getDelay(){return Date.now()-this.lastShownTime<this.warmTimeout?0:this.coldDelay}markShown(){this.lastShownTime=Date.now()}}const M=new le,j="projectTreeTextPreviewOpen",ce=i=>{try{const a=new URL(i.trim());return a.protocol==="http:"||a.protocol==="https:"}catch{return!1}},ue=i=>{const a=/(https?:\/\/[^\s<>"]+[^\s.,!?;:<>\")\]])/gi;return i.split(a).map((u,w)=>ce(u)?{type:"url",content:u,key:w}:{type:"text",content:u,key:w})},U=i=>/<[^>]*>/.test(i),de=n.forwardRef(({value:i,option:a,isMarkdown:c,isEditing:u,isInherited:w,onChange:f,onCancelEdit:h,style:_,type:b,columnId:pe,cellId:s,onRequestEdit:A,getDraftValue:F,setDraftValue:N,className:B,...z},m)=>{const C=A||(()=>{}),G=F||(()=>null),J=N||(()=>{}),[K,P]=n.useState(!1),[Q,x]=n.useState(!1),[S,X]=n.useState(!1),[q,D]=n.useState(!1),v=n.useRef(null),g=n.useRef(),y=n.useRef(),E=n.useRef(!1),W=K||Q,R=a?.label||i,p=typeof R=="string"?R:String(R??""),Y=!c&&!U(p)&&!p.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,D(c?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()}},[p,c]),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 d=n.useCallback(e=>{E.current=e,X(e)},[]);n.useEffect(()=>(clearTimeout(g.current),clearTimeout(y.current),u?d(!1):W?E.current||q&&s&&(g.current=setTimeout(()=>{E.current||(d(!0),M.markShown(),window.dispatchEvent(new CustomEvent(j,{detail:{cellId:s}})))},M.getDelay())):y.current=setTimeout(()=>d(!1),300),()=>{clearTimeout(g.current),clearTimeout(y.current)}),[W,q,u,s,d]),n.useEffect(()=>{const e=t=>{t.detail?.cellId!==s&&d(!1)};return window.addEventListener(j,e),()=>window.removeEventListener(j,e)},[s,d]);const L=n.useCallback(()=>{d(!1),s&&C(s)},[s,C,d]),Z=n.useCallback((e,t)=>{f(e,t==="Enter"?"Click":t)},[f]),O=()=>c?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(T,{href:t||"#",onMouseDown:l=>l.stopPropagation(),target:"_blank",rel:"noopener noreferrer",children:r})},children:p}):U(p)?se.parseHtmlToPlainTextWithLinks(p).map(r=>r.type==="url"&&r.href?o.jsxRuntimeExports.jsx(T,{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)):p.match(/(https?:\/\/\S+)/gi)?ue(p).map(r=>r.type==="url"?o.jsxRuntimeExports.jsx(T,{href:r.content,onMouseDown:l=>l.stopPropagation(),target:"_blank",rel:"noopener noreferrer",children:r.content},r.key):r.content):p;if(u&&!c)return o.jsxRuntimeExports.jsx(re.TextWidgetInput,{value:i,onChange:f,onCancel:h,type:b||"string"});const $=oe(B,{markdown:c,regular:Y});return o.jsxRuntimeExports.jsxs(o.jsxRuntimeExports.Fragment,{children:[o.jsxRuntimeExports.jsxs(V,{className:$,style:{color:a?.color,..._},...z,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}}),O()]}),u&&c&&s&&o.jsxRuntimeExports.jsx(H.TextContentWidget,{value:i,cellId:s,isEditing:!0,variant:"edit",allowMarkdown:!0,valueType:b||"string",onChange:Z,onCancelEdit:h,onDismissWithoutSave:h,draftValue:G(),onEditingDraftChange:J}),S&&!u&&c&&s&&o.jsxRuntimeExports.jsx(H.TextContentWidget,{value:i,cellId:s,isEditing:!0,variant:"preview",allowMarkdown:!0,onChange:f,onCancelEdit:()=>d(!1),onPreviewClick:L,onPreviewMouseEnter:()=>x(!0),onPreviewMouseLeave:()=>x(!1)}),S&&!u&&!c&&s&&o.jsxRuntimeExports.jsx(ie.CellEditingDialog,{isEditing:!0,anchorId:s,onClose:()=>d(!1),children:o.jsxRuntimeExports.jsx(ae,{onClick:L,onMouseEnter:()=>x(!0),onMouseLeave:()=>x(!1),onMouseDown:e=>e.stopPropagation(),children:O()})})]})});exports.StyledBaseTextWidget=V;exports.TextWidget=de;
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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"}