@ynput/ayon-frontend-shared 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ProjectTreeTable.cjs.js +1 -1
- package/dist/ProjectTreeTable.es.js +247 -243
- package/dist/_virtual/index.cjs22.js +1 -1
- package/dist/_virtual/index.cjs23.js +1 -1
- package/dist/_virtual/index.cjs24.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.es22.js +3 -3
- package/dist/_virtual/index.es23.js +5 -5
- package/dist/_virtual/index.es24.js +5 -5
- package/dist/_virtual/index.es4.js +2 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -2
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/api.cjs.js +1 -1
- package/dist/api.es.js +446 -445
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +20 -9
- package/dist/index.es.js.map +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
- package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
- package/dist/shared/node_modules/react-is/index.es.js +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +85 -28
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +129 -68
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js +36 -36
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.cjs.js +12 -6
- package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.es.js +69 -62
- package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +32 -12
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -2
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +33 -33
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +39 -8
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +32 -31
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js +24 -18
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js +26 -25
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js +14 -2
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +125 -126
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +14 -8
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +200 -178
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +14 -3
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js +6 -3
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +19 -19
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +5 -3
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +100 -97
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +9 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +47 -31
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +28 -9
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +58 -39
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +53 -25
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +150 -103
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +9 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +66 -57
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +9 -8
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +20 -4
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +86 -67
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js +11 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js.map +1 -0
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js +67 -62
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +47 -46
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.es.js +1 -1
- package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js +36 -33
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js.map +1 -1
- package/dist/types/api/generated/graphql.d.ts +71 -0
- package/dist/types/api/queries/activities/getActivities.d.ts +28 -0
- package/dist/types/api/queries/entities/getEntity.d.ts +14 -0
- package/dist/types/api/queries/entities/getEntityPanel.d.ts +14 -0
- package/dist/types/api/queries/entities/updateEntity.d.ts +14 -0
- package/dist/types/api/queries/entityLists/getLists.d.ts +14 -0
- package/dist/types/api/queries/overview/getOverview.d.ts +14 -0
- package/dist/types/api/queries/project/getProject.d.ts +14 -0
- package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +14 -0
- package/dist/types/api/queries/users/getUsers.d.ts +14 -0
- package/dist/types/api/queries/versions/getVersionsProducts.d.ts +28 -0
- package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +4 -1
- package/dist/types/containers/Feed/helpers/buildBackendFilter.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/constants.d.ts +3 -0
- package/dist/types/containers/ProjectTreeTable/widgets/SubtasksWidget.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/widgets/wrapMode.d.ts +2 -0
- package/dist/types/containers/Views/context/ViewsContext.d.ts +1 -0
- package/dist/types/util/buildHierarchicalTableRows.d.ts +2 -0
- package/package.json +1 -1
|
@@ -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
|
|
16
|
+
import { TextContentWidget as V } from "./TextContentWidget.es.js";
|
|
17
17
|
import { CellEditingDialog as ce } from "../../../components/LinksManager/CellEditingDialog.es.js";
|
|
18
|
-
|
|
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
|
-
`,
|
|
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
|
|
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
|
-
},
|
|
113
|
+
}, we = (s) => {
|
|
97
114
|
const i = /(https?:\/\/[^\s<>"]+[^\s.,!?;:<>\")\]])/gi;
|
|
98
|
-
return s.split(i).map((
|
|
99
|
-
},
|
|
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:
|
|
104
|
-
isEditing:
|
|
120
|
+
isMarkdown: m,
|
|
121
|
+
isEditing: l,
|
|
105
122
|
isInherited: x,
|
|
106
|
-
onChange:
|
|
123
|
+
onChange: p,
|
|
107
124
|
onCancelEdit: g,
|
|
108
|
-
style:
|
|
125
|
+
style: F,
|
|
109
126
|
type: S,
|
|
110
|
-
columnId:
|
|
127
|
+
columnId: he,
|
|
111
128
|
cellId: n,
|
|
112
|
-
onRequestEdit:
|
|
113
|
-
getDraftValue:
|
|
114
|
-
setDraftValue:
|
|
115
|
-
className:
|
|
116
|
-
...
|
|
117
|
-
},
|
|
118
|
-
const R =
|
|
119
|
-
}),
|
|
120
|
-
}), [
|
|
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,
|
|
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
|
-
}, [
|
|
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
|
|
144
|
-
b.current = e,
|
|
162
|
+
const c = E((e) => {
|
|
163
|
+
b.current = e, X(e);
|
|
145
164
|
}, []);
|
|
146
|
-
v(() => (clearTimeout(k.current), clearTimeout(T.current),
|
|
147
|
-
b.current || (
|
|
148
|
-
},
|
|
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
|
-
}), [
|
|
169
|
+
}), [H, W, l, n, c]), v(() => {
|
|
151
170
|
const e = (r) => {
|
|
152
|
-
r.detail?.cellId !== n &&
|
|
171
|
+
r.detail?.cellId !== n && c(!1);
|
|
153
172
|
};
|
|
154
173
|
return window.addEventListener(D, e), () => window.removeEventListener(D, e);
|
|
155
|
-
}, [n,
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
}, [n, R,
|
|
174
|
+
}, [n, c]);
|
|
175
|
+
const M = E(() => {
|
|
176
|
+
c(!1), n && R(n);
|
|
177
|
+
}, [n, R, c]), I = E(
|
|
159
178
|
(e, r) => {
|
|
160
|
-
|
|
179
|
+
p(e, r === "Enter" ? "Click" : r);
|
|
161
180
|
},
|
|
162
|
-
[
|
|
163
|
-
),
|
|
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:
|
|
200
|
+
children: u
|
|
182
201
|
}
|
|
183
|
-
) :
|
|
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)) :
|
|
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) :
|
|
204
|
-
if (
|
|
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:
|
|
228
|
+
onChange: p,
|
|
210
229
|
onCancel: g,
|
|
211
230
|
type: S || "string"
|
|
212
231
|
}
|
|
213
232
|
);
|
|
214
|
-
const ee = ae(
|
|
215
|
-
markdown:
|
|
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
|
-
|
|
239
|
+
me,
|
|
221
240
|
{
|
|
222
241
|
className: ee,
|
|
223
|
-
style: { color: i?.color, ...
|
|
224
|
-
...
|
|
242
|
+
style: { color: i?.color, ...F },
|
|
243
|
+
...G,
|
|
225
244
|
ref: (e) => {
|
|
226
|
-
y.current = e, typeof
|
|
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
|
-
|
|
257
|
+
U()
|
|
239
258
|
]
|
|
240
259
|
}
|
|
241
260
|
),
|
|
242
|
-
|
|
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:
|
|
255
|
-
onEditingDraftChange:
|
|
273
|
+
draftValue: $(),
|
|
274
|
+
onEditingDraftChange: J
|
|
256
275
|
}
|
|
257
276
|
),
|
|
258
|
-
O && !
|
|
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:
|
|
267
|
-
onCancelEdit: () =>
|
|
268
|
-
onPreviewClick:
|
|
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 && !
|
|
292
|
+
O && !l && !m && n && /* @__PURE__ */ o.jsx(
|
|
274
293
|
ce,
|
|
275
294
|
{
|
|
276
295
|
isEditing: !0,
|
|
277
296
|
anchorId: n,
|
|
278
|
-
onClose: () =>
|
|
297
|
+
onClose: () => c(!1),
|
|
279
298
|
children: /* @__PURE__ */ o.jsx(
|
|
280
|
-
|
|
299
|
+
pe,
|
|
281
300
|
{
|
|
282
|
-
onClick:
|
|
301
|
+
onClick: M,
|
|
283
302
|
onMouseEnter: () => d(!0),
|
|
284
303
|
onMouseLeave: () => d(!1),
|
|
285
304
|
onMouseDown: (e) => e.stopPropagation(),
|
|
286
|
-
children:
|
|
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
|
-
|
|
296
|
-
|
|
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
|
|
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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"}
|