strapi-plugin-i-relate-to-this 0.1.1 → 0.2.1

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.
@@ -2,29 +2,32 @@
2
2
  const jsxRuntime = require("react/jsx-runtime");
3
3
  const react = require("react");
4
4
  const reactIntl = require("react-intl");
5
- const reactRouterDom = require("react-router-dom");
6
5
  const designSystem = require("@strapi/design-system");
7
6
  const admin = require("@strapi/strapi/admin");
7
+ const reactRouterDom = require("react-router-dom");
8
8
  const ConditionalTooltip = ({ isShown, label, children }) => {
9
9
  if (isShown) {
10
10
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { label, children });
11
11
  }
12
12
  return children;
13
13
  };
14
- const List = () => {
14
+ const List = ({
15
+ model,
16
+ activeTab,
17
+ // draft / published
18
+ document
19
+ }) => {
20
+ const { documentId, id } = document || {};
15
21
  const { formatMessage } = reactIntl.useIntl();
16
- const { id, slug } = reactRouterDom.useParams();
17
- const [params] = reactRouterDom.useSearchParams();
18
22
  const { toggleNotification } = admin.useNotification();
19
23
  const [items, setItems] = react.useState(null);
20
24
  const [loaded, setLoaded] = react.useState(false);
21
- const status = params.get("status") || "draft";
22
25
  const getter = react.useCallback(async () => {
23
26
  const { get } = admin.getFetchClient();
24
27
  let response;
25
- const endpoint = `/i-relate-to-this/list/${slug}/${id}/${status}`;
28
+ const endpoint = `/i-relate-to-this/${model}/${id}/${documentId}/${activeTab}`;
26
29
  try {
27
- response = await get(endpoint, { id });
30
+ response = await get(endpoint);
28
31
  } catch (error) {
29
32
  return toggleNotification({
30
33
  type: "warning",
@@ -37,12 +40,21 @@ const List = () => {
37
40
  setItems(response.data.items);
38
41
  setLoaded(true);
39
42
  return null;
40
- }, [formatMessage, id, toggleNotification, slug, status, setItems]);
43
+ }, [
44
+ model,
45
+ id,
46
+ documentId,
47
+ activeTab,
48
+ toggleNotification,
49
+ formatMessage,
50
+ setItems
51
+ ]);
41
52
  react.useEffect(() => {
42
- if (id && id !== "create") {
53
+ setItems(null);
54
+ if (documentId) {
43
55
  getter();
44
56
  }
45
- }, [id, getter]);
57
+ }, [documentId, getter, setItems]);
46
58
  if (!loaded) {
47
59
  return null;
48
60
  }
@@ -52,7 +64,7 @@ const List = () => {
52
64
  return Object.entries(items).map(([contentTypeTitle, entries]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
53
65
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { paddingBottom: "0.5rem" }, children: contentTypeTitle }),
54
66
  entries.map(({
55
- documentId,
67
+ documentId: documentId2,
56
68
  title,
57
69
  uid,
58
70
  isPublished
@@ -61,19 +73,19 @@ const List = () => {
61
73
  {
62
74
  variant: !isPublished ? "danger" : "tertiary",
63
75
  tag: reactRouterDom.Link,
64
- to: { pathname: `/content-manager/collection-types/${uid}/${documentId}` },
76
+ to: { pathname: `/content-manager/collection-types/${uid}/${documentId2}` },
65
77
  children: [
66
78
  !isPublished && "⚠",
67
79
  " ",
68
- title || documentId
80
+ title || documentId2
69
81
  ]
70
82
  }
71
- ) }) }, documentId))
72
- ] }));
83
+ ) }) }, documentId2))
84
+ ] }, contentTypeTitle));
73
85
  };
