strapi-plugin-i-relate-to-this 0.0.0 → 0.1.0
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/README.md +1 -1
- package/dist/admin/index.js +30 -16
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +32 -18
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/index.js +5 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +5 -4
- package/dist/server/index.mjs.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ Currently, I have been focussing on getting the data from the db. The UI isn't p
|
|
|
20
20
|
|
|
21
21
|
## TODO
|
|
22
22
|
|
|
23
|
-
-
|
|
23
|
+
- Improve the UI
|
|
24
24
|
- Maybe I should not auto-load the list, but have a button that requests it. (there's a lot of db queries happening to get this data)
|
|
25
25
|
|
|
26
26
|
## Related issues
|
package/dist/admin/index.js
CHANGED
|
@@ -5,12 +5,19 @@ const reactIntl = require("react-intl");
|
|
|
5
5
|
const reactRouterDom = require("react-router-dom");
|
|
6
6
|
const designSystem = require("@strapi/design-system");
|
|
7
7
|
const admin = require("@strapi/strapi/admin");
|
|
8
|
+
const ConditionalTooltip = ({ isShown, label, children }) => {
|
|
9
|
+
if (isShown) {
|
|
10
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { label, children });
|
|
11
|
+
}
|
|
12
|
+
return children;
|
|
13
|
+
};
|
|
8
14
|
const List = () => {
|
|
9
15
|
const { formatMessage } = reactIntl.useIntl();
|
|
10
16
|
const { id, slug } = reactRouterDom.useParams();
|
|
11
17
|
const [params] = reactRouterDom.useSearchParams();
|
|
12
18
|
const { toggleNotification } = admin.useNotification();
|
|
13
|
-
const [items, setItems] = react.useState(
|
|
19
|
+
const [items, setItems] = react.useState(null);
|
|
20
|
+
const [loaded, setLoaded] = react.useState(false);
|
|
14
21
|
const status = params.get("status") || "draft";
|
|
15
22
|
const getter = react.useCallback(async () => {
|
|
16
23
|
const { get } = admin.getFetchClient();
|
|
@@ -28,6 +35,7 @@ const List = () => {
|
|
|
28
35
|
});
|
|
29
36
|
}
|
|
30
37
|
setItems(response.data.items);
|
|
38
|
+
setLoaded(true);
|
|
31
39
|
return null;
|
|
32
40
|
}, [formatMessage, id, toggleNotification, slug, status, setItems]);
|
|
33
41
|
react.useEffect(() => {
|
|
@@ -35,35 +43,41 @@ const List = () => {
|
|
|
35
43
|
getter();
|
|
36
44
|
}
|
|
37
45
|
}, [id, getter]);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
if (!loaded) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
if (!items) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return Object.entries(items).map(([contentTypeTitle, entries]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
53
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { style: { paddingBottom: "0.5rem" }, children: contentTypeTitle }),
|
|
54
|
+
entries.map(({
|
|
41
55
|
documentId,
|
|
42
56
|
title,
|
|
43
57
|
uid,
|
|
44
|
-
contentTypeDisplayName,
|
|
45
58
|
isPublished
|
|
46
|
-
}) => /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
47
|
-
designSystem.
|
|
59
|
+
}) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: { paddingBottom: "0.5rem" }, children: /* @__PURE__ */ jsxRuntime.jsx(ConditionalTooltip, { isShown: !isPublished, label: `Current entry is not linked to the published version of ${title}, please publish ${title} to publish the relation`, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
60
|
+
designSystem.Button,
|
|
48
61
|
{
|
|
49
|
-
|
|
62
|
+
variant: !isPublished ? "danger" : "tertiary",
|
|
63
|
+
tag: reactRouterDom.Link,
|
|
64
|
+
to: { pathname: `/content-manager/collection-types/${uid}/${documentId}` },
|
|
50
65
|
children: [
|
|
51
66
|
!isPublished && "⚠",
|
|
52
67
|
" ",
|
|
53
|
-
contentTypeDisplayName,
|
|
54
|
-
": ",
|
|
55
68
|
title || documentId
|
|
56
69
|
]
|
|
57
70
|
}
|
|
58
|
-
) }, documentId))
|
|
59
|
-
] });
|
|
71
|
+
) }) }, documentId))
|
|
72
|
+
] }));
|
|
60
73
|
};
|
|
74
|
+
const Panel = ({ model, documentId, document }) => ({
|
|
75
|
+
title: "Relations to this entry",
|
|
76
|
+
content: /* @__PURE__ */ jsxRuntime.jsx(List, {})
|
|
77
|
+
});
|
|
61
78
|
const index = {
|
|
62
79
|
bootstrap(app) {
|
|
63
|
-
app.getPlugin("content-manager").
|
|
64
|
-
name: "it-relates-to-me-list",
|
|
65
|
-
Component: List
|
|
66
|
-
});
|
|
80
|
+
app.getPlugin("content-manager").apis.addEditViewSidePanel([Panel]);
|
|
67
81
|
},
|
|
68
82
|
register() {
|
|
69
83
|
}
|
package/dist/admin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../admin/src/components/list.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../admin/src/components/list.jsx","../../admin/src/components/panel.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { Button, Tooltip } from '@strapi/design-system';\nimport {\n getFetchClient,\n useNotification,\n} from '@strapi/strapi/admin';\nimport { Link } from 'react-router-dom';\n\nconst useThisCode = true;\n\nconst ConditionalTooltip = ({ isShown, label, children }) => {\n if (isShown) {\n return <Tooltip label={label}>{children}</Tooltip>;\n }\n\n return children;\n};\n\nconst List = () => {\n const { formatMessage } = useIntl();\n const { id, slug } = useParams();\n const [params] = useSearchParams();\n const { toggleNotification } = useNotification();\n const [items, setItems] = useState(null);\n const [loaded, setLoaded] = useState(false);\n const status = params.get('status') || 'draft';\n\n const getter = useCallback(async () => {\n const { get } = getFetchClient();\n let response;\n const endpoint = `/i-relate-to-this/list/${slug}/${id}/${status}`;\n try {\n response = await get(endpoint, { id });\n } catch (error) {\n return toggleNotification({\n type: 'warning',\n message: formatMessage({\n id: 'Failed to load list',\n defaultMessage: error,\n }),\n });\n }\n setItems(response.data.items);\n setLoaded(true);\n return null;\n }, [formatMessage, id, toggleNotification, slug, status, setItems]);\n\n useEffect(() => {\n // single types don't have an id\n // on create there are never relations\n if (useThisCode && id && id !== 'create') {\n getter();\n }\n }, [id, getter]);\n\n if (!useThisCode) {\n return null;\n }\n\n if (!loaded) {\n return null;\n }\n\n if (!items) {\n return null;\n }\n\n return Object.entries(items).map(([contentTypeTitle, entries]) => (\n <div>\n <h2 style={{ paddingBottom: '0.5rem' }}>{contentTypeTitle}</h2>\n {entries.map(({\n documentId,\n title,\n uid,\n isPublished,\n }) => (\n <div key={documentId} style={{ paddingBottom: '0.5rem' }}>\n <ConditionalTooltip isShown={!isPublished} label={`Current entry is not linked to the published version of ${title}, please publish ${title} to publish the relation`}>\n <Button\n variant={!isPublished ? 'danger' : 'tertiary'}\n tag={Link}\n to={{ pathname: `/content-manager/collection-types/${uid}/${documentId}` }}\n >\n {!isPublished && '⚠'} {title || documentId}\n </Button>\n </ConditionalTooltip>\n </div>\n ))}\n </div>\n ));\n};\n\nexport default List;\n","import List from \"./list\";\n\nconst Panel = ({ model, documentId, document }) => ({\n title: 'Relations to this entry',\n content: <List />,\n});\n\nexport default Panel;","import Panel from './components/panel';\n\nexport default {\n bootstrap(app) {\n // execute some bootstrap code\n app.getPlugin('content-manager').apis.addEditViewSidePanel([Panel]);\n },\n register() {}\n};\n"],"names":["jsx","Tooltip","useIntl","useParams","useSearchParams","useNotification","useState","useCallback","getFetchClient","useEffect","jsxs","Button","Link"],"mappings":";;;;;;;AAYA,MAAM,qBAAqB,CAAC,EAAE,SAAS,OAAO,eAAe;AAC3D,MAAI,SAAS;AACX,WAAOA,2BAAAA,IAACC,aAAAA,SAAA,EAAQ,OAAe,SAAA,CAAS;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,MAAM,OAAO,MAAM;AACjB,QAAM,EAAE,cAAA,IAAkBC,kBAAA;AAC1B,QAAM,EAAE,IAAI,KAAA,IAASC,yBAAA;AACrB,QAAM,CAAC,MAAM,IAAIC,+BAAA;AACjB,QAAM,EAAE,mBAAA,IAAuBC,sBAAA;AAC/B,QAAM,CAAC,OAAO,QAAQ,IAAIC,MAAAA,SAAS,IAAI;AACvC,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,KAAK;AAC1C,QAAM,SAAS,OAAO,IAAI,QAAQ,KAAK;AAEvC,QAAM,SAASC,MAAAA,YAAY,YAAY;AACrC,UAAM,EAAE,IAAA,IAAQC,qBAAA;AAChB,QAAI;AACJ,UAAM,WAAW,0BAA0B,IAAI,IAAI,EAAE,IAAI,MAAM;AAC/D,QAAI;AACF,iBAAW,MAAM,IAAI,UAAU,EAAE,IAAI;AAAA,IACvC,SAAS,OAAO;AACd,aAAO,mBAAmB;AAAA,QACxB,MAAM;AAAA,QACN,SAAS,cAAc;AAAA,UACrB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA,CACF;AAAA,IACH;AACA,aAAS,SAAS,KAAK,KAAK;AAC5B,cAAU,IAAI;AACd,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,IAAI,oBAAoB,MAAM,QAAQ,QAAQ,CAAC;AAElEC,QAAAA,UAAU,MAAM;AAGd,QAAmB,MAAM,OAAO,UAAU;AACxC,aAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,MAAM,CAAC;AAMf,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,kBAAkB,OAAO,MAC1DC,2BAAAA,KAAC,OAAA,EACC,UAAA;AAAA,IAAAV,+BAAC,QAAG,OAAO,EAAE,eAAe,SAAA,GAAa,UAAA,kBAAiB;AAAA,IACzD,QAAQ,IAAI,CAAC;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,MAEAA,2BAAAA,IAAC,OAAA,EAAqB,OAAO,EAAE,eAAe,YAC5C,UAAAA,2BAAAA,IAAC,oBAAA,EAAmB,SAAS,CAAC,aAAa,OAAO,2DAA2D,KAAK,oBAAoB,KAAK,4BACzI,UAAAU,2BAAAA;AAAAA,MAACC,aAAAA;AAAAA,MAAA;AAAA,QACC,SAAS,CAAC,cAAc,WAAW;AAAA,QACnC,KAAKC,eAAAA;AAAAA,QACL,IAAI,EAAE,UAAU,qCAAqC,GAAG,IAAI,UAAU,GAAA;AAAA,QAErE,UAAA;AAAA,UAAA,CAAC,eAAe;AAAA,UAAI;AAAA,UAAE,SAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EAClC,CACF,EAAA,GATQ,UAUV,CACD;AAAA,EAAA,EAAA,CACH,CACD;AACH;AC1FA,MAAM,QAAQ,CAAC,EAAE,OAAO,YAAY,gBAAgB;AAAA,EAClD,OAAO;AAAA,EACP,wCAAU,MAAA,CAAA,CAAK;AACjB;ACHA,MAAA,QAAe;AAAA,EACb,UAAU,KAAK;AAEb,QAAI,UAAU,iBAAiB,EAAE,KAAK,qBAAqB,CAAC,KAAK,CAAC;AAAA,EACpE;AAAA,EACA,WAAW;AAAA,EAAC;AACd;;"}
|
package/dist/admin/index.mjs
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useCallback, useEffect } from "react";
|
|
3
3
|
import { useIntl } from "react-intl";
|
|
4
|
-
import { useParams, useSearchParams } from "react-router-dom";
|
|
5
|
-
import {
|
|
4
|
+
import { useParams, useSearchParams, Link } from "react-router-dom";
|
|
5
|
+
import { Button, Tooltip } from "@strapi/design-system";
|
|
6
6
|
import { useNotification, getFetchClient } from "@strapi/strapi/admin";
|
|
7
|
+
const ConditionalTooltip = ({ isShown, label, children }) => {
|
|
8
|
+
if (isShown) {
|
|
9
|
+
return /* @__PURE__ */ jsx(Tooltip, { label, children });
|
|
10
|
+
}
|
|
11
|
+
return children;
|
|
12
|
+
};
|
|
7
13
|
const List = () => {
|
|
8
14
|
const { formatMessage } = useIntl();
|
|
9
15
|
const { id, slug } = useParams();
|
|
10
16
|
const [params] = useSearchParams();
|
|
11
17
|
const { toggleNotification } = useNotification();
|
|
12
|
-
const [items, setItems] = useState(
|
|
18
|
+
const [items, setItems] = useState(null);
|
|
19
|
+
const [loaded, setLoaded] = useState(false);
|
|
13
20
|
const status = params.get("status") || "draft";
|
|
14
21
|
const getter = useCallback(async () => {
|
|
15
22
|
const { get } = getFetchClient();
|
|
@@ -27,6 +34,7 @@ const List = () => {
|
|
|
27
34
|
});
|
|
28
35
|
}
|
|
29
36
|
setItems(response.data.items);
|
|
37
|
+
setLoaded(true);
|
|
30
38
|
return null;
|
|
31
39
|
}, [formatMessage, id, toggleNotification, slug, status, setItems]);
|
|
32
40
|
useEffect(() => {
|
|
@@ -34,35 +42,41 @@ const List = () => {
|
|
|
34
42
|
getter();
|
|
35
43
|
}
|
|
36
44
|
}, [id, getter]);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
45
|
+
if (!loaded) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
if (!items) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return Object.entries(items).map(([contentTypeTitle, entries]) => /* @__PURE__ */ jsxs("div", { children: [
|
|
52
|
+
/* @__PURE__ */ jsx("h2", { style: { paddingBottom: "0.5rem" }, children: contentTypeTitle }),
|
|
53
|
+
entries.map(({
|
|
40
54
|
documentId,
|
|
41
55
|
title,
|
|
42
56
|
uid,
|
|
43
|
-
contentTypeDisplayName,
|
|
44
57
|
isPublished
|
|
45
|
-
}) => /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(
|
|
46
|
-
|
|
58
|
+
}) => /* @__PURE__ */ jsx("div", { style: { paddingBottom: "0.5rem" }, children: /* @__PURE__ */ jsx(ConditionalTooltip, { isShown: !isPublished, label: `Current entry is not linked to the published version of ${title}, please publish ${title} to publish the relation`, children: /* @__PURE__ */ jsxs(
|
|
59
|
+
Button,
|
|
47
60
|
{
|
|
48
|
-
|
|
61
|
+
variant: !isPublished ? "danger" : "tertiary",
|
|
62
|
+
tag: Link,
|
|
63
|
+
to: { pathname: `/content-manager/collection-types/${uid}/${documentId}` },
|
|
49
64
|
children: [
|
|
50
65
|
!isPublished && "⚠",
|
|
51
66
|
" ",
|
|
52
|
-
contentTypeDisplayName,
|
|
53
|
-
": ",
|
|
54
67
|
title || documentId
|
|
55
68
|
]
|
|
56
69
|
}
|
|
57
|
-
) }, documentId))
|
|
58
|
-
] });
|
|
70
|
+
) }) }, documentId))
|
|
71
|
+
] }));
|
|
59
72
|
};
|
|
73
|
+
const Panel = ({ model, documentId, document }) => ({
|
|
74
|
+
title: "Relations to this entry",
|
|
75
|
+
content: /* @__PURE__ */ jsx(List, {})
|
|
76
|
+
});
|
|
60
77
|
const index = {
|
|
61
78
|
bootstrap(app) {
|
|
62
|
-
app.getPlugin("content-manager").
|
|
63
|
-
name: "it-relates-to-me-list",
|
|
64
|
-
Component: List
|
|
65
|
-
});
|
|
79
|
+
app.getPlugin("content-manager").apis.addEditViewSidePanel([Panel]);
|
|
66
80
|
},
|
|
67
81
|
register() {
|
|
68
82
|
}
|
package/dist/admin/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../admin/src/components/list.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport {
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../admin/src/components/list.jsx","../../admin/src/components/panel.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { Button, Tooltip } from '@strapi/design-system';\nimport {\n getFetchClient,\n useNotification,\n} from '@strapi/strapi/admin';\nimport { Link } from 'react-router-dom';\n\nconst useThisCode = true;\n\nconst ConditionalTooltip = ({ isShown, label, children }) => {\n if (isShown) {\n return <Tooltip label={label}>{children}</Tooltip>;\n }\n\n return children;\n};\n\nconst List = () => {\n const { formatMessage } = useIntl();\n const { id, slug } = useParams();\n const [params] = useSearchParams();\n const { toggleNotification } = useNotification();\n const [items, setItems] = useState(null);\n const [loaded, setLoaded] = useState(false);\n const status = params.get('status') || 'draft';\n\n const getter = useCallback(async () => {\n const { get } = getFetchClient();\n let response;\n const endpoint = `/i-relate-to-this/list/${slug}/${id}/${status}`;\n try {\n response = await get(endpoint, { id });\n } catch (error) {\n return toggleNotification({\n type: 'warning',\n message: formatMessage({\n id: 'Failed to load list',\n defaultMessage: error,\n }),\n });\n }\n setItems(response.data.items);\n setLoaded(true);\n return null;\n }, [formatMessage, id, toggleNotification, slug, status, setItems]);\n\n useEffect(() => {\n // single types don't have an id\n // on create there are never relations\n if (useThisCode && id && id !== 'create') {\n getter();\n }\n }, [id, getter]);\n\n if (!useThisCode) {\n return null;\n }\n\n if (!loaded) {\n return null;\n }\n\n if (!items) {\n return null;\n }\n\n return Object.entries(items).map(([contentTypeTitle, entries]) => (\n <div>\n <h2 style={{ paddingBottom: '0.5rem' }}>{contentTypeTitle}</h2>\n {entries.map(({\n documentId,\n title,\n uid,\n isPublished,\n }) => (\n <div key={documentId} style={{ paddingBottom: '0.5rem' }}>\n <ConditionalTooltip isShown={!isPublished} label={`Current entry is not linked to the published version of ${title}, please publish ${title} to publish the relation`}>\n <Button\n variant={!isPublished ? 'danger' : 'tertiary'}\n tag={Link}\n to={{ pathname: `/content-manager/collection-types/${uid}/${documentId}` }}\n >\n {!isPublished && '⚠'} {title || documentId}\n </Button>\n </ConditionalTooltip>\n </div>\n ))}\n </div>\n ));\n};\n\nexport default List;\n","import List from \"./list\";\n\nconst Panel = ({ model, documentId, document }) => ({\n title: 'Relations to this entry',\n content: <List />,\n});\n\nexport default Panel;","import Panel from './components/panel';\n\nexport default {\n bootstrap(app) {\n // execute some bootstrap code\n app.getPlugin('content-manager').apis.addEditViewSidePanel([Panel]);\n },\n register() {}\n};\n"],"names":[],"mappings":";;;;;;AAYA,MAAM,qBAAqB,CAAC,EAAE,SAAS,OAAO,eAAe;AAC3D,MAAI,SAAS;AACX,WAAO,oBAAC,SAAA,EAAQ,OAAe,SAAA,CAAS;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,MAAM,OAAO,MAAM;AACjB,QAAM,EAAE,cAAA,IAAkB,QAAA;AAC1B,QAAM,EAAE,IAAI,KAAA,IAAS,UAAA;AACrB,QAAM,CAAC,MAAM,IAAI,gBAAA;AACjB,QAAM,EAAE,mBAAA,IAAuB,gBAAA;AAC/B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,IAAI;AACvC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,SAAS,OAAO,IAAI,QAAQ,KAAK;AAEvC,QAAM,SAAS,YAAY,YAAY;AACrC,UAAM,EAAE,IAAA,IAAQ,eAAA;AAChB,QAAI;AACJ,UAAM,WAAW,0BAA0B,IAAI,IAAI,EAAE,IAAI,MAAM;AAC/D,QAAI;AACF,iBAAW,MAAM,IAAI,UAAU,EAAE,IAAI;AAAA,IACvC,SAAS,OAAO;AACd,aAAO,mBAAmB;AAAA,QACxB,MAAM;AAAA,QACN,SAAS,cAAc;AAAA,UACrB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA,CACF;AAAA,IACH;AACA,aAAS,SAAS,KAAK,KAAK;AAC5B,cAAU,IAAI;AACd,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,IAAI,oBAAoB,MAAM,QAAQ,QAAQ,CAAC;AAElE,YAAU,MAAM;AAGd,QAAmB,MAAM,OAAO,UAAU;AACxC,aAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,MAAM,CAAC;AAMf,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,kBAAkB,OAAO,MAC1D,qBAAC,OAAA,EACC,UAAA;AAAA,IAAA,oBAAC,QAAG,OAAO,EAAE,eAAe,SAAA,GAAa,UAAA,kBAAiB;AAAA,IACzD,QAAQ,IAAI,CAAC;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,MAEA,oBAAC,OAAA,EAAqB,OAAO,EAAE,eAAe,YAC5C,UAAA,oBAAC,oBAAA,EAAmB,SAAS,CAAC,aAAa,OAAO,2DAA2D,KAAK,oBAAoB,KAAK,4BACzI,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,CAAC,cAAc,WAAW;AAAA,QACnC,KAAK;AAAA,QACL,IAAI,EAAE,UAAU,qCAAqC,GAAG,IAAI,UAAU,GAAA;AAAA,QAErE,UAAA;AAAA,UAAA,CAAC,eAAe;AAAA,UAAI;AAAA,UAAE,SAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EAClC,CACF,EAAA,GATQ,UAUV,CACD;AAAA,EAAA,EAAA,CACH,CACD;AACH;AC1FA,MAAM,QAAQ,CAAC,EAAE,OAAO,YAAY,gBAAgB;AAAA,EAClD,OAAO;AAAA,EACP,6BAAU,MAAA,CAAA,CAAK;AACjB;ACHA,MAAA,QAAe;AAAA,EACb,UAAU,KAAK;AAEb,QAAI,UAAU,iBAAiB,EAAE,KAAK,qBAAqB,CAAC,KAAK,CAAC;AAAA,EACpE;AAAA,EACA,WAAW;AAAA,EAAC;AACd;"}
|
package/dist/server/index.js
CHANGED
|
@@ -128,7 +128,6 @@ const search = async (id, status, parent) => {
|
|
|
128
128
|
};
|
|
129
129
|
const service = ({ strapi: strapi2 }) => ({
|
|
130
130
|
async getunirelations(contentType, documentId, status = "draft") {
|
|
131
|
-
console.log("running service");
|
|
132
131
|
const ct = strapi2.contentType(contentType);
|
|
133
132
|
const entity = await strapi2.documents(contentType).findOne({
|
|
134
133
|
documentId,
|
|
@@ -169,13 +168,15 @@ const service = ({ strapi: strapi2 }) => ({
|
|
|
169
168
|
status
|
|
170
169
|
})).map((entry) => ({
|
|
171
170
|
uid,
|
|
172
|
-
contentTypeDisplayName: info.displayName,
|
|
173
171
|
title: entry.title || entry.name,
|
|
174
172
|
documentId: entry.documentId,
|
|
175
173
|
isPublished: status === "published" || publishedDocumentIds.includes(entry.documentId)
|
|
176
174
|
}));
|
|
177
|
-
return
|
|
178
|
-
|
|
175
|
+
return {
|
|
176
|
+
...prev,
|
|
177
|
+
[info.displayName]: entries
|
|
178
|
+
};
|
|
179
|
+
}, {});
|
|
179
180
|
return result;
|
|
180
181
|
}
|
|
181
182
|
});
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/list/:contentType/:id/:status',\n handler: 'controller.getunirelations',\n }\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, documentId, status = 'draft') {\n console.log('running service');\n const ct = strapi.contentType(contentType);\n\n // find the db id by documentId\n const entity = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status,\n });\n // go fetch all related items to me\n const relatedEntries = await search(entity.id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n contentTypeDisplayName: info.displayName,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, []);\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi","snakeCase","mergeWith"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/list/:contentType/:id/:status',\n handler: 'controller.getunirelations',\n }\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, documentId, status = 'draft') {\n const ct = strapi.contentType(contentType);\n\n // find the db id by documentId\n const entity = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status,\n });\n // go fetch all related items to me\n const relatedEntries = await search(entity.id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return {\n ...prev,\n [info.displayName]: entries,\n };\n }, {});\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi","snakeCase","mergeWith"],"mappings":"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"}
|
package/dist/server/index.mjs
CHANGED
|
@@ -124,7 +124,6 @@ const search = async (id, status, parent) => {
|
|
|
124
124
|
};
|
|
125
125
|
const service = ({ strapi: strapi2 }) => ({
|
|
126
126
|
async getunirelations(contentType, documentId, status = "draft") {
|
|
127
|
-
console.log("running service");
|
|
128
127
|
const ct = strapi2.contentType(contentType);
|
|
129
128
|
const entity = await strapi2.documents(contentType).findOne({
|
|
130
129
|
documentId,
|
|
@@ -165,13 +164,15 @@ const service = ({ strapi: strapi2 }) => ({
|
|
|
165
164
|
status
|
|
166
165
|
})).map((entry) => ({
|
|
167
166
|
uid,
|
|
168
|
-
contentTypeDisplayName: info.displayName,
|
|
169
167
|
title: entry.title || entry.name,
|
|
170
168
|
documentId: entry.documentId,
|
|
171
169
|
isPublished: status === "published" || publishedDocumentIds.includes(entry.documentId)
|
|
172
170
|
}));
|
|
173
|
-
return
|
|
174
|
-
|
|
171
|
+
return {
|
|
172
|
+
...prev,
|
|
173
|
+
[info.displayName]: entries
|
|
174
|
+
};
|
|
175
|
+
}, {});
|
|
175
176
|
return result;
|
|
176
177
|
}
|
|
177
178
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/list/:contentType/:id/:status',\n handler: 'controller.getunirelations',\n }\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, documentId, status = 'draft') {\n console.log('running service');\n const ct = strapi.contentType(contentType);\n\n // find the db id by documentId\n const entity = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status,\n });\n // go fetch all related items to me\n const relatedEntries = await search(entity.id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n contentTypeDisplayName: info.displayName,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, []);\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/list/:contentType/:id/:status',\n handler: 'controller.getunirelations',\n }\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, documentId, status = 'draft') {\n const ct = strapi.contentType(contentType);\n\n // find the db id by documentId\n const entity = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status,\n });\n // go fetch all related items to me\n const relatedEntries = await search(entity.id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return {\n ...prev,\n [info.displayName]: entries,\n };\n }, {});\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.1.0",
|
|
3
3
|
"keywords": [],
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"exports": {
|
|
@@ -59,5 +59,9 @@
|
|
|
59
59
|
"name": "strapi-plugin-i-relate-to-this",
|
|
60
60
|
"description": "List unidirectional relations (in components) to the current entity",
|
|
61
61
|
"license": "MIT",
|
|
62
|
-
"author": "Laurens Kling <laurens@goedideemedia.nl>"
|
|
62
|
+
"author": "Laurens Kling <laurens@goedideemedia.nl>",
|
|
63
|
+
"repository": {
|
|
64
|
+
"type": "git",
|
|
65
|
+
"url": "git@github.com:laurenskling/strapi-plugin-i-relate-to-this.git"
|
|
66
|
+
}
|
|
63
67
|
}
|