@ynput/ayon-frontend-shared 0.3.33 → 0.3.34
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/_virtual/index.cjs7.js +1 -1
- package/dist/_virtual/index.cjs9.js +1 -1
- package/dist/_virtual/index.es7.js +2 -5
- package/dist/_virtual/index.es7.js.map +1 -1
- package/dist/_virtual/index.es9.js +5 -2
- package/dist/_virtual/index.es9.js.map +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/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-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/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +2 -2
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +2 -2
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js +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 +7 -7
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/Feed.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/Feed.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/Feed.es.js +95 -93
- package/dist/shared/src/containers/Feed/Feed.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityDate.cjs.js +3 -3
- package/dist/shared/src/containers/Feed/components/ActivityDate.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityDate.es.js +37 -35
- package/dist/shared/src/containers/Feed/components/ActivityDate.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityItem.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityItem.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityItem.es.js +14 -13
- package/dist/shared/src/containers/Feed/components/ActivityItem.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.es.js +34 -38
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.cjs.js +13 -4
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.es.js +17 -8
- package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.cjs.js +2 -0
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.es.js +6 -4
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.es.js +8 -8
- package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.es.js.map +1 -1
- package/dist/types/api/generated/graphql.d.ts +4 -3
- package/dist/types/api/generated/graphqlLinks.d.ts +2 -1
- package/dist/types/api/queries/activities/getActivities.d.ts +77 -77
- package/dist/types/api/queries/activities/updateActivities.d.ts +4 -4
- package/dist/types/api/queries/entities/getEntity.d.ts +1 -1
- package/dist/types/api/queries/entities/getEntityPanel.d.ts +1 -1
- package/dist/types/api/queries/entities/updateEntity.d.ts +1 -1
- package/dist/types/api/queries/entityLists/getLists.d.ts +1 -1
- package/dist/types/api/queries/overview/getOverview.d.ts +1 -1
- package/dist/types/api/queries/project/getProject.d.ts +1 -1
- package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +1 -1
- package/dist/types/api/queries/users/getUsers.d.ts +1 -1
- package/dist/types/api/queries/versions/getVersionsProducts.d.ts +2 -2
- package/dist/types/containers/Feed/components/ActivityDate.d.ts +2 -1
- package/dist/types/containers/Feed/components/ActivityItem.d.ts +1 -0
- package/dist/types/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.d.ts +1 -0
- package/dist/types/containers/Feed/hooks/useGetFeedActivitiesData.d.ts +3 -3
- package/package.json +1 -1
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { j as r } from "../../../../_virtual/jsx-runtime.es.js";
|
|
2
|
-
import { useMemo as _, useEffect as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { FeedContainer as
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import { InView as
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import { getLoadingPlaceholders as
|
|
2
|
+
import { useMemo as _, useEffect as gt, useRef as ht, useCallback as B } from "react";
|
|
3
|
+
import yt from "./components/ActivityItem.es.js";
|
|
4
|
+
import vt from "./components/CommentInput/CommentInput.es.js";
|
|
5
|
+
import { FeedContainer as xt, FeedContent as kt, LoadMore as Ct } from "./Feed.styled.es.js";
|
|
6
|
+
import wt from "./hooks/useCommentMutations.es.js";
|
|
7
|
+
import It from "./hooks/useTransformActivities.es.js";
|
|
8
|
+
import { InView as Ft } from "../../../../node_modules/react-intersection-observer/dist/index.es.js";
|
|
9
|
+
import bt from "./hooks/useSaveScrollPos.es.js";
|
|
10
|
+
import At from "./hooks/useScrollOnInputOpen.es.js";
|
|
11
|
+
import { getLoadingPlaceholders as Mt } from "./feedHelpers.es.js";
|
|
12
12
|
import "@ynput/ayon-react-components";
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import { isFilePreviewable as
|
|
16
|
-
import { EmptyPlaceholder as
|
|
13
|
+
import jt from "clsx";
|
|
14
|
+
import Pt from "./hooks/useScrollToHighlighted.es.js";
|
|
15
|
+
import { isFilePreviewable as Rt } from "./components/FileUploadPreview/FileUploadPreview.es.js";
|
|
16
|
+
import { EmptyPlaceholder as Lt } from "../../components/EmptyPlaceholder/EmptyPlaceholder.es.js";
|
|
17
17
|
import "../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.es.js";
|
|
18
|
-
import { useFeedContext as
|
|
18
|
+
import { useFeedContext as Et, FEED_NEW_COMMENT as C } from "./context/FeedContext.es.js";
|
|
19
19
|
import "../../context/RemoteModulesContext.es.js";
|
|
20
|
-
import { useDetailsPanelContext as
|
|
20
|
+
import { useDetailsPanelContext as Nt } from "../../context/DetailsPanelContext.es.js";
|
|
21
21
|
import "../../../../_virtual/runtime.es.js";
|
|
22
22
|
import "../../../../_virtual/semver.es.js";
|
|
23
23
|
import "../../api/base/client.es.js";
|
|
@@ -93,7 +93,7 @@ import "../../api/queries/folders/getFolderDeleteInfo.es.js";
|
|
|
93
93
|
import "../../api/queries/grouping/getGrouping.es.js";
|
|
94
94
|
import "../../api/queries/links/updateLinks.es.js";
|
|
95
95
|
import "../../api/queries/links/getLinks.es.js";
|
|
96
|
-
import { useGetMyProjectPermissionsQuery as
|
|
96
|
+
import { useGetMyProjectPermissionsQuery as Ot } from "../../api/queries/permissions/getPermissions.es.js";
|
|
97
97
|
import "../../api/queries/products/createProduct.es.js";
|
|
98
98
|
import "../../api/queries/products/getFolderProducts.es.js";
|
|
99
99
|
import "../../api/queries/project/getProject.es.js";
|
|
@@ -138,10 +138,10 @@ import "../../context/GlobalContext.es.js";
|
|
|
138
138
|
import "../../context/ProjectContext.es.js";
|
|
139
139
|
import "../../context/ProjectFoldersContext.es.js";
|
|
140
140
|
import "../../context/UriContext.es.js";
|
|
141
|
-
import
|
|
142
|
-
import
|
|
143
|
-
import { useLastVersionReview as
|
|
144
|
-
const
|
|
141
|
+
import Tt from "./helpers/mergeAnnotationAttachments.es.js";
|
|
142
|
+
import St from "../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.es.js";
|
|
143
|
+
import { useLastVersionReview as Dt } from "./hooks/useLastVersionReview.es.js";
|
|
144
|
+
const Fo = 30, Vt = [
|
|
145
145
|
{
|
|
146
146
|
id: "comments",
|
|
147
147
|
tooltip: "Comments",
|
|
@@ -162,16 +162,16 @@ const Io = 30, Dt = [
|
|
|
162
162
|
tooltip: "Entity updates",
|
|
163
163
|
icon: "arrow_circle_right"
|
|
164
164
|
}
|
|
165
|
-
],
|
|
165
|
+
], bo = ({
|
|
166
166
|
disabled: H,
|
|
167
|
-
readOnly:
|
|
168
|
-
statuses:
|
|
169
|
-
entityListId:
|
|
167
|
+
readOnly: G,
|
|
168
|
+
statuses: W = [],
|
|
169
|
+
entityListId: q,
|
|
170
170
|
isSlideOut: Q,
|
|
171
171
|
versionReview: w = !1
|
|
172
172
|
}) => {
|
|
173
173
|
const {
|
|
174
|
-
projectName:
|
|
174
|
+
projectName: s,
|
|
175
175
|
entities: l,
|
|
176
176
|
entityType: d,
|
|
177
177
|
editingId: I,
|
|
@@ -179,37 +179,38 @@ const Io = 30, Dt = [
|
|
|
179
179
|
setEditingId: b,
|
|
180
180
|
userName: A,
|
|
181
181
|
activitiesData: h,
|
|
182
|
-
isLoadingNew:
|
|
182
|
+
isLoadingNew: m,
|
|
183
183
|
isLoadingNextPage: M,
|
|
184
184
|
loadNextPage: c,
|
|
185
185
|
hasNextPage: U,
|
|
186
186
|
users: z,
|
|
187
187
|
feedFilter: p,
|
|
188
|
-
setFeedFilter: J
|
|
189
|
-
|
|
190
|
-
|
|
188
|
+
setFeedFilter: J,
|
|
189
|
+
isGuest: K
|
|
190
|
+
} = Et(), {
|
|
191
|
+
openSlideOut: X,
|
|
191
192
|
highlightedActivities: y,
|
|
192
|
-
setHighlightedActivities:
|
|
193
|
-
onOpenImage:
|
|
193
|
+
setHighlightedActivities: Y,
|
|
194
|
+
onOpenImage: Z,
|
|
194
195
|
setFeedAnnotations: j,
|
|
195
196
|
user: P
|
|
196
|
-
} =
|
|
197
|
+
} = Nt(), $ = p.conditions?.some(
|
|
197
198
|
(t) => "key" in t && t.key === "versions" && t.value === !0
|
|
198
|
-
),
|
|
199
|
+
), tt = p.conditions?.some(
|
|
199
200
|
(t) => "key" in t && ["comments", "checklists", "versions", "updates"].includes(t.key) && t.value === !0
|
|
200
201
|
), R = p.conditions?.some(
|
|
201
202
|
(t) => "key" in t && (t.key === "comments" || t.key === "checklists") && t.value === !0
|
|
202
203
|
), {
|
|
203
204
|
data: L,
|
|
204
|
-
isLoading:
|
|
205
|
-
} =
|
|
206
|
-
{ projectName:
|
|
207
|
-
{ skip: !
|
|
208
|
-
),
|
|
209
|
-
() =>
|
|
205
|
+
isLoading: it
|
|
206
|
+
} = Ot(
|
|
207
|
+
{ projectName: s },
|
|
208
|
+
{ skip: !s }
|
|
209
|
+
), et = !P.data?.isManager && !P.data?.isAdmin && !it && L?.activities?.enabled && !L?.activities?.activities?.includes("comment") || tt && !R, u = _(
|
|
210
|
+
() => Tt(h),
|
|
210
211
|
[h]
|
|
211
212
|
);
|
|
212
|
-
|
|
213
|
+
gt(() => {
|
|
213
214
|
u.length || j([]);
|
|
214
215
|
const t = u.map(
|
|
215
216
|
(i) => i.activityData?.annotations?.map((e) => ({
|
|
@@ -219,7 +220,7 @@ const Io = 30, Dt = [
|
|
|
219
220
|
).filter(Boolean).flat();
|
|
220
221
|
j(t);
|
|
221
222
|
}, [u]);
|
|
222
|
-
const f =
|
|
223
|
+
const f = It(
|
|
223
224
|
// @ts-ignore
|
|
224
225
|
u,
|
|
225
226
|
z,
|
|
@@ -227,17 +228,17 @@ const Io = 30, Dt = [
|
|
|
227
228
|
d,
|
|
228
229
|
A,
|
|
229
230
|
p
|
|
230
|
-
), a =
|
|
231
|
-
|
|
231
|
+
), a = ht(null);
|
|
232
|
+
At({ feedRef: a, isInputOpen: I === C, height: 93 }), bt({
|
|
232
233
|
entities: l,
|
|
233
234
|
feedRef: a,
|
|
234
235
|
filter: p,
|
|
235
236
|
disabled: !!y.length,
|
|
236
|
-
isLoading:
|
|
237
|
-
}),
|
|
237
|
+
isLoading: m
|
|
238
|
+
}), Pt({
|
|
238
239
|
feedRef: a,
|
|
239
240
|
highlighted: y,
|
|
240
|
-
isLoading:
|
|
241
|
+
isLoading: m || M,
|
|
241
242
|
loadNextPage: c,
|
|
242
243
|
hasNextPage: !!c,
|
|
243
244
|
activities: h
|
|
@@ -245,16 +246,16 @@ const Io = 30, Dt = [
|
|
|
245
246
|
const {
|
|
246
247
|
submitComment: E,
|
|
247
248
|
updateComment: N,
|
|
248
|
-
deleteComment:
|
|
249
|
+
deleteComment: ot,
|
|
249
250
|
submitReview: O,
|
|
250
|
-
isSaving:
|
|
251
|
-
} =
|
|
252
|
-
projectName:
|
|
251
|
+
isSaving: rt
|
|
252
|
+
} = wt({
|
|
253
|
+
projectName: s,
|
|
253
254
|
entityType: d,
|
|
254
255
|
entities: l,
|
|
255
256
|
filter: p,
|
|
256
|
-
entityListId:
|
|
257
|
-
}),
|
|
257
|
+
entityListId: q
|
|
258
|
+
}), st = B(
|
|
258
259
|
async (t, i = [], e = {}) => {
|
|
259
260
|
await E(t, i, e), a.current && a.current.scrollTo({ top: 0 });
|
|
260
261
|
},
|
|
@@ -264,111 +265,112 @@ const Io = 30, Dt = [
|
|
|
264
265
|
}, [O]), mt = (t, i) => {
|
|
265
266
|
const e = t?.target;
|
|
266
267
|
if (!e || !i) return console.log("no target or activity");
|
|
267
|
-
const o = e.checked,
|
|
268
|
+
const o = e.checked, n = o ? "[ ]" : "[x]", dt = o ? "[x]" : "[ ]", { body: g } = i, T = Array.from(
|
|
268
269
|
e.closest(".comment-body")?.querySelectorAll(".task-list-item") || []
|
|
269
270
|
).findIndex((k) => k === e.closest("li"));
|
|
270
271
|
let S = T;
|
|
271
|
-
(g.match(/\[.\]/g) || []).forEach((k,
|
|
272
|
-
k !==
|
|
272
|
+
(g.match(/\[.\]/g) || []).forEach((k, ft) => {
|
|
273
|
+
k !== n && ft < T && S--;
|
|
273
274
|
});
|
|
274
275
|
const D = [];
|
|
275
276
|
let v = -1;
|
|
276
|
-
for (; (v = g.indexOf(
|
|
277
|
+
for (; (v = g.indexOf(n, v + 1)) > -1; )
|
|
277
278
|
D.push(v);
|
|
278
279
|
const x = D[S];
|
|
279
280
|
if (x === void 0) return;
|
|
280
|
-
const
|
|
281
|
+
const ut = x + n.length, V = g.slice(0, x) + dt + g.slice(ut);
|
|
281
282
|
V && N(i, V, i.files);
|
|
282
|
-
},
|
|
283
|
+
}, pt = (t) => {
|
|
283
284
|
const { entityId: i, entityType: e, activityId: o } = t;
|
|
284
285
|
if (!e || !["version", "task", "folder"].includes(e))
|
|
285
286
|
return console.log("Entity type not supported yet");
|
|
286
|
-
if (!i || !e || !
|
|
287
|
-
|
|
288
|
-
},
|
|
287
|
+
if (!i || !e || !s) return console.log("No entity id or type found");
|
|
288
|
+
X({ entityId: i, entityType: e, projectName: s }), Y([o]);
|
|
289
|
+
}, at = ({ index: t, activityId: i }) => {
|
|
289
290
|
const e = Object.values(f).reverse().filter((o) => o.activityType == "comment").map((o) => ({
|
|
290
291
|
id: o.activityId,
|
|
291
|
-
files: o.files.filter((
|
|
292
|
+
files: o.files.filter((n) => Rt(n.mime, n.ext))
|
|
292
293
|
})).filter((o) => o.files.length > 0);
|
|
293
|
-
|
|
294
|
-
},
|
|
295
|
-
projectName:
|
|
294
|
+
Z?.({ files: e, activityId: i, index: t, projectName: s });
|
|
295
|
+
}, lt = _(() => Mt(10), []), ct = Dt({
|
|
296
|
+
projectName: s,
|
|
296
297
|
enabled: w,
|
|
297
298
|
entityIds: l.map((t) => t.id),
|
|
298
299
|
activities: f,
|
|
299
|
-
loadingActivities:
|
|
300
|
+
loadingActivities: m,
|
|
300
301
|
userName: A
|
|
301
302
|
});
|
|
302
|
-
return /* @__PURE__ */ r.jsx(r.Fragment, { children: /* @__PURE__ */ r.jsxs(
|
|
303
|
+
return /* @__PURE__ */ r.jsx(r.Fragment, { children: /* @__PURE__ */ r.jsxs(xt, { className: "feed", children: [
|
|
303
304
|
void 0,
|
|
304
305
|
/* @__PURE__ */ r.jsx(
|
|
305
|
-
|
|
306
|
+
St,
|
|
306
307
|
{
|
|
307
308
|
label: "Activity Feed",
|
|
308
|
-
filters:
|
|
309
|
+
filters: Vt,
|
|
309
310
|
currentFilter: p,
|
|
310
311
|
onFilterChange: J,
|
|
311
|
-
isLoading:
|
|
312
|
+
isLoading: m
|
|
312
313
|
}
|
|
313
314
|
),
|
|
314
|
-
/* @__PURE__ */ r.jsxs(
|
|
315
|
-
|
|
316
|
-
|
|
315
|
+
/* @__PURE__ */ r.jsxs(kt, { ref: a, className: jt({ loading: m }, "no-shimmer"), children: [
|
|
316
|
+
m ? lt : f.map((t) => /* @__PURE__ */ r.jsx(
|
|
317
|
+
yt,
|
|
317
318
|
{
|
|
318
319
|
activity: t,
|
|
319
320
|
onCheckChange: mt,
|
|
320
|
-
onDelete:
|
|
321
|
-
onUpdate: async (i, e, o,
|
|
321
|
+
onDelete: ot,
|
|
322
|
+
onUpdate: async (i, e, o, n) => await N(t, i, e, n),
|
|
322
323
|
projectInfo: F,
|
|
323
|
-
projectName:
|
|
324
|
+
projectName: s,
|
|
324
325
|
entityType: d,
|
|
325
|
-
onReferenceClick:
|
|
326
|
+
onReferenceClick: pt,
|
|
326
327
|
createdAts: l.map((i) => i.createdAt),
|
|
327
|
-
onFileExpand:
|
|
328
|
+
onFileExpand: at,
|
|
328
329
|
showOrigin: l.length > 1,
|
|
329
330
|
filter: p,
|
|
330
331
|
editProps: {
|
|
331
|
-
projectName:
|
|
332
|
+
projectName: s,
|
|
332
333
|
entities: l,
|
|
333
334
|
entityType: d
|
|
334
335
|
},
|
|
335
336
|
isHighlighted: y.includes(t.activityId),
|
|
336
|
-
readOnly:
|
|
337
|
-
statuses:
|
|
338
|
-
isSlideOut: Q
|
|
337
|
+
readOnly: G,
|
|
338
|
+
statuses: W,
|
|
339
|
+
isSlideOut: Q,
|
|
340
|
+
isGuest: K
|
|
339
341
|
},
|
|
340
342
|
t.activityId
|
|
341
343
|
)),
|
|
342
|
-
f.length === 0 &&
|
|
344
|
+
f.length === 0 && $ && !R && !m && /* @__PURE__ */ r.jsx(Lt, { message: "No versions published yet", icon: "layers" }),
|
|
343
345
|
U && c && /* @__PURE__ */ r.jsx(
|
|
344
|
-
|
|
346
|
+
Ft,
|
|
345
347
|
{
|
|
346
348
|
root: a.current,
|
|
347
349
|
onChange: (t) => t && c(),
|
|
348
350
|
rootMargin: "400px 0px 0px 0px",
|
|
349
|
-
children: /* @__PURE__ */ r.jsx(
|
|
351
|
+
children: /* @__PURE__ */ r.jsx(Ct, { style: { height: 0 }, onClick: () => c(), children: M ? "Loading more..." : "Click to load more" })
|
|
350
352
|
}
|
|
351
353
|
)
|
|
352
354
|
] }),
|
|
353
|
-
!
|
|
354
|
-
|
|
355
|
+
!et && /* @__PURE__ */ r.jsx(
|
|
356
|
+
vt,
|
|
355
357
|
{
|
|
356
358
|
initValue: null,
|
|
357
|
-
onSubmit:
|
|
359
|
+
onSubmit: st,
|
|
358
360
|
isOpen: I === C,
|
|
359
361
|
onClose: () => b(null),
|
|
360
362
|
onOpen: () => b(C),
|
|
361
363
|
disabled: H,
|
|
362
|
-
isLoading:
|
|
364
|
+
isLoading: m || !l.length || rt,
|
|
363
365
|
versionReview: w,
|
|
364
|
-
lastOwnVersionReview:
|
|
366
|
+
lastOwnVersionReview: ct,
|
|
365
367
|
onReview: nt
|
|
366
368
|
}
|
|
367
369
|
)
|
|
368
370
|
] }) });
|
|
369
371
|
};
|
|
370
372
|
export {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
+
bo as Feed,
|
|
374
|
+
Fo as activitiesLast
|
|
373
375
|
};
|
|
374
376
|
//# sourceMappingURL=Feed.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Feed.es.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput, { VersionReviewFeedback } from './components/CommentInput/CommentInput'\nimport * as Styled from './Feed.styled'\nimport useCommentMutations, { Activity } from './hooks/useCommentMutations'\nimport useTransformActivities from './hooks/useTransformActivities'\nimport { InView } from 'react-intersection-observer'\nimport useSaveScrollPos from './hooks/useSaveScrollPos'\nimport useScrollOnInputOpen from './hooks/useScrollOnInputOpen'\nimport { getLoadingPlaceholders } from './feedHelpers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport useScrollToHighlighted from './hooks/useScrollToHighlighted'\nimport { isFilePreviewable } from './components/FileUploadPreview/FileUploadPreview'\nimport EmptyPlaceholder from '@shared/components/EmptyPlaceholder'\nimport { useFeedContext, FEED_NEW_COMMENT } from './context/FeedContext'\nimport { Status } from '../ProjectTreeTable/types/project'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { DetailsPanelEntityType, useGetMyProjectPermissionsQuery } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\nimport { SavedAnnotationMetadata } from '.'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { useLastVersionReview } from './hooks/useLastVersionReview'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nconst feedFilters: FilterItem<string>[] = [\n {\n id: 'comments',\n tooltip: 'Comments',\n icon: 'chat',\n },\n {\n id: 'checklists',\n tooltip: 'Checklists',\n icon: 'checklist',\n },\n {\n id: 'versions',\n tooltip: 'Published versions',\n icon: 'layers',\n },\n {\n id: 'updates',\n tooltip: 'Entity updates',\n icon: 'arrow_circle_right',\n },\n]\n\nexport type FeedProps = {\n disabled?: boolean\n readOnly: boolean\n statuses: Status[]\n entityListId?: string | undefined\n isSlideOut?: boolean\n versionReview?: boolean\n}\n\nexport const Feed = ({\n disabled,\n readOnly,\n statuses = [],\n entityListId,\n isSlideOut,\n versionReview = false,\n}: FeedProps) => {\n const {\n projectName,\n entities,\n entityType,\n editingId,\n projectInfo,\n setEditingId,\n userName,\n activitiesData,\n isLoadingNew,\n isLoadingNextPage,\n loadNextPage,\n hasNextPage,\n users,\n feedFilter,\n setFeedFilter,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n user,\n } = useDetailsPanelContext()\n\n const isVersionsFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && c.key === 'versions' && c.value === true,\n )\n const hasActiveFilters = feedFilter.conditions?.some(\n (c) => 'key' in c && ['comments', 'checklists', 'versions', 'updates'].includes(c.key) && c.value === true,\n )\n const hasCommentLikeFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && (c.key === 'comments' || c.key === 'checklists') && c.value === true,\n )\n\n // check activities permission for commenting\n const {\n data: projectPermissions,\n isLoading: isLoadingPermissions,\n } = useGetMyProjectPermissionsQuery(\n { projectName },\n { skip: !projectName },\n )\n const isCommentRestricted =\n !user.data?.isManager &&\n !user.data?.isAdmin &&\n !isLoadingPermissions &&\n projectPermissions?.activities?.enabled &&\n !projectPermissions?.activities?.activities?.includes('comment')\n\n // hide comment input for specific filters or when restricted by permissions\n const hideCommentInput = isCommentRestricted || (hasActiveFilters && !hasCommentLikeFilter)\n\n const activitiesWithMergedAnnotations = useMemo(\n () => mergeAnnotationAttachments(activitiesData),\n [activitiesData],\n )\n\n useEffect(() => {\n if (!activitiesWithMergedAnnotations.length) {\n setFeedAnnotations([])\n }\n\n const annotations = activitiesWithMergedAnnotations\n .map((activity) =>\n activity.activityData?.annotations?.map((a: SavedAnnotationMetadata) => ({\n ...a,\n activityId: activity.activityId,\n })),\n )\n .filter(Boolean)\n .flat()\n\n setFeedAnnotations(annotations)\n }, [activitiesWithMergedAnnotations])\n\n // do any transformation on activities data\n // 1. status change activities, attach status data based on projectName\n // 2. reverse the order\n // 3. is this activity from the current user?\n const transformedActivitiesData = useTransformActivities(\n // @ts-ignore\n activitiesWithMergedAnnotations,\n users,\n projectInfo,\n entityType,\n userName,\n feedFilter,\n ) as any[]\n\n // REFS\n const feedRef = useRef(null)\n // const commentInputRef = useRef(null)\n\n // scroll by height of comment input when it opens or closes\n useScrollOnInputOpen({ feedRef, isInputOpen: editingId === FEED_NEW_COMMENT, height: 93 })\n\n // save scroll position of a feed\n useSaveScrollPos({\n entities,\n feedRef,\n filter: feedFilter,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew || isLoadingNextPage,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n activities: activitiesData,\n })\n\n // comment mutations here!\n const {\n submitComment: submitCommentMutation,\n updateComment,\n deleteComment,\n submitReview: submitReviewMutation,\n isSaving,\n } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: feedFilter,\n entityListId,\n })\n\n // wrap submitComment to scroll to bottom\n const submitComment = useCallback(\n async (value: string, files: any[] = [], data: any = {}) => {\n await submitCommentMutation(value, files, data)\n // scroll to bottom (scrollTop 0 is bottom because of column-reverse)\n if (feedRef.current) {\n ;(feedRef.current as any).scrollTo({ top: 0 })\n }\n },\n [submitCommentMutation, feedRef],\n )\n\n const submitReview = useCallback(async (feedback: VersionReviewFeedback) => {\n await submitReviewMutation(feedback)\n }, [submitReviewMutation])\n\n // When a checkbox is clicked, update the body to add/remove \"x\" in [ ] markdown\n // Then update comment with new body\n const handleCommentChecked = (e: React.ChangeEvent<HTMLInputElement>, activity: Activity) => {\n const target = e?.target\n if (!target || !activity) return console.log('no target or activity')\n\n // the value that it's changing to\n const checked: boolean = target.checked\n const currentMarkdown: string = checked ? '[ ]' : '[x]'\n const newMarkdown: string = checked ? '[x]' : '[ ]'\n\n const { body } = activity\n\n // based on all li elements in the whole className 'comment-body' with className 'task-list-item'\n // find the index of the task that was checked\n const taskIndex: number = Array.from(\n target.closest('.comment-body')?.querySelectorAll('.task-list-item') || [],\n ).findIndex((li: Element) => li === target.closest('li'))\n\n let replaceIndex: number = taskIndex\n\n // count the number of current markdowns in the body\n const allMarkdowns: string[] = body.match(/\\[.\\]/g) || []\n\n allMarkdowns.forEach((markdown: string, index: number) => {\n // does it match the current markdown?\n if (markdown !== currentMarkdown && index < taskIndex) replaceIndex--\n })\n\n // now find the indexes of the current markdown to replace\n const indexesOfCurrentMarkdownInBody: number[] = []\n let index: number = -1\n while ((index = body.indexOf(currentMarkdown, index + 1)) > -1) {\n indexesOfCurrentMarkdownInBody.push(index)\n }\n\n const indexToReplaceInBody: number | undefined = indexesOfCurrentMarkdownInBody[replaceIndex]\n if (indexToReplaceInBody === undefined) return\n\n const endReplaceIndex: number = indexToReplaceInBody + currentMarkdown.length\n\n // replace the current markdown with the new markdown\n const newBody: string =\n body.slice(0, indexToReplaceInBody) + newMarkdown + body.slice(endReplaceIndex)\n\n if (!newBody) return\n\n updateComment(activity, newBody, activity.files)\n }\n\n const handleRefClick = (ref: {\n entityId: string\n entityType: DetailsPanelEntityType\n activityId: string\n }) => {\n const { entityId, entityType, activityId } = ref\n const supportedTypes = ['version', 'task', 'folder']\n\n if (!entityType || !supportedTypes.includes(entityType))\n return console.log('Entity type not supported yet')\n\n if (!entityId || !entityType || !projectName) return console.log('No entity id or type found')\n\n // open the slide out\n openSlideOut({ entityId, entityType, projectName })\n // set highlighted activity\n setHighlightedActivities([activityId])\n }\n\n const handleFileExpand = ({ index, activityId }: { index: number; activityId: string }) => {\n const previewableFiles = Object.values(transformedActivitiesData)\n .reverse()\n .filter((a) => a.activityType == 'comment')\n .map((a) => ({\n id: a.activityId,\n files: a.files.filter((file: any) => isFilePreviewable(file.mime, file.ext)),\n }))\n .filter((a) => a.files.length > 0)\n\n // open image callback\n onOpenImage?.({ files: previewableFiles, activityId, index, projectName })\n }\n\n const loadingPlaceholders = useMemo(() => getLoadingPlaceholders(10), [])\n\n const lastVersionReview = useLastVersionReview({\n projectName,\n enabled: versionReview,\n entityIds: entities.map(e => e.id),\n activities: transformedActivitiesData,\n loadingActivities: isLoadingNew,\n userName,\n })\n\n let warningMessage\n\n return (\n <>\n <Styled.FeedContainer className=\"feed\">\n {warningMessage && (\n <Styled.Warning>\n <Icon icon=\"info\" />\n {warningMessage}\n </Styled.Warning>\n )}\n <TabHeaderAndFilters\n label=\"Activity Feed\"\n filters={feedFilters}\n currentFilter={feedFilter}\n onFilterChange={setFeedFilter}\n isLoading={isLoadingNew}\n />\n <Styled.FeedContent ref={feedRef} className={clsx({ loading: isLoadingNew }, 'no-shimmer')}>\n {isLoadingNew\n ? loadingPlaceholders\n : transformedActivitiesData.map((activity) => (\n <ActivityItem\n key={activity.activityId}\n activity={activity}\n onCheckChange={handleCommentChecked}\n onDelete={deleteComment}\n onUpdate={async (value, files, _refs, data) =>\n await updateComment(activity, value, files, data)\n }\n projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={handleRefClick}\n createdAts={entities.map((e) => e.createdAt)}\n onFileExpand={handleFileExpand}\n showOrigin={entities.length > 1}\n filter={feedFilter}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n isSlideOut={isSlideOut}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 0 &&\n isVersionsFilter &&\n !hasCommentLikeFilter &&\n !isLoadingNew && (\n <EmptyPlaceholder message=\"No versions published yet\" icon=\"layers\" />\n )}\n {hasNextPage && loadNextPage && (\n <InView\n root={feedRef.current}\n onChange={(inView) => inView && loadNextPage()}\n rootMargin={'400px 0px 0px 0px'}\n >\n <Styled.LoadMore style={{ height: 0 }} onClick={() => loadNextPage()}>\n {isLoadingNextPage ? 'Loading more...' : 'Click to load more'}\n </Styled.LoadMore>\n </InView>\n )}\n </Styled.FeedContent>\n {!hideCommentInput && (\n <CommentInput\n initValue={null}\n onSubmit={submitComment}\n isOpen={editingId === FEED_NEW_COMMENT}\n onClose={() => setEditingId(null)}\n onOpen={() => setEditingId(FEED_NEW_COMMENT)}\n disabled={disabled}\n isLoading={isLoadingNew || !entities.length || isSaving}\n versionReview={versionReview}\n lastOwnVersionReview={lastVersionReview}\n onReview={submitReview}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["activitiesLast","feedFilters","Feed","disabled","readOnly","statuses","entityListId","isSlideOut","versionReview","projectName","entities","entityType","editingId","projectInfo","setEditingId","userName","activitiesData","isLoadingNew","isLoadingNextPage","loadNextPage","hasNextPage","users","feedFilter","setFeedFilter","useFeedContext","openSlideOut","highlightedActivities","setHighlightedActivities","onOpenImage","setFeedAnnotations","user","useDetailsPanelContext","isVersionsFilter","c","hasActiveFilters","hasCommentLikeFilter","projectPermissions","isLoadingPermissions","useGetMyProjectPermissionsQuery","hideCommentInput","activitiesWithMergedAnnotations","useMemo","mergeAnnotationAttachments","useEffect","annotations","activity","a","transformedActivitiesData","useTransformActivities","feedRef","useRef","useScrollOnInputOpen","FEED_NEW_COMMENT","useSaveScrollPos","useScrollToHighlighted","submitCommentMutation","updateComment","deleteComment","submitReviewMutation","isSaving","useCommentMutations","submitComment","useCallback","value","files","data","submitReview","feedback","handleCommentChecked","e","target","checked","currentMarkdown","newMarkdown","body","taskIndex","li","replaceIndex","markdown","index","indexesOfCurrentMarkdownInBody","indexToReplaceInBody","endReplaceIndex","newBody","handleRefClick","ref","entityId","activityId","handleFileExpand","previewableFiles","file","isFilePreviewable","loadingPlaceholders","getLoadingPlaceholders","lastVersionReview","useLastVersionReview","jsxs","Styled.FeedContainer","jsx","TabHeaderAndFilters","Styled.FeedContent","clsx","ActivityItem","_refs","EmptyPlaceholder","InView","inView","Styled.LoadMore","CommentInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Feed.es.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput, { VersionReviewFeedback } from './components/CommentInput/CommentInput'\nimport * as Styled from './Feed.styled'\nimport useCommentMutations, { Activity } from './hooks/useCommentMutations'\nimport useTransformActivities from './hooks/useTransformActivities'\nimport { InView } from 'react-intersection-observer'\nimport useSaveScrollPos from './hooks/useSaveScrollPos'\nimport useScrollOnInputOpen from './hooks/useScrollOnInputOpen'\nimport { getLoadingPlaceholders } from './feedHelpers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport useScrollToHighlighted from './hooks/useScrollToHighlighted'\nimport { isFilePreviewable } from './components/FileUploadPreview/FileUploadPreview'\nimport EmptyPlaceholder from '@shared/components/EmptyPlaceholder'\nimport { useFeedContext, FEED_NEW_COMMENT } from './context/FeedContext'\nimport { Status } from '../ProjectTreeTable/types/project'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { DetailsPanelEntityType, useGetMyProjectPermissionsQuery } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\nimport { SavedAnnotationMetadata } from '.'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { useLastVersionReview } from './hooks/useLastVersionReview'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nconst feedFilters: FilterItem<string>[] = [\n {\n id: 'comments',\n tooltip: 'Comments',\n icon: 'chat',\n },\n {\n id: 'checklists',\n tooltip: 'Checklists',\n icon: 'checklist',\n },\n {\n id: 'versions',\n tooltip: 'Published versions',\n icon: 'layers',\n },\n {\n id: 'updates',\n tooltip: 'Entity updates',\n icon: 'arrow_circle_right',\n },\n]\n\nexport type FeedProps = {\n disabled?: boolean\n readOnly: boolean\n statuses: Status[]\n entityListId?: string | undefined\n isSlideOut?: boolean\n versionReview?: boolean\n}\n\nexport const Feed = ({\n disabled,\n readOnly,\n statuses = [],\n entityListId,\n isSlideOut,\n versionReview = false,\n}: FeedProps) => {\n const {\n projectName,\n entities,\n entityType,\n editingId,\n projectInfo,\n setEditingId,\n userName,\n activitiesData,\n isLoadingNew,\n isLoadingNextPage,\n loadNextPage,\n hasNextPage,\n users,\n feedFilter,\n setFeedFilter,\n isGuest,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n user,\n } = useDetailsPanelContext()\n\n const isVersionsFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && c.key === 'versions' && c.value === true,\n )\n const hasActiveFilters = feedFilter.conditions?.some(\n (c) => 'key' in c && ['comments', 'checklists', 'versions', 'updates'].includes(c.key) && c.value === true,\n )\n const hasCommentLikeFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && (c.key === 'comments' || c.key === 'checklists') && c.value === true,\n )\n\n // check activities permission for commenting\n const {\n data: projectPermissions,\n isLoading: isLoadingPermissions,\n } = useGetMyProjectPermissionsQuery(\n { projectName },\n { skip: !projectName },\n )\n const isCommentRestricted =\n !user.data?.isManager &&\n !user.data?.isAdmin &&\n !isLoadingPermissions &&\n projectPermissions?.activities?.enabled &&\n !projectPermissions?.activities?.activities?.includes('comment')\n\n // hide comment input for specific filters or when restricted by permissions\n const hideCommentInput = isCommentRestricted || (hasActiveFilters && !hasCommentLikeFilter)\n\n const activitiesWithMergedAnnotations = useMemo(\n () => mergeAnnotationAttachments(activitiesData),\n [activitiesData],\n )\n\n useEffect(() => {\n if (!activitiesWithMergedAnnotations.length) {\n setFeedAnnotations([])\n }\n\n const annotations = activitiesWithMergedAnnotations\n .map((activity) =>\n activity.activityData?.annotations?.map((a: SavedAnnotationMetadata) => ({\n ...a,\n activityId: activity.activityId,\n })),\n )\n .filter(Boolean)\n .flat()\n\n setFeedAnnotations(annotations)\n }, [activitiesWithMergedAnnotations])\n\n // do any transformation on activities data\n // 1. status change activities, attach status data based on projectName\n // 2. reverse the order\n // 3. is this activity from the current user?\n const transformedActivitiesData = useTransformActivities(\n // @ts-ignore\n activitiesWithMergedAnnotations,\n users,\n projectInfo,\n entityType,\n userName,\n feedFilter,\n ) as any[]\n\n // REFS\n const feedRef = useRef(null)\n // const commentInputRef = useRef(null)\n\n // scroll by height of comment input when it opens or closes\n useScrollOnInputOpen({ feedRef, isInputOpen: editingId === FEED_NEW_COMMENT, height: 93 })\n\n // save scroll position of a feed\n useSaveScrollPos({\n entities,\n feedRef,\n filter: feedFilter,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew || isLoadingNextPage,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n activities: activitiesData,\n })\n\n // comment mutations here!\n const {\n submitComment: submitCommentMutation,\n updateComment,\n deleteComment,\n submitReview: submitReviewMutation,\n isSaving,\n } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: feedFilter,\n entityListId,\n })\n\n // wrap submitComment to scroll to bottom\n const submitComment = useCallback(\n async (value: string, files: any[] = [], data: any = {}) => {\n await submitCommentMutation(value, files, data)\n // scroll to bottom (scrollTop 0 is bottom because of column-reverse)\n if (feedRef.current) {\n ;(feedRef.current as any).scrollTo({ top: 0 })\n }\n },\n [submitCommentMutation, feedRef],\n )\n\n const submitReview = useCallback(async (feedback: VersionReviewFeedback) => {\n await submitReviewMutation(feedback)\n }, [submitReviewMutation])\n\n // When a checkbox is clicked, update the body to add/remove \"x\" in [ ] markdown\n // Then update comment with new body\n const handleCommentChecked = (e: React.ChangeEvent<HTMLInputElement>, activity: Activity) => {\n const target = e?.target\n if (!target || !activity) return console.log('no target or activity')\n\n // the value that it's changing to\n const checked: boolean = target.checked\n const currentMarkdown: string = checked ? '[ ]' : '[x]'\n const newMarkdown: string = checked ? '[x]' : '[ ]'\n\n const { body } = activity\n\n // based on all li elements in the whole className 'comment-body' with className 'task-list-item'\n // find the index of the task that was checked\n const taskIndex: number = Array.from(\n target.closest('.comment-body')?.querySelectorAll('.task-list-item') || [],\n ).findIndex((li: Element) => li === target.closest('li'))\n\n let replaceIndex: number = taskIndex\n\n // count the number of current markdowns in the body\n const allMarkdowns: string[] = body.match(/\\[.\\]/g) || []\n\n allMarkdowns.forEach((markdown: string, index: number) => {\n // does it match the current markdown?\n if (markdown !== currentMarkdown && index < taskIndex) replaceIndex--\n })\n\n // now find the indexes of the current markdown to replace\n const indexesOfCurrentMarkdownInBody: number[] = []\n let index: number = -1\n while ((index = body.indexOf(currentMarkdown, index + 1)) > -1) {\n indexesOfCurrentMarkdownInBody.push(index)\n }\n\n const indexToReplaceInBody: number | undefined = indexesOfCurrentMarkdownInBody[replaceIndex]\n if (indexToReplaceInBody === undefined) return\n\n const endReplaceIndex: number = indexToReplaceInBody + currentMarkdown.length\n\n // replace the current markdown with the new markdown\n const newBody: string =\n body.slice(0, indexToReplaceInBody) + newMarkdown + body.slice(endReplaceIndex)\n\n if (!newBody) return\n\n updateComment(activity, newBody, activity.files)\n }\n\n const handleRefClick = (ref: {\n entityId: string\n entityType: DetailsPanelEntityType\n activityId: string\n }) => {\n const { entityId, entityType, activityId } = ref\n const supportedTypes = ['version', 'task', 'folder']\n\n if (!entityType || !supportedTypes.includes(entityType))\n return console.log('Entity type not supported yet')\n\n if (!entityId || !entityType || !projectName) return console.log('No entity id or type found')\n\n // open the slide out\n openSlideOut({ entityId, entityType, projectName })\n // set highlighted activity\n setHighlightedActivities([activityId])\n }\n\n const handleFileExpand = ({ index, activityId }: { index: number; activityId: string }) => {\n const previewableFiles = Object.values(transformedActivitiesData)\n .reverse()\n .filter((a) => a.activityType == 'comment')\n .map((a) => ({\n id: a.activityId,\n files: a.files.filter((file: any) => isFilePreviewable(file.mime, file.ext)),\n }))\n .filter((a) => a.files.length > 0)\n\n // open image callback\n onOpenImage?.({ files: previewableFiles, activityId, index, projectName })\n }\n\n const loadingPlaceholders = useMemo(() => getLoadingPlaceholders(10), [])\n\n const lastVersionReview = useLastVersionReview({\n projectName,\n enabled: versionReview,\n entityIds: entities.map(e => e.id),\n activities: transformedActivitiesData,\n loadingActivities: isLoadingNew,\n userName,\n })\n\n let warningMessage\n\n return (\n <>\n <Styled.FeedContainer className=\"feed\">\n {warningMessage && (\n <Styled.Warning>\n <Icon icon=\"info\" />\n {warningMessage}\n </Styled.Warning>\n )}\n <TabHeaderAndFilters\n label=\"Activity Feed\"\n filters={feedFilters}\n currentFilter={feedFilter}\n onFilterChange={setFeedFilter}\n isLoading={isLoadingNew}\n />\n <Styled.FeedContent ref={feedRef} className={clsx({ loading: isLoadingNew }, 'no-shimmer')}>\n {isLoadingNew\n ? loadingPlaceholders\n : transformedActivitiesData.map((activity) => (\n <ActivityItem\n key={activity.activityId}\n activity={activity}\n onCheckChange={handleCommentChecked}\n onDelete={deleteComment}\n onUpdate={async (value, files, _refs, data) =>\n await updateComment(activity, value, files, data)\n }\n projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={handleRefClick}\n createdAts={entities.map((e) => e.createdAt)}\n onFileExpand={handleFileExpand}\n showOrigin={entities.length > 1}\n filter={feedFilter}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n isSlideOut={isSlideOut}\n isGuest={isGuest}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 0 &&\n isVersionsFilter &&\n !hasCommentLikeFilter &&\n !isLoadingNew && (\n <EmptyPlaceholder message=\"No versions published yet\" icon=\"layers\" />\n )}\n {hasNextPage && loadNextPage && (\n <InView\n root={feedRef.current}\n onChange={(inView) => inView && loadNextPage()}\n rootMargin={'400px 0px 0px 0px'}\n >\n <Styled.LoadMore style={{ height: 0 }} onClick={() => loadNextPage()}>\n {isLoadingNextPage ? 'Loading more...' : 'Click to load more'}\n </Styled.LoadMore>\n </InView>\n )}\n </Styled.FeedContent>\n {!hideCommentInput && (\n <CommentInput\n initValue={null}\n onSubmit={submitComment}\n isOpen={editingId === FEED_NEW_COMMENT}\n onClose={() => setEditingId(null)}\n onOpen={() => setEditingId(FEED_NEW_COMMENT)}\n disabled={disabled}\n isLoading={isLoadingNew || !entities.length || isSaving}\n versionReview={versionReview}\n lastOwnVersionReview={lastVersionReview}\n onReview={submitReview}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["activitiesLast","feedFilters","Feed","disabled","readOnly","statuses","entityListId","isSlideOut","versionReview","projectName","entities","entityType","editingId","projectInfo","setEditingId","userName","activitiesData","isLoadingNew","isLoadingNextPage","loadNextPage","hasNextPage","users","feedFilter","setFeedFilter","isGuest","useFeedContext","openSlideOut","highlightedActivities","setHighlightedActivities","onOpenImage","setFeedAnnotations","user","useDetailsPanelContext","isVersionsFilter","c","hasActiveFilters","hasCommentLikeFilter","projectPermissions","isLoadingPermissions","useGetMyProjectPermissionsQuery","hideCommentInput","activitiesWithMergedAnnotations","useMemo","mergeAnnotationAttachments","useEffect","annotations","activity","a","transformedActivitiesData","useTransformActivities","feedRef","useRef","useScrollOnInputOpen","FEED_NEW_COMMENT","useSaveScrollPos","useScrollToHighlighted","submitCommentMutation","updateComment","deleteComment","submitReviewMutation","isSaving","useCommentMutations","submitComment","useCallback","value","files","data","submitReview","feedback","handleCommentChecked","e","target","checked","currentMarkdown","newMarkdown","body","taskIndex","li","replaceIndex","markdown","index","indexesOfCurrentMarkdownInBody","indexToReplaceInBody","endReplaceIndex","newBody","handleRefClick","ref","entityId","activityId","handleFileExpand","previewableFiles","file","isFilePreviewable","loadingPlaceholders","getLoadingPlaceholders","lastVersionReview","useLastVersionReview","jsxs","Styled.FeedContainer","jsx","TabHeaderAndFilters","Styled.FeedContent","clsx","ActivityItem","_refs","EmptyPlaceholder","InView","inView","Styled.LoadMore","CommentInput"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const R=require("../../../../../_virtual/jsx-runtime.cjs.js"),s=require("date-fns"),h=require("clsx"),x=require("styled-components"),o=require("react"),q=require("@ynput/ayon-react-components"),f=1e4,_=x.span`
|
|
2
2
|
margin-left: auto;
|
|
3
3
|
color: var(--md-sys-color-outline);
|
|
4
4
|
user-select: none;
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
min-width: 0;
|
|
12
12
|
max-width: fit-content;
|
|
13
13
|
|
|
14
|
-
${
|
|
15
|
-
`,
|
|
14
|
+
${q.theme.bodySmall}
|
|
15
|
+
`,M=n=>{let e=s.formatDistanceToNow(n,{addSuffix:!0});return e=e.replace("about",""),e=e.replace("minutes","mins"),e=e.replace("minute","min"),e=e.replace(" ago",""),s.isSameMinute(n,new Date)&&(e="Just now"),e},b=({date:n,isExact:e,exactTooltip:i=!1,...S})=>{const[u,l]=o.useState(!0),[a,w]=o.useState(new Date);if(!n)return null;const t=new Date(n);if(!s.isValid(t))return null;o.useEffect(()=>{const F=setInterval(()=>w(new Date),f);return()=>clearInterval(F)},[]);const c=s.isToday(t),D=s.isSameYear(t,a),m=s.isSameDay(t,new Date(a.setDate(a.getDate()-1))),z=s.isSameWeek(t,a),p=s.isSameMinute(t,a),E=m?"":D?z?"E":"MMM d":"MMM d yyyy",d="h:mm a",g=o.useMemo(()=>M(t),[t]),y=o.useMemo(()=>c?s.format(t,`${E}, ${d}`):s.format(t,`EEEE, dd MMM yyyy ${d}`),[t,c]);let r=u&&!e?g:y;m&&u&&!e&&(r=`Yesterday${r}`),p&&(r="Just now");const v=()=>{l(!u)};return R.jsxRuntimeExports.jsx(_,{className:h("date"),...S,onClick:v,onMouseOver:()=>!i&&l(!1),onMouseOut:()=>!i&&l(!0),"data-tooltip":i?y:null,"data-tooltip-delay":0,children:r})};exports.REFRESH_INTERVAL_MS=f;exports.default=b;exports.getFuzzyDate=M;
|
|
16
16
|
//# sourceMappingURL=ActivityDate.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityDate.cjs.js","sources":["../../../../../../src/containers/Feed/components/ActivityDate.tsx"],"sourcesContent":["import {\n format,\n formatDistanceToNow,\n isValid,\n isToday,\n isSameYear,\n isSameDay,\n isSameWeek,\n isSameMinute,\n} from 'date-fns'\nimport clsx from 'clsx'\nimport styled from 'styled-components'\nimport { useEffect, useState } from 'react'\nimport { theme } from '@ynput/ayon-react-components'\n\nexport const REFRESH_INTERVAL_MS = 10_000\n\nconst DateStyled = styled.span`\n margin-left: auto;\n color: var(--md-sys-color-outline);\n user-select: none;\n white-space: nowrap;\n display: flex;\n align-items: center;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 3;\n min-width: 0;\n max-width: fit-content;\n\n ${theme.bodySmall}\n`\n\nexport const getFuzzyDate = (date: Date) => {\n let fuzzyDate = formatDistanceToNow(date, { addSuffix: true })\n\n // remove 'about' from the string\n fuzzyDate = fuzzyDate.replace('about', '')\n // replace minutes with min\n fuzzyDate = fuzzyDate.replace('minutes', 'mins')\n fuzzyDate = fuzzyDate.replace('minute', 'min')\n // remove the word ' ago'\n fuzzyDate = fuzzyDate.replace(' ago', '')\n\n // if date is less than a minute ago, return 'Just now'\n if (isSameMinute(date, new Date())) fuzzyDate = 'Just now'\n\n return fuzzyDate\n}\n\ninterface ActivityDateProps extends React.HTMLAttributes<HTMLElement> {\n date?: string\n isExact?: boolean\n}\n\nconst ActivityDate = ({ date, isExact, ...props }: ActivityDateProps) => {\n const [isFuzzy, setIsFuzzy] = useState(true)\n const [now, setNow] = useState(new Date())\n if (!date) return null\n\n const dateObj = new Date(date)\n if (!isValid(dateObj)) return null\n\n useEffect(() => {\n const interval = setInterval(\n () => setNow(new Date()),\n REFRESH_INTERVAL_MS,\n )\n\n return () => clearInterval(interval)\n }, [])\n\n // is date over a day old?\n const today = isToday(dateObj)\n const sameYear = isSameYear(dateObj, now)\n const yesterday = isSameDay(dateObj, new Date(now.setDate(now.getDate() - 1)))\n const sameWeek = isSameWeek(dateObj, now)\n const sameMin = isSameMinute(dateObj, now)\n\n const dateFormat = yesterday ? '' : sameYear ? (sameWeek ? 'E' : 'MMM d') : 'MMM d yyyy'\n const timeFormat = 'h:mm a'\n\n
|
|
1
|
+
{"version":3,"file":"ActivityDate.cjs.js","sources":["../../../../../../src/containers/Feed/components/ActivityDate.tsx"],"sourcesContent":["import {\n format,\n formatDistanceToNow,\n isValid,\n isToday,\n isSameYear,\n isSameDay,\n isSameWeek,\n isSameMinute,\n} from 'date-fns'\nimport clsx from 'clsx'\nimport styled from 'styled-components'\nimport { useEffect, useMemo, useState } from 'react'\nimport { theme } from '@ynput/ayon-react-components'\n\nexport const REFRESH_INTERVAL_MS = 10_000\n\nconst DateStyled = styled.span`\n margin-left: auto;\n color: var(--md-sys-color-outline);\n user-select: none;\n white-space: nowrap;\n display: flex;\n align-items: center;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 3;\n min-width: 0;\n max-width: fit-content;\n\n ${theme.bodySmall}\n`\n\nexport const getFuzzyDate = (date: Date) => {\n let fuzzyDate = formatDistanceToNow(date, { addSuffix: true })\n\n // remove 'about' from the string\n fuzzyDate = fuzzyDate.replace('about', '')\n // replace minutes with min\n fuzzyDate = fuzzyDate.replace('minutes', 'mins')\n fuzzyDate = fuzzyDate.replace('minute', 'min')\n // remove the word ' ago'\n fuzzyDate = fuzzyDate.replace(' ago', '')\n\n // if date is less than a minute ago, return 'Just now'\n if (isSameMinute(date, new Date())) fuzzyDate = 'Just now'\n\n return fuzzyDate\n}\n\ninterface ActivityDateProps extends React.HTMLAttributes<HTMLElement> {\n date?: string\n isExact?: boolean\n exactTooltip?: boolean\n}\n\nconst ActivityDate = ({ date, isExact, exactTooltip = false, ...props }: ActivityDateProps) => {\n const [isFuzzy, setIsFuzzy] = useState(true)\n const [now, setNow] = useState(new Date())\n if (!date) return null\n\n const dateObj = new Date(date)\n if (!isValid(dateObj)) return null\n\n useEffect(() => {\n const interval = setInterval(\n () => setNow(new Date()),\n REFRESH_INTERVAL_MS,\n )\n\n return () => clearInterval(interval)\n }, [])\n\n // is date over a day old?\n const today = isToday(dateObj)\n const sameYear = isSameYear(dateObj, now)\n const yesterday = isSameDay(dateObj, new Date(now.setDate(now.getDate() - 1)))\n const sameWeek = isSameWeek(dateObj, now)\n const sameMin = isSameMinute(dateObj, now)\n\n const dateFormat = yesterday ? '' : sameYear ? (sameWeek ? 'E' : 'MMM d') : 'MMM d yyyy'\n const timeFormat = 'h:mm a'\n\n const fuzzyDate = useMemo(() => getFuzzyDate(dateObj), [dateObj])\n const exactDate = useMemo(() => {\n if (today) return format(dateObj, `${dateFormat}, ${timeFormat}`)\n return format(dateObj, `EEEE, dd MMM yyyy ${timeFormat}`)\n }, [dateObj, today])\n\n let dateString =\n isFuzzy && !isExact\n ? fuzzyDate\n : exactDate\n\n if (yesterday && isFuzzy && !isExact) dateString = `Yesterday${dateString}`\n\n // if less than a minute ago overwrite the date string\n if (sameMin) dateString = 'Just now'\n\n const toggleFuzzy = () => {\n setIsFuzzy(!isFuzzy)\n }\n\n return (\n <DateStyled\n className={clsx('date')}\n {...props}\n onClick={toggleFuzzy}\n onMouseOver={() => !exactTooltip && setIsFuzzy(false)}\n onMouseOut={() => !exactTooltip && setIsFuzzy(true)}\n data-tooltip={exactTooltip ? exactDate : null}\n data-tooltip-delay={0}\n >\n {dateString}\n </DateStyled>\n )\n}\n\nexport default ActivityDate\n"],"names":["REFRESH_INTERVAL_MS","DateStyled","styled","theme","getFuzzyDate","date","fuzzyDate","formatDistanceToNow","isSameMinute","ActivityDate","isExact","exactTooltip","props","isFuzzy","setIsFuzzy","useState","now","setNow","dateObj","isValid","useEffect","interval","today","isToday","sameYear","isSameYear","yesterday","isSameDay","sameWeek","isSameWeek","sameMin","dateFormat","timeFormat","useMemo","exactDate","format","dateString","toggleFuzzy","jsx","clsx"],"mappings":"8SAeaA,EAAsB,IAE7BC,EAAaC,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAatBC,EAAAA,MAAM,SAAS;AAAA,EAGNC,EAAgBC,GAAe,CAC1C,IAAIC,EAAYC,EAAAA,oBAAoBF,EAAM,CAAE,UAAW,GAAM,EAG7D,OAAAC,EAAYA,EAAU,QAAQ,QAAS,EAAE,EAEzCA,EAAYA,EAAU,QAAQ,UAAW,MAAM,EAC/CA,EAAYA,EAAU,QAAQ,SAAU,KAAK,EAE7CA,EAAYA,EAAU,QAAQ,OAAQ,EAAE,EAGpCE,EAAAA,aAAaH,EAAM,IAAI,IAAM,IAAGC,EAAY,YAEzCA,CACT,EAQMG,EAAe,CAAC,CAAE,KAAAJ,EAAM,QAAAK,EAAS,aAAAC,EAAe,GAAO,GAAGC,KAA+B,CAC7F,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAI,EACrC,CAACC,EAAKC,CAAM,EAAIF,EAAAA,SAAS,IAAI,IAAM,EACzC,GAAI,CAACV,EAAM,OAAO,KAElB,MAAMa,EAAU,IAAI,KAAKb,CAAI,EAC7B,GAAI,CAACc,EAAAA,QAAQD,CAAO,EAAG,OAAO,KAE9BE,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YACf,IAAMJ,EAAO,IAAI,IAAM,EACvBjB,CAAA,EAGF,MAAO,IAAM,cAAcqB,CAAQ,CACrC,EAAG,CAAA,CAAE,EAGL,MAAMC,EAAQC,EAAAA,QAAQL,CAAO,EACvBM,EAAWC,EAAAA,WAAWP,EAASF,CAAG,EAClCU,EAAYC,EAAAA,UAAUT,EAAS,IAAI,KAAKF,EAAI,QAAQA,EAAI,UAAY,CAAC,CAAC,CAAC,EACvEY,EAAWC,EAAAA,WAAWX,EAASF,CAAG,EAClCc,EAAUtB,EAAAA,aAAaU,EAASF,CAAG,EAEnCe,EAAaL,EAAY,GAAKF,EAAYI,EAAW,IAAM,QAAW,aACtEI,EAAa,SAEb1B,EAAY2B,EAAAA,QAAQ,IAAM7B,EAAac,CAAO,EAAG,CAACA,CAAO,CAAC,EAC1DgB,EAAYD,EAAAA,QAAQ,IACpBX,EAAca,EAAAA,OAAOjB,EAAS,GAAGa,CAAU,KAAKC,CAAU,EAAE,EACzDG,EAAAA,OAAOjB,EAAS,qBAAqBc,CAAU,EAAE,EACvD,CAACd,EAASI,CAAK,CAAC,EAEnB,IAAIc,EACFvB,GAAW,CAACH,EACRJ,EACA4B,EAEFR,GAAab,GAAW,CAACH,IAAS0B,EAAa,YAAYA,CAAU,IAGrEN,IAASM,EAAa,YAE1B,MAAMC,EAAc,IAAM,CACxBvB,EAAW,CAACD,CAAO,CACrB,EAEA,OACEyB,EAAAA,kBAAAA,IAACrC,EAAA,CACC,UAAWsC,EAAK,MAAM,EACrB,GAAG3B,EACJ,QAASyB,EACT,YAAa,IAAM,CAAC1B,GAAgBG,EAAW,EAAK,EACpD,WAAY,IAAM,CAACH,GAAgBG,EAAW,EAAI,EAClD,eAAcH,EAAeuB,EAAY,KACzC,qBAAoB,EAEnB,SAAAE,CAAA,CAAA,CAGP"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { j as x } from "../../../../../_virtual/jsx-runtime.es.js";
|
|
2
|
-
import { isValid as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { useState as
|
|
6
|
-
import { theme as
|
|
7
|
-
const
|
|
2
|
+
import { isValid as F, isToday as $, isSameYear as j, isSameDay as k, isSameWeek as I, isSameMinute as p, format as f, formatDistanceToNow as N } from "date-fns";
|
|
3
|
+
import R from "clsx";
|
|
4
|
+
import b from "styled-components";
|
|
5
|
+
import { useState as d, useEffect as O, useMemo as y } from "react";
|
|
6
|
+
import { theme as Y } from "@ynput/ayon-react-components";
|
|
7
|
+
const A = 1e4, J = b.span`
|
|
8
8
|
margin-left: auto;
|
|
9
9
|
color: var(--md-sys-color-outline);
|
|
10
10
|
user-select: none;
|
|
@@ -17,43 +17,45 @@ const R = 1e4, b = k.span`
|
|
|
17
17
|
min-width: 0;
|
|
18
18
|
max-width: fit-content;
|
|
19
19
|
|
|
20
|
-
${
|
|
21
|
-
`,
|
|
22
|
-
let e =
|
|
23
|
-
return e = e.replace("about", ""), e = e.replace("minutes", "mins"), e = e.replace("minute", "min"), e = e.replace(" ago", ""),
|
|
24
|
-
},
|
|
25
|
-
const [
|
|
26
|
-
if (!
|
|
27
|
-
const t = new Date(
|
|
28
|
-
if (!
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
() =>
|
|
32
|
-
|
|
20
|
+
${Y.bodySmall}
|
|
21
|
+
`, V = (a) => {
|
|
22
|
+
let e = N(a, { addSuffix: !0 });
|
|
23
|
+
return e = e.replace("about", ""), e = e.replace("minutes", "mins"), e = e.replace("minute", "min"), e = e.replace(" ago", ""), p(a, /* @__PURE__ */ new Date()) && (e = "Just now"), e;
|
|
24
|
+
}, q = ({ date: a, isExact: e, exactTooltip: n = !1, ...w }) => {
|
|
25
|
+
const [r, i] = d(!0), [o, D] = d(/* @__PURE__ */ new Date());
|
|
26
|
+
if (!a) return null;
|
|
27
|
+
const t = new Date(a);
|
|
28
|
+
if (!F(t)) return null;
|
|
29
|
+
O(() => {
|
|
30
|
+
const v = setInterval(
|
|
31
|
+
() => D(/* @__PURE__ */ new Date()),
|
|
32
|
+
A
|
|
33
33
|
);
|
|
34
|
-
return () => clearInterval(
|
|
34
|
+
return () => clearInterval(v);
|
|
35
35
|
}, []);
|
|
36
|
-
const
|
|
37
|
-
let
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
36
|
+
const l = $(t), M = j(t, o), m = k(t, new Date(o.setDate(o.getDate() - 1))), z = I(t, o), S = p(t, o), E = m ? "" : M ? z ? "E" : "MMM d" : "MMM d yyyy", u = "h:mm a", g = y(() => V(t), [t]), c = y(() => l ? f(t, `${E}, ${u}`) : f(t, `EEEE, dd MMM yyyy ${u}`), [t, l]);
|
|
37
|
+
let s = r && !e ? g : c;
|
|
38
|
+
m && r && !e && (s = `Yesterday${s}`), S && (s = "Just now");
|
|
39
|
+
const h = () => {
|
|
40
|
+
i(!r);
|
|
41
41
|
};
|
|
42
42
|
return /* @__PURE__ */ x.jsx(
|
|
43
|
-
|
|
43
|
+
J,
|
|
44
44
|
{
|
|
45
|
-
className:
|
|
46
|
-
...
|
|
47
|
-
onClick:
|
|
48
|
-
onMouseOver: () =>
|
|
49
|
-
onMouseOut: () =>
|
|
50
|
-
|
|
45
|
+
className: R("date"),
|
|
46
|
+
...w,
|
|
47
|
+
onClick: h,
|
|
48
|
+
onMouseOver: () => !n && i(!1),
|
|
49
|
+
onMouseOut: () => !n && i(!0),
|
|
50
|
+
"data-tooltip": n ? c : null,
|
|
51
|
+
"data-tooltip-delay": 0,
|
|
52
|
+
children: s
|
|
51
53
|
}
|
|
52
54
|
);
|
|
53
55
|
};
|
|
54
56
|
export {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
A as REFRESH_INTERVAL_MS,
|
|
58
|
+
q as default,
|
|
59
|
+
V as getFuzzyDate
|
|
58
60
|
};
|
|
59
61
|
//# sourceMappingURL=ActivityDate.es.js.map
|