74
- const Panel = ({ model, documentId, document }) => ({
86
+ const Panel = (props) => ({
75
87
  title: "Relations to this entry",
76
- content: /* @__PURE__ */ jsxRuntime.jsx(List, {})
88
+ content: /* @__PURE__ */ jsxRuntime.jsx(List, { ...props })
77
89
  });
78
90
  const index = {
79
91
  bootstrap(app) {
@@ -83,4 +95,3 @@ const index = {
83
95
  }
84
96
  };
85
97
  module.exports = index;
86
- //# sourceMappingURL=index.js.map
@@ -1,29 +1,32 @@
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, Link } from "react-router-dom";
5
4
  import { Button, Tooltip } from "@strapi/design-system";
6
5
  import { useNotification, getFetchClient } from "@strapi/strapi/admin";
6
+ import { Link } from "react-router-dom";
7
7
  const ConditionalTooltip = ({ isShown, label, children }) => {
8
8
  if (isShown) {
9
9
  return /* @__PURE__ */ jsx(Tooltip, { label, children });
10
10
  }
11
11
  return children;
12
12
  };
13
- const List = () => {
13
+ const List = ({
14
+ model,
15
+ activeTab,
16
+ // draft / published
17
+ document
18
+ }) => {
19
+ const { documentId, id } = document || {};
14
20
  const { formatMessage } = useIntl();
15
- const { id, slug } = useParams();
16
- const [params] = useSearchParams();
17
21
  const { toggleNotification } = useNotification();
18
22
  const [items, setItems] = useState(null);
19
23
  const [loaded, setLoaded] = useState(false);
20
- const status = params.get("status") || "draft";
21
24
  const getter = useCallback(async () => {
22
25
  const { get } = getFetchClient();
23
26
  let response;
24
- const endpoint = `/i-relate-to-this/list/${slug}/${id}/${status}`;
27
+ const endpoint = `/i-relate-to-this/${model}/${id}/${documentId}/${activeTab}`;
25
28
  try {
26
- response = await get(endpoint, { id });
29
+ response = await get(endpoint);
27
30
  } catch (error) {
28
31
  return toggleNotification({
29
32
  type: "warning",
@@ -36,12 +39,21 @@ const List = () => {
36
39
  setItems(response.data.items);
37
40
  setLoaded(true);
38
41
  return null;
39
- }, [formatMessage, id, toggleNotification, slug, status, setItems]);
42
+ }, [
43
+ model,
44
+ id,
45
+ documentId,
46
+ activeTab,
47
+ toggleNotification,
48
+ formatMessage,
49
+ setItems
50
+ ]);
40
51
  useEffect(() => {
41
- if (id && id !== "create") {
52
+ setItems(null);
53
+ if (documentId) {
42
54
  getter();
43
55
  }
44
- }, [id, getter]);
56
+ }, [documentId, getter, setItems]);
45
57
  if (!loaded) {
46
58
  return null;
47
59
  }
@@ -51,7 +63,7 @@ const List = () => {
51
63
  return Object.entries(items).map(([contentTypeTitle, entries]) => /* @__PURE__ */ jsxs("div", { children: [
52
64
  /* @__PURE__ */ jsx("h2", { style: { paddingBottom: "0.5rem" }, children: contentTypeTitle }),
53
65
  entries.map(({
54
- documentId,
66
+ documentId: documentId2,
55
67
  title,
56
68
  uid,
57
69
  isPublished
@@ -60,19 +72,19 @@ const List = () => {
60
72
  {
61
73
  variant: !isPublished ? "danger" : "tertiary",
62
74
  tag: Link,
63
- to: { pathname: `/content-manager/collection-types/${uid}/${documentId}` },
75
+ to: { pathname: `/content-manager/collection-types/${uid}/${documentId2}` },
64
76
  children: [
65
77
  !isPublished && "⚠",
66
78
  " ",
67
- title || documentId
79
+ title || documentId2
68
80
  ]
69
81
  }
70
- ) }) }, documentId))
71
- ] }));
82
+ ) }) }, documentId2))
83
+ ] }, contentTypeTitle));
72
84
  };
