@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
@@ -13,9 +13,10 @@ import "uuid";
13
13
  import { parseHtmlToPlainTextWithLinks as le } from "../../../util/parseHtmlToPlainTextWithLinks.es.js";
14
14
  import "../../../api/queries/users/updateUsers.es.js";
15
15
  import "../../../util/pubsub.es.js";
16
- import { TextContentWidget as _ } from "./TextContentWidget.es.js";
16
+ import { TextContentWidget as V } from "./TextContentWidget.es.js";
17
17
  import { CellEditingDialog as ce } from "../../../components/LinksManager/CellEditingDialog.es.js";
18
- const ue = j.span`
18
+ import { wrapMode as ue } from "./wrapMode.es.js";
19
+ const me = j.span`
19
20
  overflow: hidden;
20
21
  text-overflow: ellipsis;
21
22
  white-space: nowrap;
@@ -30,11 +31,27 @@ const ue = j.span`
30
31
  display: block;
31
32
  overflow: hidden;
32
33
  width: 100%;
34
+ max-height: 100%;
33
35
  }
34
36
 
35
37
  &.regular {
36
38
  display: block;
37
39
  }
40
+
41
+ ${ue`
42
+ &:not(.markdown) {
43
+ white-space: normal;
44
+ word-break: break-word;
45
+ display: block;
46
+ overflow: hidden;
47
+ width: 100%;
48
+ max-height: 100%;
49
+
50
+ > .icon {
51
+ margin-right: 4px;
52
+ }
53
+ }
54
+ `}
38
55
  `, C = j.a`
39
56
  color: var(--md-sys-color-primary, #0066cc);
40
57
  text-decoration: none;
@@ -46,7 +63,7 @@ const ue = j.span`
46
63
  &:hover {
47
64
  text-decoration: underline;
48
65
  }
49
- `, me = j.div`
66
+ `, pe = j.div`
50
67
  background: var(--md-sys-color-surface-container-lowest);
51
68
  border-radius: 8px;
52
69
  padding: 12px;
@@ -86,51 +103,53 @@ class fe {
86
103
  this.lastShownTime = Date.now();
87
104
  }
88
105
  }
