octalens-mentions 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/_chunks/App--ENzwlke.js +30 -0
  2. package/dist/_chunks/App--ENzwlke.js.map +1 -0
  3. package/dist/_chunks/App-75QgqKbt.mjs +29 -0
  4. package/dist/_chunks/App-75QgqKbt.mjs.map +1 -0
  5. package/dist/_chunks/App-BAfec0ux.mjs +31 -0
  6. package/dist/_chunks/App-BAfec0ux.mjs.map +1 -0
  7. package/dist/_chunks/App-BIffUtYI.js +30 -0
  8. package/dist/_chunks/App-BIffUtYI.js.map +1 -0
  9. package/dist/_chunks/App-B_sMYxju.mjs +27 -0
  10. package/dist/_chunks/App-B_sMYxju.mjs.map +1 -0
  11. package/dist/_chunks/App-BcWFGc-s.js +31 -0
  12. package/dist/_chunks/App-BcWFGc-s.js.map +1 -0
  13. package/dist/_chunks/App-Bdin-Qhb.js +30 -0
  14. package/dist/_chunks/App-Bdin-Qhb.js.map +1 -0
  15. package/dist/_chunks/App-BjIpZ5Gy.js +29 -0
  16. package/dist/_chunks/App-BjIpZ5Gy.js.map +1 -0
  17. package/dist/_chunks/App-Bz4Wu5GI.mjs +30 -0
  18. package/dist/_chunks/App-Bz4Wu5GI.mjs.map +1 -0
  19. package/dist/_chunks/App-C0IDjiqN.mjs +30 -0
  20. package/dist/_chunks/App-C0IDjiqN.mjs.map +1 -0
  21. package/dist/_chunks/App-C46-I109.mjs +29 -0
  22. package/dist/_chunks/App-C46-I109.mjs.map +1 -0
  23. package/dist/_chunks/App-CFbMml4i.js +29 -0
  24. package/dist/_chunks/App-CFbMml4i.js.map +1 -0
  25. package/dist/_chunks/App-CPej22xb.js +29 -0
  26. package/dist/_chunks/App-CPej22xb.js.map +1 -0
  27. package/dist/_chunks/{App-B6IICgyu.js → App-CTT2mCMu.js} +2 -1
  28. package/dist/_chunks/App-CTT2mCMu.js.map +1 -0
  29. package/dist/_chunks/App-CZ5Z2mZv.js +29 -0
  30. package/dist/_chunks/App-CZ5Z2mZv.js.map +1 -0
  31. package/dist/_chunks/App-C_Lp3V5-.js +27 -0
  32. package/dist/_chunks/App-C_Lp3V5-.js.map +1 -0
  33. package/dist/_chunks/App-CcbyKFnF.js +55 -0
  34. package/dist/_chunks/App-CcbyKFnF.js.map +1 -0
  35. package/dist/_chunks/App-CjOu4m5M.mjs +29 -0
  36. package/dist/_chunks/App-CjOu4m5M.mjs.map +1 -0
  37. package/dist/_chunks/App-CkT0fH8s.mjs +29 -0
  38. package/dist/_chunks/App-CkT0fH8s.mjs.map +1 -0
  39. package/dist/_chunks/App-CmRg9S2z.mjs +29 -0
  40. package/dist/_chunks/App-CmRg9S2z.mjs.map +1 -0
  41. package/dist/_chunks/App-D0rBJ7iM.mjs +30 -0
  42. package/dist/_chunks/App-D0rBJ7iM.mjs.map +1 -0
  43. package/dist/_chunks/App-D92R87Zh.js +29 -0
  44. package/dist/_chunks/App-D92R87Zh.js.map +1 -0
  45. package/dist/_chunks/App-DA1KtZxY.js +29 -0
  46. package/dist/_chunks/App-DA1KtZxY.js.map +1 -0
  47. package/dist/_chunks/App-DC64hBpD.js +29 -0
  48. package/dist/_chunks/App-DC64hBpD.js.map +1 -0
  49. package/dist/_chunks/App-DHKoqr97.mjs +29 -0
  50. package/dist/_chunks/App-DHKoqr97.mjs.map +1 -0
  51. package/dist/_chunks/App-D_uRLQKm.js +30 -0
  52. package/dist/_chunks/App-D_uRLQKm.js.map +1 -0
  53. package/dist/_chunks/App-Dwg3aLMa.mjs +55 -0
  54. package/dist/_chunks/App-Dwg3aLMa.mjs.map +1 -0
  55. package/dist/_chunks/App-DzHKWBmE.mjs +30 -0
  56. package/dist/_chunks/App-DzHKWBmE.mjs.map +1 -0
  57. package/dist/_chunks/App-HpszAlq5.mjs +29 -0
  58. package/dist/_chunks/App-HpszAlq5.mjs.map +1 -0
  59. package/dist/_chunks/App-OuT3TTVJ.mjs +29 -0
  60. package/dist/_chunks/App-OuT3TTVJ.mjs.map +1 -0
  61. package/dist/_chunks/{App-BVO2PSDy.mjs → App-PNVuelEp.mjs} +2 -1
  62. package/dist/_chunks/App-PNVuelEp.mjs.map +1 -0
  63. package/dist/_chunks/App-Sr50o70g.js +29 -0
  64. package/dist/_chunks/App-Sr50o70g.js.map +1 -0
  65. package/dist/_chunks/App-ot837BOf.js +29 -0
  66. package/dist/_chunks/App-ot837BOf.js.map +1 -0
  67. package/dist/_chunks/App-sSrt9hXQ.mjs +29 -0
  68. package/dist/_chunks/App-sSrt9hXQ.mjs.map +1 -0
  69. package/dist/_chunks/en-B4KWt_jN.js +1 -0
  70. package/dist/_chunks/en-B4KWt_jN.js.map +1 -0
  71. package/dist/_chunks/en-Byx4XI2L.mjs +1 -0
  72. package/dist/_chunks/en-Byx4XI2L.mjs.map +1 -0
  73. package/dist/_chunks/index--annyiFm.mjs +168 -0
  74. package/dist/_chunks/index--annyiFm.mjs.map +1 -0
  75. package/dist/_chunks/index-3mNRnzIR.mjs +168 -0
  76. package/dist/_chunks/index-3mNRnzIR.mjs.map +1 -0
  77. package/dist/_chunks/index-B26su1ae.js +168 -0
  78. package/dist/_chunks/index-B26su1ae.js.map +1 -0
  79. package/dist/_chunks/index-B2sNP6GB.mjs +168 -0
  80. package/dist/_chunks/index-B2sNP6GB.mjs.map +1 -0
  81. package/dist/_chunks/index-BBddlEA1.js +148 -0
  82. package/dist/_chunks/index-BBddlEA1.js.map +1 -0
  83. package/dist/_chunks/index-BK0eSFgX.js +167 -0
  84. package/dist/_chunks/index-BK0eSFgX.js.map +1 -0
  85. package/dist/_chunks/index-BMLg_Xy6.mjs +168 -0
  86. package/dist/_chunks/index-BMLg_Xy6.mjs.map +1 -0
  87. package/dist/_chunks/index-BQ3z94rf.js +167 -0
  88. package/dist/_chunks/index-BQ3z94rf.js.map +1 -0
  89. package/dist/_chunks/index-BTLbR3Fz.js +146 -0
  90. package/dist/_chunks/index-BTLbR3Fz.js.map +1 -0
  91. package/dist/_chunks/index-Brdl3E9B.js +167 -0
  92. package/dist/_chunks/index-Brdl3E9B.js.map +1 -0
  93. package/dist/_chunks/index-C1E0XTLK.js +167 -0
  94. package/dist/_chunks/index-C1E0XTLK.js.map +1 -0
  95. package/dist/_chunks/index-CEANqesM.mjs +149 -0
  96. package/dist/_chunks/index-CEANqesM.mjs.map +1 -0
  97. package/dist/_chunks/index-CWUnKgbJ.mjs +168 -0
  98. package/dist/_chunks/index-CWUnKgbJ.mjs.map +1 -0
  99. package/dist/_chunks/index-CaLjngAz.js +167 -0
  100. package/dist/_chunks/index-CaLjngAz.js.map +1 -0
  101. package/dist/_chunks/index-CiKBF0JD.js +167 -0
  102. package/dist/_chunks/index-CiKBF0JD.js.map +1 -0
  103. package/dist/_chunks/index-Csbvj5yS.mjs +168 -0
  104. package/dist/_chunks/index-Csbvj5yS.mjs.map +1 -0
  105. package/dist/_chunks/index-CtQiBuW6.js +167 -0
  106. package/dist/_chunks/index-CtQiBuW6.js.map +1 -0
  107. package/dist/_chunks/index-D14Rwvah.js +167 -0
  108. package/dist/_chunks/index-D14Rwvah.js.map +1 -0
  109. package/dist/_chunks/index-D4gZr0dD.js +167 -0
  110. package/dist/_chunks/index-D4gZr0dD.js.map +1 -0
  111. package/dist/_chunks/index-DCBzOUS9.mjs +168 -0
  112. package/dist/_chunks/index-DCBzOUS9.mjs.map +1 -0
  113. package/dist/_chunks/index-DNiMaXXq.mjs +168 -0
  114. package/dist/_chunks/index-DNiMaXXq.mjs.map +1 -0
  115. package/dist/_chunks/index-DOggc2pQ.js +167 -0
  116. package/dist/_chunks/index-DOggc2pQ.js.map +1 -0
  117. package/dist/_chunks/index-DPb3j3vn.mjs +168 -0
  118. package/dist/_chunks/index-DPb3j3vn.mjs.map +1 -0
  119. package/dist/_chunks/index-DdzkeneF.js +167 -0
  120. package/dist/_chunks/index-DdzkeneF.js.map +1 -0
  121. package/dist/_chunks/index-DjIZwNv3.js +167 -0
  122. package/dist/_chunks/index-DjIZwNv3.js.map +1 -0
  123. package/dist/_chunks/index-Dkdi7LFi.mjs +168 -0
  124. package/dist/_chunks/index-Dkdi7LFi.mjs.map +1 -0
  125. package/dist/_chunks/index-Dtd5kXzE.js +167 -0
  126. package/dist/_chunks/index-Dtd5kXzE.js.map +1 -0
  127. package/dist/_chunks/index-HmV1XMES.mjs +168 -0
  128. package/dist/_chunks/index-HmV1XMES.mjs.map +1 -0
  129. package/dist/_chunks/index-MjmrX_qB.js +167 -0
  130. package/dist/_chunks/index-MjmrX_qB.js.map +1 -0
  131. package/dist/_chunks/index-U0EJ6dJB.mjs +147 -0
  132. package/dist/_chunks/index-U0EJ6dJB.mjs.map +1 -0
  133. package/dist/_chunks/index-i2nteAHO.mjs +168 -0
  134. package/dist/_chunks/index-i2nteAHO.mjs.map +1 -0
  135. package/dist/_chunks/index-jZYmZUW8.mjs +169 -0
  136. package/dist/_chunks/index-jZYmZUW8.mjs.map +1 -0
  137. package/dist/_chunks/index-rOWNxR0l.mjs +168 -0
  138. package/dist/_chunks/index-rOWNxR0l.mjs.map +1 -0
  139. package/dist/_chunks/index-zpJzJYtP.mjs +168 -0
  140. package/dist/_chunks/index-zpJzJYtP.mjs.map +1 -0
  141. package/dist/admin/index.js +3 -1
  142. package/dist/admin/index.js.map +1 -0
  143. package/dist/admin/index.mjs +3 -1
  144. package/dist/admin/index.mjs.map +1 -0
  145. package/dist/admin/src/components/MentionsHome/index.d.ts +1 -0
  146. package/dist/admin/src/components/MentionsTable/index.d.ts +6 -0
  147. package/dist/admin/src/components/MentionsWidget/index.d.ts +1 -0
  148. package/dist/admin/src/constants.d.ts +5 -0
  149. package/dist/admin/src/hooks/useMentions.d.ts +6 -0
  150. package/dist/admin/src/types/index.d.ts +9 -0
  151. package/dist/admin/src/utils/getMentionTitle.d.ts +9 -0
  152. package/dist/server/index.js +32 -6
  153. package/dist/server/index.js.map +1 -0
  154. package/dist/server/index.mjs +32 -6
  155. package/dist/server/index.mjs.map +1 -0
  156. package/dist/server/src/index.d.ts +11 -0
  157. package/dist/server/src/routes/admin-api.d.ts +9 -0
  158. package/dist/server/src/routes/index.d.ts +11 -0
  159. package/package.json +1 -1
  160. package/dist/_chunks/index-DWKoTnWi.js +0 -65
  161. package/dist/_chunks/index-Dwi45-n4.mjs +0 -66
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ const icons = require("@strapi/icons");
3
+ const react = require("react");
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const designSystem = require("@strapi/design-system");
6
+ const admin = require("@strapi/strapi/admin");
7
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
8
+ const v = glob[path];
9
+ if (v) {
10
+ return typeof v === "function" ? v() : Promise.resolve(v);
11
+ }
12
+ return new Promise((_, reject) => {
13
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
14
+ reject.bind(
15
+ null,
16
+ new Error(
17
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
18
+ )
19
+ )
20
+ );
21
+ });
22
+ };
23
+ const PLUGIN_ID = "octalens-mentions";
24
+ const Initializer = ({ setPlugin }) => {
25
+ const ref = react.useRef(setPlugin);
26
+ react.useEffect(() => {
27
+ ref.current(PLUGIN_ID);
28
+ }, []);
29
+ return null;
30
+ };
31
+ const PluginIcon = () => /* @__PURE__ */ jsxRuntime.jsx(icons.PuzzlePiece, {});
32
+ const BASE_PATH = "/octalens-mentions";
33
+ const CONSTANTS = {
34
+ routes: {
35
+ MENTIONS_URL: BASE_PATH + "/mentions"
36
+ }
37
+ };
38
+ function useMentions() {
39
+ const { get } = admin.useFetchClient();
40
+ const [mentions, setMentions] = react.useState([]);
41
+ const [loading, setLoading] = react.useState(true);
42
+ const [error, setError] = react.useState(null);
43
+ react.useEffect(() => {
44
+ const fetchMentions = async () => {
45
+ try {
46
+ setLoading(true);
47
+ setError(null);
48
+ const { data } = await get(CONSTANTS.routes.MENTIONS_URL);
49
+ const mentions2 = data?.data;
50
+ setMentions(mentions2 || []);
51
+ } catch (error2) {
52
+ console.error("Error fetching mentions:", error2);
53
+ setError(error2 instanceof Error ? error2 : new Error("Failed to fetch mentions"));
54
+ } finally {
55
+ setLoading(false);
56
+ }
57
+ };
58
+ fetchMentions();
59
+ }, [get]);
60
+ return { mentions, loading, error };
61
+ }
62
+ const COL_COUNT = 7;
63
+ function MentionsTable({ mentions }) {
64
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Table, { colCount: COL_COUNT, rowCount: mentions.length, children: [
65
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Thead, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
66
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Checkbox, { "aria-label": "Select all entries" }) }),
67
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Title" }) }),
68
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Source" }) }),
69
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Keyword" }) }),
70
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Relevance Score" }) }),
71
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Comment" }) }),
72
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { children: "Actions" }) })
73
+ ] }) }),
74
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tbody, { children: mentions.map((mention) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
75
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Checkbox, { "aria-label": `Select ${mention.title}` }) }),
76
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", fontWeight: "bold", children: mention.title || "Untitled" }) }),
77
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: mention.source }) }),
78
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: mention.keyword }) }),
79
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: mention.relevanceScore }) }),
80
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { textColor: "neutral600", ellipsis: true, children: [
81
+ mention.relevanceComment?.substring(0, 50),
82
+ mention.relevanceComment?.length > 50 ? "..." : ""
83
+ ] }) }),
84
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
85
+ /* @__PURE__ */ jsxRuntime.jsx(
86
+ designSystem.IconButton,
87
+ {
88
+ onClick: () => console.log("edit", mention.documentId),
89
+ label: "Edit",
90
+ borderWidth: 0,
91
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
92
+ }
93
+ ),
94
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: /* @__PURE__ */ jsxRuntime.jsx(
95
+ designSystem.IconButton,
96
+ {
97
+ onClick: () => console.log("delete", mention.documentId),
98
+ label: "Delete",
99
+ borderWidth: 0,
100
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
101
+ }
102
+ ) })
103
+ ] }) })
104
+ ] }, mention.documentId)) })
105
+ ] });
106
+ }
107
+ function MentionsWidget() {
108
+ const { mentions, loading, error } = useMentions();
109
+ if (loading) {
110
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: "Loading mentions..." }) });
111
+ }
112
+ if (error) {
113
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { textColor: "danger600", children: [
114
+ "Error: ",
115
+ error.message
116
+ ] }) });
117
+ }
118
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 4, children: /* @__PURE__ */ jsxRuntime.jsx(MentionsTable, { mentions }) });
119
+ }
120
+ const index = {
121
+ register(app) {
122
+ app.addMenuLink({
123
+ to: `plugins/${PLUGIN_ID}`,
124
+ icon: PluginIcon,
125
+ intlLabel: {
126
+ id: `${PLUGIN_ID}.plugin.name`,
127
+ defaultMessage: PLUGIN_ID
128
+ },
129
+ Component: async () => {
130
+ const { App } = await Promise.resolve().then(() => require("./App-ot837BOf.js"));
131
+ return App;
132
+ }
133
+ });
134
+ app.widgets.register({
135
+ icon: icons.Globe,
136
+ title: {
137
+ id: `${PLUGIN_ID}.mentions-widget.title`,
138
+ defaultMessage: "Social Mentions"
139
+ },
140
+ component: () => Promise.resolve(MentionsWidget),
141
+ pluginId: PLUGIN_ID,
142
+ id: "mentions-widget"
143
+ });
144
+ app.registerPlugin({
145
+ id: PLUGIN_ID,
146
+ initializer: Initializer,
147
+ isReady: false,
148
+ name: PLUGIN_ID
149
+ });
150
+ },
151
+ async registerTrads({ locales }) {
152
+ return Promise.all(
153
+ locales.map(async (locale) => {
154
+ try {
155
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-B4KWt_jN.js")) }), `./translations/${locale}.json`, 3);
156
+ return { data, locale };
157
+ } catch {
158
+ return { data: {}, locale };
159
+ }
160
+ })
161
+ );
162
+ }
163
+ };
164
+ exports.MentionsTable = MentionsTable;
165
+ exports.index = index;
166
+ exports.useMentions = useMentions;
167
+ //# sourceMappingURL=index-Dtd5kXzE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Dtd5kXzE.js","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/PluginIcon.tsx","../../admin/src/constants.ts","../../admin/src/hooks/useMentions.ts","../../admin/src/components/MentionsTable/index.tsx","../../admin/src/components/MentionsWidget/index.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = 'octalens-mentions';\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import { PuzzlePiece } from '@strapi/icons';\n\nconst PluginIcon = () => <PuzzlePiece />;\n\nexport { PluginIcon };\n","const BASE_PATH = '/octalens-mentions';\n\nexport const CONSTANTS = {\n routes: {\n MENTIONS_URL: BASE_PATH + '/mentions',\n },\n};\n","import { useEffect, useState } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport type { IMention } from '../types';\nimport { CONSTANTS } from '../constants';\n\nexport function useMentions() {\n const { get } = useFetchClient();\n const [mentions, setMentions] = useState<IMention[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n const fetchMentions = async () => {\n try {\n setLoading(true);\n setError(null);\n const { data } = await get(CONSTANTS.routes.MENTIONS_URL);\n const mentions = data?.data;\n setMentions(mentions || []);\n } catch (error) {\n console.error('Error fetching mentions:', error);\n setError(error instanceof Error ? error : new Error('Failed to fetch mentions'));\n } finally {\n setLoading(false);\n }\n };\n\n fetchMentions();\n }, [get]);\n\n return { mentions, loading, error };\n}\n","import {\n Table,\n Thead,\n Tbody,\n Tr,\n Td,\n Th,\n Typography,\n Checkbox,\n VisuallyHidden,\n Flex,\n Box,\n IconButton,\n} from '@strapi/design-system';\nimport { Pencil, Trash } from '@strapi/icons';\nimport type { IMention } from '../../types';\n\nconst COL_COUNT = 7;\n\ninterface MentionsTableProps {\n readonly mentions: IMention[];\n}\n\nexport function MentionsTable({ mentions }: MentionsTableProps) {\n return (\n <Table colCount={COL_COUNT} rowCount={mentions.length}>\n <Thead>\n <Tr>\n <Th>\n <Checkbox aria-label=\"Select all entries\" />\n </Th>\n <Th>\n <Typography variant=\"sigma\">Title</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Source</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Keyword</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Relevance Score</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Comment</Typography>\n </Th>\n <Th>\n <VisuallyHidden>Actions</VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {mentions.map((mention) => (\n <Tr key={mention.documentId}>\n <Td>\n <Checkbox aria-label={`Select ${mention.title}`} />\n </Td>\n <Td>\n <Typography textColor=\"neutral800\" fontWeight=\"bold\">\n {mention.title || 'Untitled'}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.source}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.keyword}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.relevanceScore}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\" ellipsis>\n {mention.relevanceComment?.substring(0, 50)}\n {mention.relevanceComment?.length > 50 ? '...' : ''}\n </Typography>\n </Td>\n <Td>\n <Flex>\n <IconButton\n onClick={() => console.log('edit', mention.documentId)}\n label=\"Edit\"\n borderWidth={0}\n >\n <Pencil />\n </IconButton>\n <Box paddingLeft={1}>\n <IconButton\n onClick={() => console.log('delete', mention.documentId)}\n label=\"Delete\"\n borderWidth={0}\n >\n <Trash />\n </IconButton>\n </Box>\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n}\n","import { Box, Typography } from '@strapi/design-system';\nimport { useMentions } from '../../hooks/useMentions';\nimport { MentionsTable } from '../MentionsTable';\n\nexport function MentionsWidget() {\n const { mentions, loading, error } = useMentions();\n\n if (loading) {\n return (\n <Box padding={4}>\n <Typography>Loading mentions...</Typography>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box padding={4}>\n <Typography textColor=\"danger600\">Error: {error.message}</Typography>\n </Box>\n );\n }\n\n return (\n <Box padding={4}>\n <MentionsTable mentions={mentions} />\n </Box>\n );\n}\n","import { Globe } from \"@strapi/icons\";\n\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PluginIcon } from './components/PluginIcon';\nimport { MentionsWidget } from \"./components/MentionsWidget\";\n\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${PLUGIN_ID}`,\n icon: PluginIcon,\n intlLabel: {\n id: `${PLUGIN_ID}.plugin.name`,\n defaultMessage: PLUGIN_ID,\n },\n Component: async () => {\n const { App } = await import('./pages/App');\n\n return App;\n },\n });\n\n app.widgets.register({\n icon: Globe,\n title: {\n id: `${PLUGIN_ID}.mentions-widget.title`,\n defaultMessage: \"Social Mentions\"\n },\n component: () => Promise.resolve(MentionsWidget),\n pluginId: PLUGIN_ID,\n id: \"mentions-widget\"\n })\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n\n },\n\n async registerTrads({ locales }: { locales: string[] }) {\n return Promise.all(\n locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: {}, locale };\n }\n })\n );\n },\n};\n"],"names":["useRef","useEffect","jsx","PuzzlePiece","useFetchClient","useState","mentions","error","Table","Thead","Tr","Th","Checkbox","Typography","VisuallyHidden","Tbody","Td","jsxs","Flex","IconButton","Pencil","Box","Trash","Globe"],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { PuzzlePiece, Pencil, Trash, Globe } from "@strapi/icons";
2
+ import { useRef, useEffect, useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Table, Thead, Tr, Th, Checkbox, Typography, VisuallyHidden, Tbody, Td, Flex, IconButton, Box } from "@strapi/design-system";
5
+ import { useFetchClient } from "@strapi/strapi/admin";
6
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
7
+ const v = glob[path];
8
+ if (v) {
9
+ return typeof v === "function" ? v() : Promise.resolve(v);
10
+ }
11
+ return new Promise((_, reject) => {
12
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
13
+ reject.bind(
14
+ null,
15
+ new Error(
16
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
17
+ )
18
+ )
19
+ );
20
+ });
21
+ };
22
+ const PLUGIN_ID = "octalens-mentions";
23
+ const Initializer = ({ setPlugin }) => {
24
+ const ref = useRef(setPlugin);
25
+ useEffect(() => {
26
+ ref.current(PLUGIN_ID);
27
+ }, []);
28
+ return null;
29
+ };
30
+ const PluginIcon = () => /* @__PURE__ */ jsx(PuzzlePiece, {});
31
+ const BASE_PATH = "/octalens-mentions";
32
+ const CONSTANTS = {
33
+ routes: {
34
+ MENTIONS_URL: BASE_PATH + "/mentions"
35
+ }
36
+ };
37
+ function useMentions() {
38
+ const { get } = useFetchClient();
39
+ const [mentions, setMentions] = useState([]);
40
+ const [loading, setLoading] = useState(true);
41
+ const [error, setError] = useState(null);
42
+ useEffect(() => {
43
+ const fetchMentions = async () => {
44
+ try {
45
+ setLoading(true);
46
+ setError(null);
47
+ const { data } = await get(CONSTANTS.routes.MENTIONS_URL);
48
+ const mentions2 = data?.data;
49
+ setMentions(mentions2 || []);
50
+ } catch (error2) {
51
+ console.error("Error fetching mentions:", error2);
52
+ setError(error2 instanceof Error ? error2 : new Error("Failed to fetch mentions"));
53
+ } finally {
54
+ setLoading(false);
55
+ }
56
+ };
57
+ fetchMentions();
58
+ }, [get]);
59
+ return { mentions, loading, error };
60
+ }
61
+ const COL_COUNT = 7;
62
+ function MentionsTable({ mentions }) {
63
+ return /* @__PURE__ */ jsxs(Table, { colCount: COL_COUNT, rowCount: mentions.length, children: [
64
+ /* @__PURE__ */ jsx(Thead, { children: /* @__PURE__ */ jsxs(Tr, { children: [
65
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Checkbox, { "aria-label": "Select all entries" }) }),
66
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: "Title" }) }),
67
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: "Source" }) }),
68
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: "Keyword" }) }),
69
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: "Relevance Score" }) }),
70
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: "Comment" }) }),
71
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(VisuallyHidden, { children: "Actions" }) })
72
+ ] }) }),
73
+ /* @__PURE__ */ jsx(Tbody, { children: mentions.map((mention) => /* @__PURE__ */ jsxs(Tr, { children: [
74
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Checkbox, { "aria-label": `Select ${mention.title}` }) }),
75
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", fontWeight: "bold", children: mention.title || "Untitled" }) }),
76
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: mention.source }) }),
77
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: mention.keyword }) }),
78
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: mention.relevanceScore }) }),
79
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsxs(Typography, { textColor: "neutral600", ellipsis: true, children: [
80
+ mention.relevanceComment?.substring(0, 50),
81
+ mention.relevanceComment?.length > 50 ? "..." : ""
82
+ ] }) }),
83
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsxs(Flex, { children: [
84
+ /* @__PURE__ */ jsx(
85
+ IconButton,
86
+ {
87
+ onClick: () => console.log("edit", mention.documentId),
88
+ label: "Edit",
89
+ borderWidth: 0,
90
+ children: /* @__PURE__ */ jsx(Pencil, {})
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsx(Box, { paddingLeft: 1, children: /* @__PURE__ */ jsx(
94
+ IconButton,
95
+ {
96
+ onClick: () => console.log("delete", mention.documentId),
97
+ label: "Delete",
98
+ borderWidth: 0,
99
+ children: /* @__PURE__ */ jsx(Trash, {})
100
+ }
101
+ ) })
102
+ ] }) })
103
+ ] }, mention.documentId)) })
104
+ ] });
105
+ }
106
+ function MentionsWidget() {
107
+ const { mentions, loading, error } = useMentions();
108
+ if (loading) {
109
+ return /* @__PURE__ */ jsx(Box, { padding: 4, children: /* @__PURE__ */ jsx(Typography, { children: "Loading mentions..." }) });
110
+ }
111
+ if (error) {
112
+ return /* @__PURE__ */ jsx(Box, { padding: 4, children: /* @__PURE__ */ jsxs(Typography, { textColor: "danger600", children: [
113
+ "Error: ",
114
+ error.message
115
+ ] }) });
116
+ }
117
+ return /* @__PURE__ */ jsx(Box, { padding: 4, children: /* @__PURE__ */ jsx(MentionsTable, { mentions }) });
118
+ }
119
+ const index = {
120
+ register(app) {
121
+ app.addMenuLink({
122
+ to: `plugins/${PLUGIN_ID}`,
123
+ icon: PluginIcon,
124
+ intlLabel: {
125
+ id: `${PLUGIN_ID}.plugin.name`,
126
+ defaultMessage: PLUGIN_ID
127
+ },
128
+ Component: async () => {
129
+ const { App } = await import("./App-DzHKWBmE.mjs");
130
+ return App;
131
+ }
132
+ });
133
+ app.widgets.register({
134
+ icon: Globe,
135
+ title: {
136
+ id: `${PLUGIN_ID}.mentions-widget.title`,
137
+ defaultMessage: "Social Mentions"
138
+ },
139
+ component: () => Promise.resolve(MentionsWidget),
140
+ pluginId: PLUGIN_ID,
141
+ id: "mentions-widget"
142
+ });
143
+ app.registerPlugin({
144
+ id: PLUGIN_ID,
145
+ initializer: Initializer,
146
+ isReady: false,
147
+ name: PLUGIN_ID
148
+ });
149
+ },
150
+ async registerTrads({ locales }) {
151
+ return Promise.all(
152
+ locales.map(async (locale) => {
153
+ try {
154
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-Byx4XI2L.mjs") }), `./translations/${locale}.json`, 3);
155
+ return { data, locale };
156
+ } catch {
157
+ return { data: {}, locale };
158
+ }
159
+ })
160
+ );
161
+ }
162
+ };
163
+ export {
164
+ MentionsTable as M,
165
+ index as i,
166
+ useMentions as u
167
+ };
168
+ //# sourceMappingURL=index-HmV1XMES.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-HmV1XMES.mjs","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/PluginIcon.tsx","../../admin/src/constants.ts","../../admin/src/hooks/useMentions.ts","../../admin/src/components/MentionsTable/index.tsx","../../admin/src/components/MentionsWidget/index.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = 'octalens-mentions';\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import { PuzzlePiece } from '@strapi/icons';\n\nconst PluginIcon = () => <PuzzlePiece />;\n\nexport { PluginIcon };\n","const BASE_PATH = '/octalens-mentions';\n\nexport const CONSTANTS = {\n routes: {\n MENTIONS_URL: BASE_PATH + '/mentions',\n },\n};\n","import { useEffect, useState } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport type { IMention } from '../types';\nimport { CONSTANTS } from '../constants';\n\nexport function useMentions() {\n const { get } = useFetchClient();\n const [mentions, setMentions] = useState<IMention[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n const fetchMentions = async () => {\n try {\n setLoading(true);\n setError(null);\n const { data } = await get(CONSTANTS.routes.MENTIONS_URL);\n const mentions = data?.data;\n setMentions(mentions || []);\n } catch (error) {\n console.error('Error fetching mentions:', error);\n setError(error instanceof Error ? error : new Error('Failed to fetch mentions'));\n } finally {\n setLoading(false);\n }\n };\n\n fetchMentions();\n }, [get]);\n\n return { mentions, loading, error };\n}\n","import {\n Table,\n Thead,\n Tbody,\n Tr,\n Td,\n Th,\n Typography,\n Checkbox,\n VisuallyHidden,\n Flex,\n Box,\n IconButton,\n} from '@strapi/design-system';\nimport { Pencil, Trash } from '@strapi/icons';\nimport type { IMention } from '../../types';\n\nconst COL_COUNT = 7;\n\ninterface MentionsTableProps {\n readonly mentions: IMention[];\n}\n\nexport function MentionsTable({ mentions }: MentionsTableProps) {\n return (\n <Table colCount={COL_COUNT} rowCount={mentions.length}>\n <Thead>\n <Tr>\n <Th>\n <Checkbox aria-label=\"Select all entries\" />\n </Th>\n <Th>\n <Typography variant=\"sigma\">Title</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Source</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Keyword</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Relevance Score</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Comment</Typography>\n </Th>\n <Th>\n <VisuallyHidden>Actions</VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {mentions.map((mention) => (\n <Tr key={mention.documentId}>\n <Td>\n <Checkbox aria-label={`Select ${mention.title}`} />\n </Td>\n <Td>\n <Typography textColor=\"neutral800\" fontWeight=\"bold\">\n {mention.title || 'Untitled'}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.source}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.keyword}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.relevanceScore}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\" ellipsis>\n {mention.relevanceComment?.substring(0, 50)}\n {mention.relevanceComment?.length > 50 ? '...' : ''}\n </Typography>\n </Td>\n <Td>\n <Flex>\n <IconButton\n onClick={() => console.log('edit', mention.documentId)}\n label=\"Edit\"\n borderWidth={0}\n >\n <Pencil />\n </IconButton>\n <Box paddingLeft={1}>\n <IconButton\n onClick={() => console.log('delete', mention.documentId)}\n label=\"Delete\"\n borderWidth={0}\n >\n <Trash />\n </IconButton>\n </Box>\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n}\n","import { Box, Typography } from '@strapi/design-system';\nimport { useMentions } from '../../hooks/useMentions';\nimport { MentionsTable } from '../MentionsTable';\n\nexport function MentionsWidget() {\n const { mentions, loading, error } = useMentions();\n\n if (loading) {\n return (\n <Box padding={4}>\n <Typography>Loading mentions...</Typography>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box padding={4}>\n <Typography textColor=\"danger600\">Error: {error.message}</Typography>\n </Box>\n );\n }\n\n return (\n <Box padding={4}>\n <MentionsTable mentions={mentions} />\n </Box>\n );\n}\n","import { Globe } from \"@strapi/icons\";\n\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PluginIcon } from './components/PluginIcon';\nimport { MentionsWidget } from \"./components/MentionsWidget\";\n\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${PLUGIN_ID}`,\n icon: PluginIcon,\n intlLabel: {\n id: `${PLUGIN_ID}.plugin.name`,\n defaultMessage: PLUGIN_ID,\n },\n Component: async () => {\n const { App } = await import('./pages/App');\n\n return App;\n },\n });\n\n app.widgets.register({\n icon: Globe,\n title: {\n id: `${PLUGIN_ID}.mentions-widget.title`,\n defaultMessage: \"Social Mentions\"\n },\n component: () => Promise.resolve(MentionsWidget),\n pluginId: PLUGIN_ID,\n id: \"mentions-widget\"\n })\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n\n },\n\n async registerTrads({ locales }: { locales: string[] }) {\n return Promise.all(\n locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: {}, locale };\n }\n })\n );\n },\n};\n"],"names":["mentions","error"],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ const icons = require("@strapi/icons");
3
+ const react = require("react");
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const designSystem = require("@strapi/design-system");
6
+ const admin = require("@strapi/strapi/admin");
7
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
8
+ const v = glob[path];
9
+ if (v) {
10
+ return typeof v === "function" ? v() : Promise.resolve(v);
11
+ }
12
+ return new Promise((_, reject) => {
13
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
14
+ reject.bind(
15
+ null,
16
+ new Error(
17
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
18
+ )
19
+ )
20
+ );
21
+ });
22
+ };
23
+ const PLUGIN_ID = "octalens-mentions";
24
+ const Initializer = ({ setPlugin }) => {
25
+ const ref = react.useRef(setPlugin);
26
+ react.useEffect(() => {
27
+ ref.current(PLUGIN_ID);
28
+ }, []);
29
+ return null;
30
+ };
31
+ const PluginIcon = () => /* @__PURE__ */ jsxRuntime.jsx(icons.Globe, {});
32
+ const BASE_PATH = "/octalens-mentions";
33
+ const CONSTANTS = {
34
+ routes: {
35
+ MENTIONS_URL: BASE_PATH + "/mentions"
36
+ }
37
+ };
38
+ function useMentions() {
39
+ const { get } = admin.useFetchClient();
40
+ const [mentions, setMentions] = react.useState([]);
41
+ const [loading, setLoading] = react.useState(true);
42
+ const [error, setError] = react.useState(null);
43
+ react.useEffect(() => {
44
+ const fetchMentions = async () => {
45
+ try {
46
+ setLoading(true);
47
+ setError(null);
48
+ const { data } = await get(CONSTANTS.routes.MENTIONS_URL);
49
+ const mentions2 = data?.data;
50
+ setMentions(mentions2 || []);
51
+ } catch (error2) {
52
+ console.error("Error fetching mentions:", error2);
53
+ setError(error2 instanceof Error ? error2 : new Error("Failed to fetch mentions"));
54
+ } finally {
55
+ setLoading(false);
56
+ }
57
+ };
58
+ fetchMentions();
59
+ }, [get]);
60
+ return { mentions, loading, error };
61
+ }
62
+ const COL_COUNT = 7;
63
+ function MentionsTable({ mentions }) {
64
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Table, { colCount: COL_COUNT, rowCount: mentions.length, children: [
65
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Thead, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
66
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Checkbox, { "aria-label": "Select all entries" }) }),
67
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Title" }) }),
68
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Source" }) }),
69
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Keyword" }) }),
70
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Relevance Score" }) }),
71
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: "Comment" }) }),
72
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { children: "Actions" }) })
73
+ ] }) }),
74
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tbody, { children: mentions.map((mention) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
75
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Checkbox, { "aria-label": `Select ${mention.title}` }) }),
76
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", fontWeight: "bold", children: mention.title || "Untitled" }) }),
77
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: mention.source }) }),
78
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: mention.keyword }) }),
79
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: mention.relevanceScore }) }),
80
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { textColor: "neutral600", ellipsis: true, children: [
81
+ mention.relevanceComment?.substring(0, 50),
82
+ mention.relevanceComment?.length > 50 ? "..." : ""
83
+ ] }) }),
84
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
85
+ /* @__PURE__ */ jsxRuntime.jsx(
86
+ designSystem.IconButton,
87
+ {
88
+ onClick: () => console.log("edit", mention.documentId),
89
+ label: "Edit",
90
+ borderWidth: 0,
91
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
92
+ }
93
+ ),
94
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: /* @__PURE__ */ jsxRuntime.jsx(
95
+ designSystem.IconButton,
96
+ {
97
+ onClick: () => console.log("delete", mention.documentId),
98
+ label: "Delete",
99
+ borderWidth: 0,
100
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
101
+ }
102
+ ) })
103
+ ] }) })
104
+ ] }, mention.documentId)) })
105
+ ] });
106
+ }
107
+ function MentionsWidget() {
108
+ const { mentions, loading, error } = useMentions();
109
+ if (loading) {
110
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: "Loading mentions..." }) });
111
+ }
112
+ if (error) {
113
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { textColor: "danger600", children: [
114
+ "Error: ",
115
+ error.message
116
+ ] }) });
117
+ }
118
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 4, children: /* @__PURE__ */ jsxRuntime.jsx(MentionsTable, { mentions }) });
119
+ }
120
+ const index = {
121
+ register(app) {
122
+ app.addMenuLink({
123
+ to: `plugins/${PLUGIN_ID}`,
124
+ icon: PluginIcon,
125
+ intlLabel: {
126
+ id: `${PLUGIN_ID}.plugin.name`,
127
+ defaultMessage: PLUGIN_ID
128
+ },
129
+ Component: async () => {
130
+ const { App } = await Promise.resolve().then(() => require("./App-CPej22xb.js"));
131
+ return App;
132
+ }
133
+ });
134
+ app.widgets.register({
135
+ icon: icons.Globe,
136
+ title: {
137
+ id: `${PLUGIN_ID}.mentions-widget.title`,
138
+ defaultMessage: "Social Mentions"
139
+ },
140
+ component: () => Promise.resolve(MentionsWidget),
141
+ pluginId: PLUGIN_ID,
142
+ id: "mentions-widget"
143
+ });
144
+ app.registerPlugin({
145
+ id: PLUGIN_ID,
146
+ initializer: Initializer,
147
+ isReady: false,
148
+ name: PLUGIN_ID
149
+ });
150
+ },
151
+ async registerTrads({ locales }) {
152
+ return Promise.all(
153
+ locales.map(async (locale) => {
154
+ try {
155
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-B4KWt_jN.js")) }), `./translations/${locale}.json`, 3);
156
+ return { data, locale };
157
+ } catch {
158
+ return { data: {}, locale };
159
+ }
160
+ })
161
+ );
162
+ }
163
+ };
164
+ exports.MentionsTable = MentionsTable;
165
+ exports.index = index;
166
+ exports.useMentions = useMentions;
167
+ //# sourceMappingURL=index-MjmrX_qB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-MjmrX_qB.js","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/PluginIcon.tsx","../../admin/src/constants.ts","../../admin/src/hooks/useMentions.ts","../../admin/src/components/MentionsTable/index.tsx","../../admin/src/components/MentionsWidget/index.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = 'octalens-mentions';\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import { Globe } from '@strapi/icons';\n\nconst PluginIcon = () => <Globe />;\n\nexport { PluginIcon };\n","const BASE_PATH = '/octalens-mentions';\n\nexport const CONSTANTS = {\n routes: {\n MENTIONS_URL: BASE_PATH + '/mentions',\n },\n};\n","import { useEffect, useState } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport type { IMention } from '../types';\nimport { CONSTANTS } from '../constants';\n\nexport function useMentions() {\n const { get } = useFetchClient();\n const [mentions, setMentions] = useState<IMention[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n const fetchMentions = async () => {\n try {\n setLoading(true);\n setError(null);\n const { data } = await get(CONSTANTS.routes.MENTIONS_URL);\n const mentions = data?.data;\n setMentions(mentions || []);\n } catch (error) {\n console.error('Error fetching mentions:', error);\n setError(error instanceof Error ? error : new Error('Failed to fetch mentions'));\n } finally {\n setLoading(false);\n }\n };\n\n fetchMentions();\n }, [get]);\n\n return { mentions, loading, error };\n}\n","import {\n Table,\n Thead,\n Tbody,\n Tr,\n Td,\n Th,\n Typography,\n Checkbox,\n VisuallyHidden,\n Flex,\n Box,\n IconButton,\n} from '@strapi/design-system';\nimport { Pencil, Trash } from '@strapi/icons';\nimport type { IMention } from '../../types';\n\nconst COL_COUNT = 7;\n\ninterface MentionsTableProps {\n readonly mentions: IMention[];\n}\n\nexport function MentionsTable({ mentions }: MentionsTableProps) {\n return (\n <Table colCount={COL_COUNT} rowCount={mentions.length}>\n <Thead>\n <Tr>\n <Th>\n <Checkbox aria-label=\"Select all entries\" />\n </Th>\n <Th>\n <Typography variant=\"sigma\">Title</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Source</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Keyword</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Relevance Score</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Comment</Typography>\n </Th>\n <Th>\n <VisuallyHidden>Actions</VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {mentions.map((mention) => (\n <Tr key={mention.documentId}>\n <Td>\n <Checkbox aria-label={`Select ${mention.title}`} />\n </Td>\n <Td>\n <Typography textColor=\"neutral800\" fontWeight=\"bold\">\n {mention.title || 'Untitled'}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.source}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.keyword}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{mention.relevanceScore}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\" ellipsis>\n {mention.relevanceComment?.substring(0, 50)}\n {mention.relevanceComment?.length > 50 ? '...' : ''}\n </Typography>\n </Td>\n <Td>\n <Flex>\n <IconButton\n onClick={() => console.log('edit', mention.documentId)}\n label=\"Edit\"\n borderWidth={0}\n >\n <Pencil />\n </IconButton>\n <Box paddingLeft={1}>\n <IconButton\n onClick={() => console.log('delete', mention.documentId)}\n label=\"Delete\"\n borderWidth={0}\n >\n <Trash />\n </IconButton>\n </Box>\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n}\n","import { Box, Typography } from '@strapi/design-system';\nimport { useMentions } from '../../hooks/useMentions';\nimport { MentionsTable } from '../MentionsTable';\n\nexport function MentionsWidget() {\n const { mentions, loading, error } = useMentions();\n\n if (loading) {\n return (\n <Box padding={4}>\n <Typography>Loading mentions...</Typography>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box padding={4}>\n <Typography textColor=\"danger600\">Error: {error.message}</Typography>\n </Box>\n );\n }\n\n return (\n <Box padding={4}>\n <MentionsTable mentions={mentions} />\n </Box>\n );\n}\n","import { Globe } from \"@strapi/icons\";\n\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PluginIcon } from './components/PluginIcon';\nimport { MentionsWidget } from \"./components/MentionsWidget\";\n\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${PLUGIN_ID}`,\n icon: PluginIcon,\n intlLabel: {\n id: `${PLUGIN_ID}.plugin.name`,\n defaultMessage: PLUGIN_ID,\n },\n Component: async () => {\n const { App } = await import('./pages/App');\n\n return App;\n },\n });\n\n app.widgets.register({\n icon: Globe,\n title: {\n id: `${PLUGIN_ID}.mentions-widget.title`,\n defaultMessage: \"Social Mentions\"\n },\n component: () => Promise.resolve(MentionsWidget),\n pluginId: PLUGIN_ID,\n id: \"mentions-widget\"\n })\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n\n },\n\n async registerTrads({ locales }: { locales: string[] }) {\n return Promise.all(\n locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: {}, locale };\n }\n })\n );\n },\n};\n"],"names":["useRef","useEffect","jsx","Globe","useFetchClient","useState","mentions","error","Table","Thead","Tr","Th","Checkbox","Typography","VisuallyHidden","Tbody","Td","jsxs","Flex","IconButton","Pencil","Box","Trash"],"mappings":"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"}