73
- const Panel = ({ model, documentId, document }) => ({
85
+ const Panel = (props) => ({
74
86
  title: "Relations to this entry",
75
- content: /* @__PURE__ */ jsx(List, {})
87
+ content: /* @__PURE__ */ jsx(List, { ...props })
76
88
  });
77
89
  const index = {
78
90
  bootstrap(app) {
@@ -84,4 +96,3 @@ const index = {
84
96
  export {
85
97
  index as default
86
98
  };
87
- //# sourceMappingURL=index.mjs.map
@@ -18,8 +18,8 @@ const config = {
18
18
  const contentTypes = {};
19
19
  const controller = ({ strapi: strapi2 }) => ({
20
20
  async getunirelations(ctx) {
21
- const { id, contentType, status } = ctx.request.params;
22
- const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, status);
21
+ const { id, documentId, contentType, status } = ctx.request.params;
22
+ const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, documentId, status);
23
23
  if (!response) {
24
24
  ctx.body = { success: false };
25
25
  return;
@@ -38,7 +38,7 @@ const policies = {};
38
38
  const adminRoutes = [
39
39
  {
40
40
  method: "GET",
41
- path: "/list/:contentType/:id/:status",
41
+ path: "/:contentType/:id/:documentId/:status",
42
42
  handler: "controller.getunirelations"
43
43
  }
44
44
  ];
@@ -127,14 +127,9 @@ const search = async (id, status, parent) => {
127
127
  return lookups;
128
128
  };
129
129
  const service = ({ strapi: strapi2 }) => ({
130
- async getunirelations(contentType, documentId, status = "draft") {
130
+ async getunirelations(contentType, id, documentId, status = "draft") {
131
131
  const ct = strapi2.contentType(contentType);
132
- const entity = await strapi2.documents(contentType).findOne({
133
- documentId,
134
- fields: ["id"],
135
- status
136
- });
137
- const relatedEntries = await search(entity.id, status, ct);
132
+ const relatedEntries = await search(id, status, ct);
138
133
  let publishedDocumentIds = [];
139
134
  if (status === "draft") {
140
135
  const entityPub = await strapi2.documents(contentType).findOne({
@@ -196,4 +191,3 @@ const index = {
196
191
  services
197
192
  };
198
193
  module.exports = index;
199
- //# sourceMappingURL=index.js.map
@@ -14,8 +14,8 @@ const config = {
14
14
  const contentTypes = {};
15
15
  const controller = ({ strapi: strapi2 }) => ({
16
16
  async getunirelations(ctx) {
17
- const { id, contentType, status } = ctx.request.params;
18
- const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, status);
17
+ const { id, documentId, contentType, status } = ctx.request.params;
18
+ const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, documentId, status);
19
19
  if (!response) {
20
20
  ctx.body = { success: false };
21
21
  return;
@@ -34,7 +34,7 @@ const policies = {};
34
34
  const adminRoutes = [
35
35
  {
36
36
  method: "GET",
37
- path: "/list/:contentType/:id/:status",
37
+ path: "/:contentType/:id/:documentId/:status",
38
38
  handler: "controller.getunirelations"
39
39
  }
40
40
  ];
@@ -123,14 +123,9 @@ const search = async (id, status, parent) => {
123
123
  return lookups;
124
124
  };
125
125
  const service = ({ strapi: strapi2 }) => ({
126
- async getunirelations(contentType, documentId, status = "draft") {
126
+ async getunirelations(contentType, id, documentId, status = "draft") {
127
127
  const ct = strapi2.contentType(contentType);
128
- const entity = await strapi2.documents(contentType).findOne({
129
- documentId,
130
- fields: ["id"],
131
- status
132
- });
133
- const relatedEntries = await search(entity.id, status, ct);
128
+ const relatedEntries = await search(id, status, ct);
134
129
  let publishedDocumentIds = [];
135
130
  if (status === "draft") {
136
131
  const entityPub = await strapi2.documents(contentType).findOne({
@@ -194,4 +189,3 @@ const index = {
194
189
  export {
195
190
  index as default
196
191
  };
197
- //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.1",
2
+ "version": "0.2.1",
3
3
  "keywords": [],
4
4
  "type": "commonjs",
5
5
  "exports": {
@@ -62,6 +62,6 @@
62
62
  "author": "Laurens Kling <laurens@goedideemedia.nl>",
63
63
  "repository": {
64
64
  "type": "git",
65
- "url": "git@github.com:laurenskling/strapi-plugin-i-relate-to-this.git"
65
+ "url": "git+ssh://git@github.com/laurenskling/strapi-plugin-i-relate-to-this.git"
66
66
  }
67
67
  }
@@ -1 +0,0 @@
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 || Object.keys(items).length === 0) {\n return 'No relations found';\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,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC7C,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;;"}
@@ -1 +0,0 @@
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 || Object.keys(items).length === 0) {\n return 'No relations found';\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,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC7C,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;"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
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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"}