89
- const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
106
+ const _ = new fe(), D = "projectTreeTextPreviewOpen", de = (s) => {
90
107
  try {
91
108
  const i = new URL(s.trim());
92
109
  return i.protocol === "http:" || i.protocol === "https:";
93
110
  } catch {
94
111
  return !1;
95
112
  }
96
- }, de = (s) => {
113
+ }, we = (s) => {
97
114
  const i = /(https?:\/\/[^\s<>"]+[^\s.,!?;:<>\")\]])/gi;
98
- return s.split(i).map((c, x) => pe(c) ? { type: "url", content: c, key: x } : { type: "text", content: c, key: x });
99
- }, F = (s) => /<[^>]*>/.test(s), We = re(
115
+ return s.split(i).map((l, x) => de(l) ? { type: "url", content: l, key: x } : { type: "text", content: l, key: x });
116
+ }, A = (s) => /<[^>]*>/.test(s), Me = re(
100
117
  ({
101
118
  value: s,
102
119
  option: i,
103
- isMarkdown: l,
104
- isEditing: c,
120
+ isMarkdown: m,
121
+ isEditing: l,
105
122
  isInherited: x,
106
- onChange: f,
123
+ onChange: p,
107
124
  onCancelEdit: g,
108
- style: N,
125
+ style: F,
109
126
  type: S,
110
- columnId: we,
127
+ columnId: he,
111
128
  cellId: n,
112
- onRequestEdit: q,
113
- getDraftValue: z,
114
- setDraftValue: B,
115
- className: G,
116
- ...J
117
- }, p) => {
118
- const R = q || (() => {
119
- }), K = z || (() => null), Q = B || (() => {
120
- }), [X, L] = w(!1), [Y, d] = w(!1), [O, Z] = w(!1), [W, H] = w(!1), y = h(null), k = h(), T = h(), b = h(!1), M = X || Y, P = i?.label || s, m = typeof P == "string" ? P : String(P ?? ""), $ = !l && !F(m) && !m.match(/(https?:\/\/\S+)/gi);
129
+ onRequestEdit: N,
130
+ getDraftValue: q,
131
+ setDraftValue: z,
132
+ className: B,
133
+ ...G
134
+ }, f) => {
135
+ const R = N || (() => {
136
+ }), $ = q || (() => null), J = z || (() => {
137
+ }), [K, L] = w(!1), [Q, d] = w(!1), [O, X] = w(!1), [W, Y] = w(!1), y = h(null), k = h(), T = h(), b = h(!1), H = K || Q, P = i?.label || s, u = typeof P == "string" ? P : String(P ?? ""), Z = !m && !A(u) && !u.match(/(https?:\/\/\S+)/gi);
121
138
  v(() => {
122
139
  const e = y.current;
123
140
  if (!e) return;
124
141
  let r = null;
125
142
  const t = () => {
126
143
  r !== null && cancelAnimationFrame(r), r = requestAnimationFrame(() => {
127
- r = null, H(l ? e.scrollHeight > e.clientHeight + 1 : e.scrollWidth > e.clientWidth + 1);
144
+ r = null, Y(
145
+ e.scrollHeight > e.clientHeight + 1 || e.scrollWidth > e.clientWidth + 1
146
+ );
128
147
  });
129
148
  }, a = new ResizeObserver(t);
130
149
  return a.observe(e), t(), () => {
131
150
  r !== null && cancelAnimationFrame(r), a.disconnect();
132
151
  };
133
- }, [m, l]), v(() => {
152
+ }, [u]), v(() => {
134
153
  const e = y.current;
135
154
  if (!e) return;
136
155
  const r = e.closest("td");
@@ -140,27 +159,27 @@ const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
140
159
  r.removeEventListener("mouseenter", t), r.removeEventListener("mouseleave", a);
141
160
  };
142
161
  }, []);
143
- const u = E((e) => {
144
- b.current = e, Z(e);
162
+ const c = E((e) => {
163
+ b.current = e, X(e);
145
164
  }, []);
146
- v(() => (clearTimeout(k.current), clearTimeout(T.current), c ? u(!1) : M ? b.current || W && n && (k.current = setTimeout(() => {
147
- b.current || (u(!0), A.markShown(), window.dispatchEvent(new CustomEvent(D, { detail: { cellId: n } })));
148
- }, A.getDelay())) : T.current = setTimeout(() => u(!1), 300), () => {
165
+ v(() => (clearTimeout(k.current), clearTimeout(T.current), l ? c(!1) : H ? b.current || W && n && (k.current = setTimeout(() => {
166
+ b.current || (c(!0), _.markShown(), window.dispatchEvent(new CustomEvent(D, { detail: { cellId: n } })));
167
+ }, _.getDelay())) : T.current = setTimeout(() => c(!1), 300), () => {
149
168
  clearTimeout(k.current), clearTimeout(T.current);
150
- }), [M, W, c, n, u]), v(() => {
169
+ }), [H, W, l, n, c]), v(() => {
151
170
  const e = (r) => {
152
- r.detail?.cellId !== n && u(!1);
171
+ r.detail?.cellId !== n && c(!1);
153
172
  };
154
173
  return window.addEventListener(D, e), () => window.removeEventListener(D, e);
155
- }, [n, u]);
156
- const U = E(() => {
157
- u(!1), n && R(n);
158
- }, [n, R, u]), I = E(
174
+ }, [n, c]);
175
+ const M = E(() => {
176
+ c(!1), n && R(n);
177
+ }, [n, R, c]), I = E(
159
178
  (e, r) => {
160
- f(e, r === "Enter" ? "Click" : r);
179
+ p(e, r === "Enter" ? "Click" : r);
161
180
  },
162
- [f]
163
- ), V = () => l ? /* @__PURE__ */ o.jsx(
181
+ [p]
182
+ ), U = () => m ? /* @__PURE__ */ o.jsx(
164
183
  te,
165
184
  {
166
185
  remarkPlugins: [oe],
@@ -178,9 +197,9 @@ const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
178
197
  }
179
198
  )
180
199
  },
181
- children: m
200
+ children: u
182
201
  }
183
- ) : F(m) ? le(m).map((t) => t.type === "url" && t.href ? /* @__PURE__ */ o.jsx(
202
+ ) : A(u) ? le(u).map((t) => t.type === "url" && t.href ? /* @__PURE__ */ o.jsx(
184
203
  C,
185
204
  {
186
205
  href: t.href,
@@ -190,7 +209,7 @@ const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
190
209
  children: t.content
191
210
  },
192
211
  t.key
193
- ) : /* @__PURE__ */ o.jsx("span", { style: { whiteSpace: "pre-line" }, children: t.content }, t.key)) : m.match(/(https?:\/\/\S+)/gi) ? de(m).map((t) => t.type === "url" ? /* @__PURE__ */ o.jsx(
212
+ ) : /* @__PURE__ */ o.jsx("span", { style: { whiteSpace: "pre-line" }, children: t.content }, t.key)) : u.match(/(https?:\/\/\S+)/gi) ? we(u).map((t) => t.type === "url" ? /* @__PURE__ */ o.jsx(
194
213
  C,
195
214
  {
196
215
  href: t.content,
@@ -200,30 +219,30 @@ const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
200
219
  children: t.content
201
220
  },
202
221
  t.key
203
- ) : t.content) : m;
204
- if (c && !l)
222
+ ) : t.content) : u;
223
+ if (l && !m)
205
224
  return /* @__PURE__ */ o.jsx(
206
225
  se,
207
226
  {
208
227
  value: s,
209
- onChange: f,
228
+ onChange: p,
210
229
  onCancel: g,
211
230
  type: S || "string"
212
231
  }
213
232
  );
214
- const ee = ae(G, {
215
- markdown: l,
216
- regular: $
233
+ const ee = ae(B, {
234
+ markdown: m,
235
+ regular: Z
217
236
  });
218
237
  return /* @__PURE__ */ o.jsxs(o.Fragment, { children: [
219
238
  /* @__PURE__ */ o.jsxs(
220
- ue,
239
+ me,
221
240
  {
222
241
  className: ee,
223
- style: { color: i?.color, ...N },
224
- ...J,
242
+ style: { color: i?.color, ...F },
243
+ ...G,
225
244
  ref: (e) => {
226
- y.current = e, typeof p == "function" ? p(e) : p && (p.current = e);
245
+ y.current = e, typeof f == "function" ? f(e) : f && (f.current = e);
227
246
  },
228
247
  children: [
229
248
  i?.icon && /* @__PURE__ */ o.jsx(
@@ -235,12 +254,12 @@ const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
235
254
  }
236
255
  }
237
256
  ),
238
- V()
257
+ U()
239
258
  ]
240
259
  }
241
260
  ),
242
- c && l && n && /* @__PURE__ */ o.jsx(
243
- _,
261
+ l && m && n && /* @__PURE__ */ o.jsx(
262
+ V,
244
263
  {
245
264
  value: s,
246
265
  cellId: n,
@@ -251,39 +270,39 @@ const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
251
270
  onChange: I,
252
271
  onCancelEdit: g,
253
272
  onDismissWithoutSave: g,
254
- draftValue: K(),
255
- onEditingDraftChange: Q
273
+ draftValue: $(),
274
+ onEditingDraftChange: J
256
275
  }
257
276
  ),
258
- O && !c && l && n && /* @__PURE__ */ o.jsx(
259
- _,
277
+ O && !l && m && n && /* @__PURE__ */ o.jsx(
278
+ V,
260
279
  {
261
280
  value: s,
262
281
  cellId: n,
263
282
  isEditing: !0,
264
283
  variant: "preview",
265
284
  allowMarkdown: !0,
266
- onChange: f,
267
- onCancelEdit: () => u(!1),
268
- onPreviewClick: U,
285
+ onChange: p,
286
+ onCancelEdit: () => c(!1),
287
+ onPreviewClick: M,
269
288
  onPreviewMouseEnter: () => d(!0),
270
289
  onPreviewMouseLeave: () => d(!1)
271
290
  }
272
291
  ),
273
- O && !c && !l && n && /* @__PURE__ */ o.jsx(
292
+ O && !l && !m && n && /* @__PURE__ */ o.jsx(
274
293
  ce,
275
294
  {
276
295
  isEditing: !0,
277
296
  anchorId: n,
278
- onClose: () => u(!1),
297
+ onClose: () => c(!1),
279
298
  children: /* @__PURE__ */ o.jsx(
280
- me,
299
+ pe,
281
300
  {
282
- onClick: U,
301
+ onClick: M,
283
302
  onMouseEnter: () => d(!0),
284
303
  onMouseLeave: () => d(!1),
285
304
  onMouseDown: (e) => e.stopPropagation(),
286
- children: V()
305
+ children: U()
287
306
  }
288
307
  )
289
308
  }
@@ -292,7 +311,7 @@ const A = new fe(), D = "projectTreeTextPreviewOpen", pe = (s) => {
292
311
  }
293
312
  );
294
313
  export {
295
- ue as StyledBaseTextWidget,
296
- We as TextWidget
314
+ me as StyledBaseTextWidget,
315
+ Me as TextWidget
297
316
  };
298
317
  //# sourceMappingURL=TextWidget.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextWidget.es.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.es.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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"}
@@ -0,0 +1,6 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("styled-components"),o=require("../constants.cjs.js"),r=(t,...s)=>e.css`
2
+ @container cell (min-height: ${o.WRAP_MIN_CELL_HEIGHT}px) {
3
+ ${e.css(t,...s)}
4
+ }
5
+ `;exports.wrapMode=r;
6
+ //# sourceMappingURL=wrapMode.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapMode.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/wrapMode.ts"],"sourcesContent":["import { css, type Interpolation } from 'styled-components'\nimport { WRAP_MIN_CELL_HEIGHT } from '../constants'\n\n// styles that apply only once the cell is tall enough to fit wrapped content\nexport const wrapMode = (\n strings: TemplateStringsArray,\n ...interpolations: Interpolation<object>[]\n) => css`\n @container cell (min-height: ${WRAP_MIN_CELL_HEIGHT}px) {\n ${css(strings, ...interpolations)}\n }\n`\n"],"names":["wrapMode","strings","interpolations","css","WRAP_MIN_CELL_HEIGHT"],"mappings":"sJAIaA,EAAW,CACtBC,KACGC,IACAC,EAAAA;AAAAA,iCAC4BC,sBAAoB;AAAA,MAC/CD,EAAAA,IAAIF,EAAS,GAAGC,CAAc,CAAC;AAAA;AAAA"}
@@ -0,0 +1,11 @@
1
+ import { css as o } from "styled-components";
2
+ import { WRAP_MIN_CELL_HEIGHT as e } from "../constants.es.js";
3
+ const p = (r, ...t) => o`
4
+ @container cell (min-height: ${e}px) {
5
+ ${o(r, ...t)}
6
+ }
7
+ `;
8
+ export {
9
+ p as wrapMode
10
+ };
11
+ //# sourceMappingURL=wrapMode.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapMode.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/widgets/wrapMode.ts"],"sourcesContent":["import { css, type Interpolation } from 'styled-components'\nimport { WRAP_MIN_CELL_HEIGHT } from '../constants'\n\n// styles that apply only once the cell is tall enough to fit wrapped content\nexport const wrapMode = (\n strings: TemplateStringsArray,\n ...interpolations: Interpolation<object>[]\n) => css`\n @container cell (min-height: ${WRAP_MIN_CELL_HEIGHT}px) {\n ${css(strings, ...interpolations)}\n }\n`\n"],"names":["wrapMode","strings","interpolations","css","WRAP_MIN_CELL_HEIGHT"],"mappings":";;AAIO,MAAMA,IAAW,CACtBC,MACGC,MACAC;AAAA,iCAC4BC,CAAoB;AAAA,MAC/CD,EAAIF,GAAS,GAAGC,CAAc,CAAC;AAAA;AAAA;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const oe=require("../../../../../_virtual/jsx-runtime.cjs.js"),n=require("react"),P=require("../types.cjs.js");require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");const qe=require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");const a=require("../../../api/queries/views/getViews.cjs.js"),ae=require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const ce=require("../hooks/useBuildViewMenuItems.cjs.js"),de=require("../../../context/GlobalContext.cjs.js"),we=require("../../../context/PowerpackContext.cjs.js"),Ve=require("../hooks/useSelectedView.cjs.js"),ge=require("../hooks/useViewsMutations.cjs.js"),le=require("../hooks/useBaseViewMutations.cjs.js"),Se=require("../hooks/useSaveViewFromCurrent.cjs.js"),Ce=require("../hooks/useViewSettingsChanged.cjs.js"),ke=require("../../../hooks/useLocalStorage.cjs.js"),O=require("../utils/isViewStudioScope.cjs.js"),Q=require("./ViewsContextInstance.cjs.js"),Le="view",Ie=({children:c,viewType:e,viewAlias:I=Le,projectName:r,dispatch:x,debug:l})=>{let{powerLicense:d}=we.usePowerpack();l?.powerLicense!==void 0&&(console.warn("Using debug power license:",l.powerLicense),d=l.powerLicense);const{user:f}=de.useGlobalContext(),[R,p]=n.useState(!1),[t,D]=n.useState(null),F="viewsMenuCollapsed",[S,h]=ke.useLocalStorage(F,{}),U=i=>{const g=i.visibility==="private"?"myViews":"sharedViews";if(S[g]){const G={...S};G[g]=!1,h(G)}},{data:_}=qe.useGetShareOptionsQuery({projectName:r},{skip:!d||!t}),[u,o,C,y]=Ve.useSelectedView({viewType:e,projectName:r}),[A,w]=Ce.useViewSettingsChanged({viewType:e}),{currentData:B=[],isLoading:m}=a.useListViewsQuery({projectName:r,viewType:e},{skip:!e}),q=n.useMemo(()=>B.filter(i=>i.label!==P.BASE_VIEW_ID&&!(r&&i.working&&i.scope==="studio")),[B]),{onCreateView:K,onDeleteView:z,onUpdateView:V,onResetWorkingView:W}=ge.useViewsMutations({viewType:e,projectName:r,viewsList:q,onCreate:U}),{currentData:s,isLoading:H}=a.useGetWorkingViewQuery({projectName:r,viewType:e},{skip:!e}),{currentData:J,isLoading:X}=a.useGetBaseViewQuery({projectName:r,viewType:e},{skip:!e}),{currentData:Y,isLoading:Z}=a.useGetBaseViewQuery({projectName:void 0,viewType:e},{skip:!e}),$=m||y||H||X||Z,M=s?.settings,k=u?.id===P.WORKING_VIEW_ID?M:u?.settings,v=u?.id===s?.id,E=A&&v&&C&&C!==s?.id?C:void 0,{currentData:L,isFetching:j}=a.useGetViewQuery({viewId:t,projectName:O.isViewStudioScope(t,q)?void 0:r,viewType:e},{skip:typeof t!="string"||!d}),N=n.useMemo(()=>t===L?.id?L:void 0,[t,L]),{onSaveViewFromCurrent:T}=Se.useSaveViewFromCurrent({viewType:e,projectName:r,viewsList:q,sourceSettings:k,onUpdateView:V}),{onCreateBaseView:ee,onUpdateBaseView:ie,onDeleteBaseView:re,onLoadBaseView:se}=le.useBaseViewMutations({viewType:e,projectName:r,viewSettings:k,workingView:s,dispatch:x}),te=n.useCallback(async(i,{selectView:g}={})=>{if(!s?.id){console.error("No working view to update");return}await V(s.id,i,!r),g&&o(s.id)},[V,s]),b=n.useCallback(async()=>{try{await W({existingWorkingViewId:s?.id,selectedViewId:u?.id,setSelectedView:o,setSettingsChanged:w,notify:!0})}catch(i){console.error("Failed to reset view:",i)}},[s,W,u,o,w]),ue=ce.default({viewsList:q,workingView:s,viewType:e,viewAlias:I,projectName:r,currentUser:f,useWorkingView:!d,editingViewId:E,selectedId:u?.id,collapsed:S,setCollapsed:h,onResetWorkingView:b,onSelect:i=>{o(i),w(!1),p(!1)},onEdit:i=>D(i),onSave:async i=>T(i)}),ne={viewType:e,viewAlias:I,projectName:r,isMenuOpen:R,editingView:t,currentUser:f,selectedView:u,viewSettings:k,editingViewData:N,isLoadingEditingViewData:j,viewsList:q,workingSettings:M,workingView:s,isViewWorking:v,onUpdateWorkingView:te,projectBaseView:J,studioBaseView:Y,onCreateBaseView:ee,onUpdateBaseView:ie,onDeleteBaseView:re,onLoadBaseView:se,editingViewId:E,viewMenuItems:ue,isLoadingViews:$,shareOptions:_,setIsMenuOpen:p,setEditingView:D,setSelectedView:o,onSettingsChanged:w,onCreateView:K,onUpdateView:V,onDeleteView:z,resetWorkingView:b,api:ae.viewsQueries,dispatch:x};return oe.jsxRuntimeExports.jsx(Q.ViewsContext.Provider,{value:ne,children:c})},xe=()=>{const c=n.useContext(Q.ViewsContext);if(!c)throw new Error("useViewsContext must be used within a ViewsProvider");return c};exports.isViewStudioScope=O.isViewStudioScope;exports.ViewsProvider=Ie;exports.useViewsContext=xe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const qe=require("../../../../../_virtual/jsx-runtime.cjs.js"),n=require("react"),P=require("../types.cjs.js");require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");const ae=require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");const a=require("../../../api/queries/views/getViews.cjs.js"),ce=require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const de=require("../hooks/useBuildViewMenuItems.cjs.js"),we=require("../../../context/GlobalContext.cjs.js"),Ve=require("../../../context/PowerpackContext.cjs.js"),ge=require("../hooks/useSelectedView.cjs.js"),le=require("../hooks/useViewsMutations.cjs.js"),Se=require("../hooks/useBaseViewMutations.cjs.js"),Ce=require("../hooks/useSaveViewFromCurrent.cjs.js"),ke=require("../hooks/useViewSettingsChanged.cjs.js"),Le=require("../../../hooks/useLocalStorage.cjs.js"),O=require("../utils/isViewStudioScope.cjs.js"),Q=require("./ViewsContextInstance.cjs.js"),Ie="view",xe=({children:c,viewType:e,viewAlias:I=Ie,projectName:r,dispatch:x,debug:l})=>{let{powerLicense:d}=Ve.usePowerpack();l?.powerLicense!==void 0&&(console.warn("Using debug power license:",l.powerLicense),d=l.powerLicense);const{user:f}=we.useGlobalContext(),[R,p]=n.useState(!1),[t,D]=n.useState(null),F="viewsMenuCollapsed",[S,h]=Le.useLocalStorage(F,{}),U=i=>{const g=i.visibility==="private"?"myViews":"sharedViews";if(S[g]){const G={...S};G[g]=!1,h(G)}},{data:_}=ae.useGetShareOptionsQuery({projectName:r},{skip:!d||!t}),[u,o,C,y]=ge.useSelectedView({viewType:e,projectName:r}),[A,w]=ke.useViewSettingsChanged({viewType:e}),{currentData:B=[],isLoading:m}=a.useListViewsQuery({projectName:r,viewType:e},{skip:!e}),q=n.useMemo(()=>B.filter(i=>i.label!==P.BASE_VIEW_ID&&!(r&&i.working&&i.scope==="studio")),[B]),{onCreateView:K,onDeleteView:z,onUpdateView:V,onResetWorkingView:W}=le.useViewsMutations({viewType:e,projectName:r,viewsList:q,onCreate:U}),{currentData:s,isLoading:H,isError:J}=a.useGetWorkingViewQuery({projectName:r,viewType:e},{skip:!e}),{currentData:X,isLoading:Y}=a.useGetBaseViewQuery({projectName:r,viewType:e},{skip:!e}),{currentData:Z,isLoading:$}=a.useGetBaseViewQuery({projectName:void 0,viewType:e},{skip:!e}),j=m||y||H||Y||$,E=s?.settings,k=u?.id===P.WORKING_VIEW_ID?E:u?.settings,M=u?.id===s?.id,v=A&&M&&C&&C!==s?.id?C:void 0,{currentData:L,isFetching:N}=a.useGetViewQuery({viewId:t,projectName:O.isViewStudioScope(t,q)?void 0:r,viewType:e},{skip:typeof t!="string"||!d}),T=n.useMemo(()=>t===L?.id?L:void 0,[t,L]),{onSaveViewFromCurrent:ee}=Ce.useSaveViewFromCurrent({viewType:e,projectName:r,viewsList:q,sourceSettings:k,onUpdateView:V}),{onCreateBaseView:ie,onUpdateBaseView:re,onDeleteBaseView:se,onLoadBaseView:te}=Se.useBaseViewMutations({viewType:e,projectName:r,viewSettings:k,workingView:s,dispatch:x}),ue=n.useCallback(async(i,{selectView:g}={})=>{if(!s?.id){console.error("No working view to update");return}await V(s.id,i,!r),g&&o(s.id)},[V,s]),b=n.useCallback(async()=>{try{await W({existingWorkingViewId:s?.id,selectedViewId:u?.id,setSelectedView:o,setSettingsChanged:w,notify:!0})}catch(i){console.error("Failed to reset view:",i)}},[s,W,u,o,w]),ne=de.default({viewsList:q,workingView:s,viewType:e,viewAlias:I,projectName:r,currentUser:f,useWorkingView:!d,editingViewId:v,selectedId:u?.id,collapsed:S,setCollapsed:h,onResetWorkingView:b,onSelect:i=>{o(i),w(!1),p(!1)},onEdit:i=>D(i),onSave:async i=>ee(i)}),oe={viewType:e,viewAlias:I,projectName:r,isMenuOpen:R,editingView:t,currentUser:f,selectedView:u,viewSettings:k,editingViewData:T,isLoadingEditingViewData:N,viewsList:q,workingSettings:E,workingView:s,isViewWorking:M,onUpdateWorkingView:ue,projectBaseView:X,studioBaseView:Z,onCreateBaseView:ie,onUpdateBaseView:re,onDeleteBaseView:se,onLoadBaseView:te,editingViewId:v,viewMenuItems:ne,isLoadingViews:j,isErrorWorkingView:J,shareOptions:_,setIsMenuOpen:p,setEditingView:D,setSelectedView:o,onSettingsChanged:w,onCreateView:K,onUpdateView:V,onDeleteView:z,resetWorkingView:b,api:ce.viewsQueries,dispatch:x};return qe.jsxRuntimeExports.jsx(Q.ViewsContext.Provider,{value:oe,children:c})},fe=()=>{const c=n.useContext(Q.ViewsContext);if(!c)throw new Error("useViewsContext must be used within a ViewsProvider");return c};exports.isViewStudioScope=O.isViewStudioScope;exports.ViewsProvider=xe;exports.useViewsContext=fe;
2
2
  //# sourceMappingURL=ViewsContext.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsContext.cjs.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { type ViewType, WORKING_VIEW_ID, BASE_VIEW_ID } from '../types'\nimport {\n GetDefaultViewApiResponse,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n useGetBaseViewQuery,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { useGlobalContext } from '@shared/context/GlobalContext'\nimport { usePowerpack } from '@shared/context/PowerpackContext'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { type UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useBaseViewMutations } from '../hooks/useBaseViewMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks/useLocalStorage'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nexport type CollapsedViewState = Record<string, boolean>\n\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n viewAlias: string\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n // Working view\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n isViewWorking: boolean\n onUpdateWorkingView: (\n payload: Partial<ViewData>,\n options?: { selectView?: boolean },\n ) => Promise<void>\n // base views\n projectBaseView: ViewListItemModel | undefined\n studioBaseView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingEditingViewData: boolean\n isLoadingViews: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Base view mutations\n onCreateBaseView: (isStudioScope: boolean) => Promise<void>\n onUpdateBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onDeleteBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onLoadBaseView: (isStudioScope: boolean) => Promise<void>\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any // dispatch is used to dispatch api mutations in pp like the share one.\n}\n\nconst DEFAULT_VIEW_ALIAS = 'view'\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n viewAlias?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType,\n viewAlias = DEFAULT_VIEW_ALIAS,\n projectName,\n dispatch,\n debug,\n}) => {\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { user: currentUser } = useGlobalContext()\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsedSections, setCollapsedSections] = useLocalStorage<CollapsedViewState>(\n stateKey,\n {},\n )\n\n // anything extra to do when a view is created successfully\n const handleOnViewCreated = (view: ViewData) => {\n const key = view.visibility === 'private' ? 'myViews' : 'sharedViews'\n // if the section is collapsed, expand it\n if (collapsedSections[key]) {\n const newCollapsedSections = { ...collapsedSections }\n newCollapsedSections[key] = false\n setCollapsedSections(newCollapsedSections)\n }\n }\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId, isLoadingDefaultView] =\n useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data and filter out base views\n const { currentData: viewsListRaw = [], isLoading: isLoadingViewsList } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Filter out base views from the list\n // Filter out studio working view if in project scope\n const viewsList = useMemo(\n () =>\n viewsListRaw.filter(\n (view) =>\n view.label !== BASE_VIEW_ID && !(projectName && view.working && view.scope === 'studio'),\n ),\n [viewsListRaw],\n )\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n viewsList,\n onCreate: handleOnViewCreated,\n })\n\n // always get your working view\n const { currentData: workingView, isLoading: isLoadingWorkingView } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Fetch both project and studio base views\n const { currentData: projectBaseView, isLoading: isLoadingProjectBaseView } = useGetBaseViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n const { currentData: studioBaseView, isLoading: isLoadingStudioBaseView } = useGetBaseViewQuery(\n { projectName: undefined, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // isLoadingViews is true ONLY on the very first fetch (no cached data yet).\n // It does NOT flip back to true during background re-fetches (e.g. after a save),\n // which prevents UI flickering in consumers like ProjectOverviewContext.\n const isLoadingViews =\n isLoadingViewsList ||\n isLoadingDefaultView ||\n isLoadingWorkingView ||\n isLoadingProjectBaseView ||\n isLoadingStudioBaseView\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n selectedView?.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData, isFetching: isLoadingEditingViewData } =\n useGetViewQuery(\n {\n viewId: editingView as string,\n projectName: isViewStudioScope(editingView as string, viewsList) ? undefined : projectName,\n viewType: viewType as string,\n },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n viewsList,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Base view mutations\n const { onCreateBaseView, onUpdateBaseView, onDeleteBaseView, onLoadBaseView } =\n useBaseViewMutations({\n viewType: viewType as string,\n projectName,\n viewSettings,\n workingView,\n dispatch,\n })\n\n const onUpdateWorkingView = useCallback(\n async (payload: Partial<ViewData>, { selectView }: { selectView?: boolean } = {}) => {\n if (!workingView?.id) {\n console.error('No working view to update')\n return\n }\n await onUpdateView(workingView.id, payload, !projectName)\n if (selectView) {\n setSelectedView(workingView.id)\n }\n },\n [onUpdateView, workingView],\n )\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n viewAlias,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n selectedId: selectedView?.id,\n collapsed: collapsedSections,\n setCollapsed: setCollapsedSections,\n onResetWorkingView: resetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n viewAlias,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n editingViewData,\n isLoadingEditingViewData,\n viewsList,\n // Working view\n workingSettings,\n workingView,\n isViewWorking,\n onUpdateWorkingView,\n // base views\n projectBaseView,\n studioBaseView,\n // base view mutations\n onCreateBaseView,\n onUpdateBaseView,\n onDeleteBaseView,\n onLoadBaseView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n\nimport { isViewStudioScope } from '../utils/isViewStudioScope'\nimport { ViewsContext } from './ViewsContextInstance'\nexport { isViewStudioScope }\n"],"names":["DEFAULT_VIEW_ALIAS","ViewsProvider","children","viewType","viewAlias","projectName","dispatch","debug","powerLicense","usePowerpack","currentUser","useGlobalContext","isMenuOpen","setIsMenuOpen","useState","editingView","setEditingView","stateKey","collapsedSections","setCollapsedSections","useLocalStorage","handleOnViewCreated","view","key","newCollapsedSections","shareOptions","useGetShareOptionsQuery","selectedView","setSelectedView","previousSelectedViewId","isLoadingDefaultView","useSelectedView","viewSettingsChanged","setViewSettingsChanged","useViewSettingsChanged","viewsListRaw","isLoadingViewsList","useListViewsQuery","viewsList","useMemo","BASE_VIEW_ID","onCreateView","onDeleteView","onUpdateView","onResetWorkingView","useViewsMutations","workingView","isLoadingWorkingView","useGetWorkingViewQuery","projectBaseView","isLoadingProjectBaseView","useGetBaseViewQuery","studioBaseView","isLoadingStudioBaseView","isLoadingViews","workingSettings","viewSettings","WORKING_VIEW_ID","isViewWorking","editingViewId","editingViewDataData","isLoadingEditingViewData","useGetViewQuery","isViewStudioScope","editingViewData","onSaveViewFromCurrent","useSaveViewFromCurrent","onCreateBaseView","onUpdateBaseView","onDeleteBaseView","onLoadBaseView","useBaseViewMutations","onUpdateWorkingView","useCallback","payload","selectView","resetWorkingView","error","viewMenuItems","useBuildViewMenuItems","viewId","value","viewsQueries","jsx","ViewsContext","useViewsContext","context","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"ViewsContext.cjs.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { type ViewType, WORKING_VIEW_ID, BASE_VIEW_ID } from '../types'\nimport {\n GetDefaultViewApiResponse,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n useGetBaseViewQuery,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { useGlobalContext } from '@shared/context/GlobalContext'\nimport { usePowerpack } from '@shared/context/PowerpackContext'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { type UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useBaseViewMutations } from '../hooks/useBaseViewMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks/useLocalStorage'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nexport type CollapsedViewState = Record<string, boolean>\n\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n viewAlias: string\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n // Working view\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n isViewWorking: boolean\n onUpdateWorkingView: (\n payload: Partial<ViewData>,\n options?: { selectView?: boolean },\n ) => Promise<void>\n // base views\n projectBaseView: ViewListItemModel | undefined\n studioBaseView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingEditingViewData: boolean\n isLoadingViews: boolean\n isErrorWorkingView: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Base view mutations\n onCreateBaseView: (isStudioScope: boolean) => Promise<void>\n onUpdateBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onDeleteBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onLoadBaseView: (isStudioScope: boolean) => Promise<void>\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any // dispatch is used to dispatch api mutations in pp like the share one.\n}\n\nconst DEFAULT_VIEW_ALIAS = 'view'\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n viewAlias?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType,\n viewAlias = DEFAULT_VIEW_ALIAS,\n projectName,\n dispatch,\n debug,\n}) => {\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { user: currentUser } = useGlobalContext()\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsedSections, setCollapsedSections] = useLocalStorage<CollapsedViewState>(\n stateKey,\n {},\n )\n\n // anything extra to do when a view is created successfully\n const handleOnViewCreated = (view: ViewData) => {\n const key = view.visibility === 'private' ? 'myViews' : 'sharedViews'\n // if the section is collapsed, expand it\n if (collapsedSections[key]) {\n const newCollapsedSections = { ...collapsedSections }\n newCollapsedSections[key] = false\n setCollapsedSections(newCollapsedSections)\n }\n }\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId, isLoadingDefaultView] =\n useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data and filter out base views\n const { currentData: viewsListRaw = [], isLoading: isLoadingViewsList } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Filter out base views from the list\n // Filter out studio working view if in project scope\n const viewsList = useMemo(\n () =>\n viewsListRaw.filter(\n (view) =>\n view.label !== BASE_VIEW_ID && !(projectName && view.working && view.scope === 'studio'),\n ),\n [viewsListRaw],\n )\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n viewsList,\n onCreate: handleOnViewCreated,\n })\n\n // always get your working view\n const {\n currentData: workingView,\n isLoading: isLoadingWorkingView,\n isError: isErrorWorkingView,\n } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Fetch both project and studio base views\n const { currentData: projectBaseView, isLoading: isLoadingProjectBaseView } = useGetBaseViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n const { currentData: studioBaseView, isLoading: isLoadingStudioBaseView } = useGetBaseViewQuery(\n { projectName: undefined, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // isLoadingViews is true ONLY on the very first fetch (no cached data yet).\n // It does NOT flip back to true during background re-fetches (e.g. after a save),\n // which prevents UI flickering in consumers like ProjectOverviewContext.\n const isLoadingViews =\n isLoadingViewsList ||\n isLoadingDefaultView ||\n isLoadingWorkingView ||\n isLoadingProjectBaseView ||\n isLoadingStudioBaseView\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n selectedView?.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData, isFetching: isLoadingEditingViewData } =\n useGetViewQuery(\n {\n viewId: editingView as string,\n projectName: isViewStudioScope(editingView as string, viewsList) ? undefined : projectName,\n viewType: viewType as string,\n },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n viewsList,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Base view mutations\n const { onCreateBaseView, onUpdateBaseView, onDeleteBaseView, onLoadBaseView } =\n useBaseViewMutations({\n viewType: viewType as string,\n projectName,\n viewSettings,\n workingView,\n dispatch,\n })\n\n const onUpdateWorkingView = useCallback(\n async (payload: Partial<ViewData>, { selectView }: { selectView?: boolean } = {}) => {\n if (!workingView?.id) {\n console.error('No working view to update')\n return\n }\n await onUpdateView(workingView.id, payload, !projectName)\n if (selectView) {\n setSelectedView(workingView.id)\n }\n },\n [onUpdateView, workingView],\n )\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n viewAlias,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n selectedId: selectedView?.id,\n collapsed: collapsedSections,\n setCollapsed: setCollapsedSections,\n onResetWorkingView: resetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n viewAlias,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n editingViewData,\n isLoadingEditingViewData,\n viewsList,\n // Working view\n workingSettings,\n workingView,\n isViewWorking,\n onUpdateWorkingView,\n // base views\n projectBaseView,\n studioBaseView,\n // base view mutations\n onCreateBaseView,\n onUpdateBaseView,\n onDeleteBaseView,\n onLoadBaseView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n isErrorWorkingView,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n\nimport { isViewStudioScope } from '../utils/isViewStudioScope'\nimport { ViewsContext } from './ViewsContextInstance'\nexport { isViewStudioScope }\n"],"names":["DEFAULT_VIEW_ALIAS","ViewsProvider","children","viewType","viewAlias","projectName","dispatch","debug","powerLicense","usePowerpack","currentUser","useGlobalContext","isMenuOpen","setIsMenuOpen","useState","editingView","setEditingView","stateKey","collapsedSections","setCollapsedSections","useLocalStorage","handleOnViewCreated","view","key","newCollapsedSections","shareOptions","useGetShareOptionsQuery","selectedView","setSelectedView","previousSelectedViewId","isLoadingDefaultView","useSelectedView","viewSettingsChanged","setViewSettingsChanged","useViewSettingsChanged","viewsListRaw","isLoadingViewsList","useListViewsQuery","viewsList","useMemo","BASE_VIEW_ID","onCreateView","onDeleteView","onUpdateView","onResetWorkingView","useViewsMutations","workingView","isLoadingWorkingView","isErrorWorkingView","useGetWorkingViewQuery","projectBaseView","isLoadingProjectBaseView","useGetBaseViewQuery","studioBaseView","isLoadingStudioBaseView","isLoadingViews","workingSettings","viewSettings","WORKING_VIEW_ID","isViewWorking","editingViewId","editingViewDataData","isLoadingEditingViewData","useGetViewQuery","isViewStudioScope","editingViewData","onSaveViewFromCurrent","useSaveViewFromCurrent","onCreateBaseView","onUpdateBaseView","onDeleteBaseView","onLoadBaseView","useBaseViewMutations","onUpdateWorkingView","useCallback","payload","selectView","resetWorkingView","error","viewMenuItems","useBuildViewMenuItems","viewId","value","viewsQueries","jsx","ViewsContext","useViewsContext","context","useContext"],"mappings":"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"}