@strapi/content-type-builder 5.31.3 → 5.32.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/dist/admin/components/AIChat/Chat.js +3 -1
- package/dist/admin/components/AIChat/Chat.js.map +1 -1
- package/dist/admin/components/AIChat/Chat.mjs +4 -2
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -1
- package/dist/admin/components/AIChat/hooks/useFeedback.js +4 -1
- package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs +5 -2
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.js +3 -2
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +3 -2
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
- package/dist/admin/components/CTBSession/CTBSessionProvider.js +49 -0
- package/dist/admin/components/CTBSession/CTBSessionProvider.js.map +1 -0
- package/dist/admin/components/CTBSession/CTBSessionProvider.mjs +46 -0
- package/dist/admin/components/CTBSession/CTBSessionProvider.mjs.map +1 -0
- package/dist/admin/components/CTBSession/sessionContext.js +8 -0
- package/dist/admin/components/CTBSession/sessionContext.js.map +1 -0
- package/dist/admin/components/CTBSession/sessionContext.mjs +6 -0
- package/dist/admin/components/CTBSession/sessionContext.mjs.map +1 -0
- package/dist/admin/components/CTBSession/useCTBSession.js +25 -0
- package/dist/admin/components/CTBSession/useCTBSession.js.map +1 -0
- package/dist/admin/components/CTBSession/useCTBSession.mjs +23 -0
- package/dist/admin/components/CTBSession/useCTBSession.mjs.map +1 -0
- package/dist/admin/components/CTBSession/useCTBTracking.js +37 -0
- package/dist/admin/components/CTBSession/useCTBTracking.js.map +1 -0
- package/dist/admin/components/CTBSession/useCTBTracking.mjs +35 -0
- package/dist/admin/components/CTBSession/useCTBTracking.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +4 -2
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +4 -2
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +40 -3
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +41 -4
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js +3 -1
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +4 -2
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js +14 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs +14 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs.map +1 -1
- package/dist/admin/components/List.js +3 -1
- package/dist/admin/components/List.js.map +1 -1
- package/dist/admin/components/List.mjs +4 -2
- package/dist/admin/components/List.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +40 -37
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +40 -37
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListView.js +10 -1
- package/dist/admin/pages/ListView/ListView.js.map +1 -1
- package/dist/admin/pages/ListView/ListView.mjs +11 -2
- package/dist/admin/pages/ListView/ListView.mjs.map +1 -1
- package/dist/admin/src/components/CTBSession/CTBSessionProvider.d.ts +26 -0
- package/dist/admin/src/components/CTBSession/ctbSession.d.ts +5 -0
- package/dist/admin/src/components/CTBSession/sessionContext.d.ts +25 -0
- package/dist/admin/src/components/CTBSession/useCTBSession.d.ts +12 -0
- package/dist/admin/src/components/CTBSession/useCTBTracking.d.ts +13 -0
- package/dist/server/controllers/content-types.js +6 -0
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +6 -0
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/validation/types.js +1 -1
- package/dist/server/controllers/validation/types.js.map +1 -1
- package/dist/server/controllers/validation/types.mjs +1 -1
- package/dist/server/controllers/validation/types.mjs.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatProvider.mjs","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChatProvider.mjs","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useCTBTracking } from '../../CTBSession/ctbSession';\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useCTBTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useCTBTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var sessionContext = require('./sessionContext.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Generates a unique session identifier for CTB tracking
|
|
9
|
+
* Uses crypto.randomUUID() for guaranteed uniqueness and readability
|
|
10
|
+
*
|
|
11
|
+
* @returns Session ID in format: ctb-{uuid}
|
|
12
|
+
*/ const generateSessionId = ()=>{
|
|
13
|
+
if (crypto.randomUUID) {
|
|
14
|
+
return `ctb-${crypto.randomUUID()}`;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Provider for CTB session tracking context.
|
|
19
|
+
*
|
|
20
|
+
* This provider should wrap components that need to track CTB events with session IDs.
|
|
21
|
+
* It manages the session ID lifecycle and provides methods to regenerate it when needed.
|
|
22
|
+
*
|
|
23
|
+
* Usage:
|
|
24
|
+
* ```tsx
|
|
25
|
+
* <CTBSessionProvider>
|
|
26
|
+
* {children}
|
|
27
|
+
* </CTBSessionProvider>
|
|
28
|
+
* ```
|
|
29
|
+
*/ const CTBSessionProvider = ({ children })=>{
|
|
30
|
+
const [sessionId, setSessionId] = React.useState(()=>generateSessionId());
|
|
31
|
+
const regenerateSessionId = React.useCallback(()=>{
|
|
32
|
+
setSessionId(generateSessionId());
|
|
33
|
+
}, []);
|
|
34
|
+
const value = React.useMemo(()=>({
|
|
35
|
+
sessionId,
|
|
36
|
+
regenerateSessionId
|
|
37
|
+
}), [
|
|
38
|
+
sessionId,
|
|
39
|
+
regenerateSessionId
|
|
40
|
+
]);
|
|
41
|
+
return /*#__PURE__*/ jsxRuntime.jsx(sessionContext.CTBSessionContext.Provider, {
|
|
42
|
+
value: value,
|
|
43
|
+
children: children
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
exports.CTBSessionProvider = CTBSessionProvider;
|
|
48
|
+
exports.generateSessionId = generateSessionId;
|
|
49
|
+
//# sourceMappingURL=CTBSessionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CTBSessionProvider.js","sources":["../../../../admin/src/components/CTBSession/CTBSessionProvider.tsx"],"sourcesContent":["import { useState, useCallback, useMemo, type ReactNode } from 'react';\n\nimport { CTBSessionContext } from './sessionContext';\n\ninterface CTBSessionProviderProps {\n children: ReactNode;\n}\n\n/**\n * Generates a unique session identifier for CTB tracking\n * Uses crypto.randomUUID() for guaranteed uniqueness and readability\n *\n * @returns Session ID in format: ctb-{uuid}\n */\nexport const generateSessionId = (): string | undefined => {\n if (crypto.randomUUID) {\n return `ctb-${crypto.randomUUID()}`;\n }\n};\n\n/**\n * Provider for CTB session tracking context.\n *\n * This provider should wrap components that need to track CTB events with session IDs.\n * It manages the session ID lifecycle and provides methods to regenerate it when needed.\n *\n * Usage:\n * ```tsx\n * <CTBSessionProvider>\n * {children}\n * </CTBSessionProvider>\n * ```\n */\nexport const CTBSessionProvider = ({ children }: CTBSessionProviderProps) => {\n const [sessionId, setSessionId] = useState(() => generateSessionId());\n\n const regenerateSessionId = useCallback(() => {\n setSessionId(generateSessionId());\n }, []);\n\n const value = useMemo(\n () => ({\n sessionId,\n regenerateSessionId,\n }),\n [sessionId, regenerateSessionId]\n );\n\n return <CTBSessionContext.Provider value={value}>{children}</CTBSessionContext.Provider>;\n};\n"],"names":["generateSessionId","crypto","randomUUID","CTBSessionProvider","children","sessionId","setSessionId","useState","regenerateSessionId","useCallback","value","useMemo","_jsx","CTBSessionContext","Provider"],"mappings":";;;;;;AAQA;;;;;UAMaA,iBAAoB,GAAA,IAAA;IAC/B,IAAIC,MAAAA,CAAOC,UAAU,EAAE;AACrB,QAAA,OAAO,CAAC,IAAI,EAAED,MAAAA,CAAOC,UAAU,EAAI,CAAA,CAAA;AACrC;AACF;AAEA;;;;;;;;;;;;AAYC,IACYC,MAAAA,kBAAAA,GAAqB,CAAC,EAAEC,QAAQ,EAA2B,GAAA;AACtE,IAAA,MAAM,CAACC,SAAAA,EAAWC,YAAa,CAAA,GAAGC,eAAS,IAAMP,iBAAAA,EAAAA,CAAAA;AAEjD,IAAA,MAAMQ,sBAAsBC,iBAAY,CAAA,IAAA;QACtCH,YAAaN,CAAAA,iBAAAA,EAAAA,CAAAA;AACf,KAAA,EAAG,EAAE,CAAA;IAEL,MAAMU,KAAAA,GAAQC,aACZ,CAAA,KAAO;AACLN,YAAAA,SAAAA;AACAG,YAAAA;AACF,SAAA,CACA,EAAA;AAACH,QAAAA,SAAAA;AAAWG,QAAAA;AAAoB,KAAA,CAAA;IAGlC,qBAAOI,cAAA,CAACC,iCAAkBC,QAAQ,EAAA;QAACJ,KAAOA,EAAAA,KAAAA;AAAQN,QAAAA,QAAAA,EAAAA;;AACpD;;;;;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
3
|
+
import { CTBSessionContext } from './sessionContext.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Generates a unique session identifier for CTB tracking
|
|
7
|
+
* Uses crypto.randomUUID() for guaranteed uniqueness and readability
|
|
8
|
+
*
|
|
9
|
+
* @returns Session ID in format: ctb-{uuid}
|
|
10
|
+
*/ const generateSessionId = ()=>{
|
|
11
|
+
if (crypto.randomUUID) {
|
|
12
|
+
return `ctb-${crypto.randomUUID()}`;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Provider for CTB session tracking context.
|
|
17
|
+
*
|
|
18
|
+
* This provider should wrap components that need to track CTB events with session IDs.
|
|
19
|
+
* It manages the session ID lifecycle and provides methods to regenerate it when needed.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <CTBSessionProvider>
|
|
24
|
+
* {children}
|
|
25
|
+
* </CTBSessionProvider>
|
|
26
|
+
* ```
|
|
27
|
+
*/ const CTBSessionProvider = ({ children })=>{
|
|
28
|
+
const [sessionId, setSessionId] = useState(()=>generateSessionId());
|
|
29
|
+
const regenerateSessionId = useCallback(()=>{
|
|
30
|
+
setSessionId(generateSessionId());
|
|
31
|
+
}, []);
|
|
32
|
+
const value = useMemo(()=>({
|
|
33
|
+
sessionId,
|
|
34
|
+
regenerateSessionId
|
|
35
|
+
}), [
|
|
36
|
+
sessionId,
|
|
37
|
+
regenerateSessionId
|
|
38
|
+
]);
|
|
39
|
+
return /*#__PURE__*/ jsx(CTBSessionContext.Provider, {
|
|
40
|
+
value: value,
|
|
41
|
+
children: children
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export { CTBSessionProvider, generateSessionId };
|
|
46
|
+
//# sourceMappingURL=CTBSessionProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CTBSessionProvider.mjs","sources":["../../../../admin/src/components/CTBSession/CTBSessionProvider.tsx"],"sourcesContent":["import { useState, useCallback, useMemo, type ReactNode } from 'react';\n\nimport { CTBSessionContext } from './sessionContext';\n\ninterface CTBSessionProviderProps {\n children: ReactNode;\n}\n\n/**\n * Generates a unique session identifier for CTB tracking\n * Uses crypto.randomUUID() for guaranteed uniqueness and readability\n *\n * @returns Session ID in format: ctb-{uuid}\n */\nexport const generateSessionId = (): string | undefined => {\n if (crypto.randomUUID) {\n return `ctb-${crypto.randomUUID()}`;\n }\n};\n\n/**\n * Provider for CTB session tracking context.\n *\n * This provider should wrap components that need to track CTB events with session IDs.\n * It manages the session ID lifecycle and provides methods to regenerate it when needed.\n *\n * Usage:\n * ```tsx\n * <CTBSessionProvider>\n * {children}\n * </CTBSessionProvider>\n * ```\n */\nexport const CTBSessionProvider = ({ children }: CTBSessionProviderProps) => {\n const [sessionId, setSessionId] = useState(() => generateSessionId());\n\n const regenerateSessionId = useCallback(() => {\n setSessionId(generateSessionId());\n }, []);\n\n const value = useMemo(\n () => ({\n sessionId,\n regenerateSessionId,\n }),\n [sessionId, regenerateSessionId]\n );\n\n return <CTBSessionContext.Provider value={value}>{children}</CTBSessionContext.Provider>;\n};\n"],"names":["generateSessionId","crypto","randomUUID","CTBSessionProvider","children","sessionId","setSessionId","useState","regenerateSessionId","useCallback","value","useMemo","_jsx","CTBSessionContext","Provider"],"mappings":";;;;AAQA;;;;;UAMaA,iBAAoB,GAAA,IAAA;IAC/B,IAAIC,MAAAA,CAAOC,UAAU,EAAE;AACrB,QAAA,OAAO,CAAC,IAAI,EAAED,MAAAA,CAAOC,UAAU,EAAI,CAAA,CAAA;AACrC;AACF;AAEA;;;;;;;;;;;;AAYC,IACYC,MAAAA,kBAAAA,GAAqB,CAAC,EAAEC,QAAQ,EAA2B,GAAA;AACtE,IAAA,MAAM,CAACC,SAAAA,EAAWC,YAAa,CAAA,GAAGC,SAAS,IAAMP,iBAAAA,EAAAA,CAAAA;AAEjD,IAAA,MAAMQ,sBAAsBC,WAAY,CAAA,IAAA;QACtCH,YAAaN,CAAAA,iBAAAA,EAAAA,CAAAA;AACf,KAAA,EAAG,EAAE,CAAA;IAEL,MAAMU,KAAAA,GAAQC,OACZ,CAAA,KAAO;AACLN,YAAAA,SAAAA;AACAG,YAAAA;AACF,SAAA,CACA,EAAA;AAACH,QAAAA,SAAAA;AAAWG,QAAAA;AAAoB,KAAA,CAAA;IAGlC,qBAAOI,GAAA,CAACC,kBAAkBC,QAAQ,EAAA;QAACJ,KAAOA,EAAAA,KAAAA;AAAQN,QAAAA,QAAAA,EAAAA;;AACpD;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionContext.js","sources":["../../../../admin/src/components/CTBSession/sessionContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\n/**\n * Context for managing CTB (Content Type Builder) session tracking.\n *\n * Session Lifecycle:\n * - Created: When CTBSessionProvider mounts\n * - Regenerated: After server restart, when navigating back to CTB from another page\n * - Used: Automatically attached to all CTB tracking events\n *\n * The session ID groups related tracking events together to understand user workflows\n * within a single CTB session.\n */\nexport interface CTBSessionContextValue {\n /**\n * Unique identifier for the current CTB session\n * Format: ctb-{uuid}\n */\n sessionId: string | undefined;\n\n /**\n * Generates and sets a new session ID\n * Called when starting a new CTB session (e.g., after navigation or server restart)\n */\n regenerateSessionId: () => void;\n}\n\nexport const CTBSessionContext = createContext<CTBSessionContextValue | null>(null);\n"],"names":["CTBSessionContext","createContext"],"mappings":";;;;AA2BO,MAAMA,iBAAoBC,GAAAA,mBAAAA,CAA6C,IAAM;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionContext.mjs","sources":["../../../../admin/src/components/CTBSession/sessionContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\n/**\n * Context for managing CTB (Content Type Builder) session tracking.\n *\n * Session Lifecycle:\n * - Created: When CTBSessionProvider mounts\n * - Regenerated: After server restart, when navigating back to CTB from another page\n * - Used: Automatically attached to all CTB tracking events\n *\n * The session ID groups related tracking events together to understand user workflows\n * within a single CTB session.\n */\nexport interface CTBSessionContextValue {\n /**\n * Unique identifier for the current CTB session\n * Format: ctb-{uuid}\n */\n sessionId: string | undefined;\n\n /**\n * Generates and sets a new session ID\n * Called when starting a new CTB session (e.g., after navigation or server restart)\n */\n regenerateSessionId: () => void;\n}\n\nexport const CTBSessionContext = createContext<CTBSessionContextValue | null>(null);\n"],"names":["CTBSessionContext","createContext"],"mappings":";;AA2BO,MAAMA,iBAAoBC,GAAAA,aAAAA,CAA6C,IAAM;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var sessionContext = require('./sessionContext.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hook to access the current CTB session context.
|
|
8
|
+
*
|
|
9
|
+
* @throws Error if used outside of CTBSessionProvider
|
|
10
|
+
* @returns The CTB session context containing sessionId and regenerateSessionId
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* const { sessionId, regenerateSessionId } = useCTBSession();
|
|
15
|
+
* ```
|
|
16
|
+
*/ const useCTBSession = ()=>{
|
|
17
|
+
const context = React.useContext(sessionContext.CTBSessionContext);
|
|
18
|
+
if (!context) {
|
|
19
|
+
throw new Error('useCTBSession must be used within a CTBSessionProvider');
|
|
20
|
+
}
|
|
21
|
+
return context;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
exports.useCTBSession = useCTBSession;
|
|
25
|
+
//# sourceMappingURL=useCTBSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCTBSession.js","sources":["../../../../admin/src/components/CTBSession/useCTBSession.ts"],"sourcesContent":["import { useContext } from 'react';\n\nimport { CTBSessionContext } from './sessionContext';\n\n/**\n * Hook to access the current CTB session context.\n *\n * @throws Error if used outside of CTBSessionProvider\n * @returns The CTB session context containing sessionId and regenerateSessionId\n *\n * @example\n * ```tsx\n * const { sessionId, regenerateSessionId } = useCTBSession();\n * ```\n */\nexport const useCTBSession = () => {\n const context = useContext(CTBSessionContext);\n\n if (!context) {\n throw new Error('useCTBSession must be used within a CTBSessionProvider');\n }\n\n return context;\n};\n"],"names":["useCTBSession","context","useContext","CTBSessionContext","Error"],"mappings":";;;;;AAIA;;;;;;;;;;UAWaA,aAAgB,GAAA,IAAA;AAC3B,IAAA,MAAMC,UAAUC,gBAAWC,CAAAA,gCAAAA,CAAAA;AAE3B,IAAA,IAAI,CAACF,OAAS,EAAA;AACZ,QAAA,MAAM,IAAIG,KAAM,CAAA,wDAAA,CAAA;AAClB;IAEA,OAAOH,OAAAA;AACT;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { CTBSessionContext } from './sessionContext.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook to access the current CTB session context.
|
|
6
|
+
*
|
|
7
|
+
* @throws Error if used outside of CTBSessionProvider
|
|
8
|
+
* @returns The CTB session context containing sessionId and regenerateSessionId
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* const { sessionId, regenerateSessionId } = useCTBSession();
|
|
13
|
+
* ```
|
|
14
|
+
*/ const useCTBSession = ()=>{
|
|
15
|
+
const context = useContext(CTBSessionContext);
|
|
16
|
+
if (!context) {
|
|
17
|
+
throw new Error('useCTBSession must be used within a CTBSessionProvider');
|
|
18
|
+
}
|
|
19
|
+
return context;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { useCTBSession };
|
|
23
|
+
//# sourceMappingURL=useCTBSession.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCTBSession.mjs","sources":["../../../../admin/src/components/CTBSession/useCTBSession.ts"],"sourcesContent":["import { useContext } from 'react';\n\nimport { CTBSessionContext } from './sessionContext';\n\n/**\n * Hook to access the current CTB session context.\n *\n * @throws Error if used outside of CTBSessionProvider\n * @returns The CTB session context containing sessionId and regenerateSessionId\n *\n * @example\n * ```tsx\n * const { sessionId, regenerateSessionId } = useCTBSession();\n * ```\n */\nexport const useCTBSession = () => {\n const context = useContext(CTBSessionContext);\n\n if (!context) {\n throw new Error('useCTBSession must be used within a CTBSessionProvider');\n }\n\n return context;\n};\n"],"names":["useCTBSession","context","useContext","CTBSessionContext","Error"],"mappings":";;;AAIA;;;;;;;;;;UAWaA,aAAgB,GAAA,IAAA;AAC3B,IAAA,MAAMC,UAAUC,UAAWC,CAAAA,iBAAAA,CAAAA;AAE3B,IAAA,IAAI,CAACF,OAAS,EAAA;AACZ,QAAA,MAAM,IAAIG,KAAM,CAAA,wDAAA,CAAA;AAClB;IAEA,OAAOH,OAAAA;AACT;;;;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
5
|
+
var useCTBSession = require('./useCTBSession.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Hook that provides tracking functionality with automatic CTB session ID inclusion.
|
|
9
|
+
* This version accepts arbitrary event names (string) to allow feature-specific
|
|
10
|
+
* events that are not yet declared in the central tracking typings.
|
|
11
|
+
*
|
|
12
|
+
* Note: this intentionally relaxes TypeScript restrictions so callers can
|
|
13
|
+
* emit new tracking event names without needing to update the upstream
|
|
14
|
+
* tracking type definitions. The session ID is merged into the properties
|
|
15
|
+
* object before forwarding to the original tracking implementation.
|
|
16
|
+
*/ const useCTBTracking = ()=>{
|
|
17
|
+
const { trackUsage: originalTrackUsage } = strapiAdmin.useTracking();
|
|
18
|
+
const { sessionId } = useCTBSession.useCTBSession();
|
|
19
|
+
const trackUsage = React.useCallback((event, properties)=>{
|
|
20
|
+
const enhancedProperties = {
|
|
21
|
+
...properties ?? {},
|
|
22
|
+
ctbSessionId: sessionId
|
|
23
|
+
};
|
|
24
|
+
// Forward to original implementation. Casts are necessary because
|
|
25
|
+
// originalTrackUsage has strict overloads for known event names.
|
|
26
|
+
return originalTrackUsage(event, enhancedProperties);
|
|
27
|
+
}, [
|
|
28
|
+
originalTrackUsage,
|
|
29
|
+
sessionId
|
|
30
|
+
]);
|
|
31
|
+
return {
|
|
32
|
+
trackUsage
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.useCTBTracking = useCTBTracking;
|
|
37
|
+
//# sourceMappingURL=useCTBTracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCTBTracking.js","sources":["../../../../admin/src/components/CTBSession/useCTBTracking.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\n\nimport { useCTBSession } from './useCTBSession';\n\n/**\n * Hook that provides tracking functionality with automatic CTB session ID inclusion.\n * This version accepts arbitrary event names (string) to allow feature-specific\n * events that are not yet declared in the central tracking typings.\n *\n * Note: this intentionally relaxes TypeScript restrictions so callers can\n * emit new tracking event names without needing to update the upstream\n * tracking type definitions. The session ID is merged into the properties\n * object before forwarding to the original tracking implementation.\n */\nexport const useCTBTracking = () => {\n const { trackUsage: originalTrackUsage } = useTracking();\n const { sessionId } = useCTBSession();\n\n const trackUsage = useCallback(\n (event: string, properties?: Record<string, unknown>) => {\n const enhancedProperties = {\n ...(properties ?? {}),\n ctbSessionId: sessionId,\n };\n\n // Forward to original implementation. Casts are necessary because\n // originalTrackUsage has strict overloads for known event names.\n return (originalTrackUsage as any)(event, enhancedProperties as any);\n },\n [originalTrackUsage, sessionId]\n );\n\n return { trackUsage };\n};\n"],"names":["useCTBTracking","trackUsage","originalTrackUsage","useTracking","sessionId","useCTBSession","useCallback","event","properties","enhancedProperties","ctbSessionId"],"mappings":";;;;;;AAMA;;;;;;;;;UAUaA,cAAiB,GAAA,IAAA;AAC5B,IAAA,MAAM,EAAEC,UAAAA,EAAYC,kBAAkB,EAAE,GAAGC,uBAAAA,EAAAA;IAC3C,MAAM,EAAEC,SAAS,EAAE,GAAGC,2BAAAA,EAAAA;IAEtB,MAAMJ,UAAAA,GAAaK,iBACjB,CAAA,CAACC,KAAeC,EAAAA,UAAAA,GAAAA;AACd,QAAA,MAAMC,kBAAqB,GAAA;YACzB,GAAID,UAAAA,IAAc,EAAE;YACpBE,YAAcN,EAAAA;AAChB,SAAA;;;QAIA,OAAQF,mBAA2BK,KAAOE,EAAAA,kBAAAA,CAAAA;KAE5C,EAAA;AAACP,QAAAA,kBAAAA;AAAoBE,QAAAA;AAAU,KAAA,CAAA;IAGjC,OAAO;AAAEH,QAAAA;AAAW,KAAA;AACtB;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { useTracking } from '@strapi/admin/strapi-admin';
|
|
3
|
+
import { useCTBSession } from './useCTBSession.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Hook that provides tracking functionality with automatic CTB session ID inclusion.
|
|
7
|
+
* This version accepts arbitrary event names (string) to allow feature-specific
|
|
8
|
+
* events that are not yet declared in the central tracking typings.
|
|
9
|
+
*
|
|
10
|
+
* Note: this intentionally relaxes TypeScript restrictions so callers can
|
|
11
|
+
* emit new tracking event names without needing to update the upstream
|
|
12
|
+
* tracking type definitions. The session ID is merged into the properties
|
|
13
|
+
* object before forwarding to the original tracking implementation.
|
|
14
|
+
*/ const useCTBTracking = ()=>{
|
|
15
|
+
const { trackUsage: originalTrackUsage } = useTracking();
|
|
16
|
+
const { sessionId } = useCTBSession();
|
|
17
|
+
const trackUsage = useCallback((event, properties)=>{
|
|
18
|
+
const enhancedProperties = {
|
|
19
|
+
...properties ?? {},
|
|
20
|
+
ctbSessionId: sessionId
|
|
21
|
+
};
|
|
22
|
+
// Forward to original implementation. Casts are necessary because
|
|
23
|
+
// originalTrackUsage has strict overloads for known event names.
|
|
24
|
+
return originalTrackUsage(event, enhancedProperties);
|
|
25
|
+
}, [
|
|
26
|
+
originalTrackUsage,
|
|
27
|
+
sessionId
|
|
28
|
+
]);
|
|
29
|
+
return {
|
|
30
|
+
trackUsage
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { useCTBTracking };
|
|
35
|
+
//# sourceMappingURL=useCTBTracking.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCTBTracking.mjs","sources":["../../../../admin/src/components/CTBSession/useCTBTracking.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\n\nimport { useCTBSession } from './useCTBSession';\n\n/**\n * Hook that provides tracking functionality with automatic CTB session ID inclusion.\n * This version accepts arbitrary event names (string) to allow feature-specific\n * events that are not yet declared in the central tracking typings.\n *\n * Note: this intentionally relaxes TypeScript restrictions so callers can\n * emit new tracking event names without needing to update the upstream\n * tracking type definitions. The session ID is merged into the properties\n * object before forwarding to the original tracking implementation.\n */\nexport const useCTBTracking = () => {\n const { trackUsage: originalTrackUsage } = useTracking();\n const { sessionId } = useCTBSession();\n\n const trackUsage = useCallback(\n (event: string, properties?: Record<string, unknown>) => {\n const enhancedProperties = {\n ...(properties ?? {}),\n ctbSessionId: sessionId,\n };\n\n // Forward to original implementation. Casts are necessary because\n // originalTrackUsage has strict overloads for known event names.\n return (originalTrackUsage as any)(event, enhancedProperties as any);\n },\n [originalTrackUsage, sessionId]\n );\n\n return { trackUsage };\n};\n"],"names":["useCTBTracking","trackUsage","originalTrackUsage","useTracking","sessionId","useCTBSession","useCallback","event","properties","enhancedProperties","ctbSessionId"],"mappings":";;;;AAMA;;;;;;;;;UAUaA,cAAiB,GAAA,IAAA;AAC5B,IAAA,MAAM,EAAEC,UAAAA,EAAYC,kBAAkB,EAAE,GAAGC,WAAAA,EAAAA;IAC3C,MAAM,EAAEC,SAAS,EAAE,GAAGC,aAAAA,EAAAA;IAEtB,MAAMJ,UAAAA,GAAaK,WACjB,CAAA,CAACC,KAAeC,EAAAA,UAAAA,GAAAA;AACd,QAAA,MAAMC,kBAAqB,GAAA;YACzB,GAAID,UAAAA,IAAc,EAAE;YACpBE,YAAcN,EAAAA;AAChB,SAAA;;;QAIA,OAAQF,mBAA2BK,KAAOE,EAAAA,kBAAAA,CAAAA;KAE5C,EAAA;AAACP,QAAAA,kBAAAA;AAAoBE,QAAAA;AAAU,KAAA,CAAA;IAGjC,OAAO;AAAEH,QAAAA;AAAW,KAAA;AACtB;;;;"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
-
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
5
4
|
var designSystem = require('@strapi/design-system');
|
|
6
5
|
var upperFirst = require('lodash/upperFirst');
|
|
7
6
|
var reactIntl = require('react-intl');
|
|
8
7
|
var pluginId = require('../../pluginId.js');
|
|
9
8
|
var getTrad = require('../../utils/getTrad.js');
|
|
9
|
+
require('react/jsx-runtime');
|
|
10
|
+
require('../CTBSession/sessionContext.js');
|
|
11
|
+
var useCTBTracking = require('../CTBSession/useCTBTracking.js');
|
|
10
12
|
var useDataManager = require('../DataManager/useDataManager.js');
|
|
11
13
|
var useFormModalNavigation = require('../FormModalNavigation/useFormModalNavigation.js');
|
|
12
14
|
|
|
13
15
|
const useContentTypeBuilderMenu = ()=>{
|
|
14
16
|
const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } = useDataManager.useDataManager();
|
|
15
|
-
const { trackUsage } =
|
|
17
|
+
const { trackUsage } = useCTBTracking.useCTBTracking();
|
|
16
18
|
const [searchValue, setSearchValue] = React.useState('');
|
|
17
19
|
const { onOpenModalCreateSchema } = useFormModalNavigation.useFormModalNavigation();
|
|
18
20
|
const { locale } = reactIntl.useIntl();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContentTypeBuilderMenu.js","sources":["../../../../admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useCollator, useFilter } from '@strapi/design-system';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\n\nimport { pluginId } from '../../pluginId';\nimport { getTrad } from '../../utils/getTrad';\nimport { useDataManager } from '../DataManager/useDataManager';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport type { Status } from '../../types';\n\ntype Link = {\n name: string;\n to: string;\n status: Status;\n title: string;\n};\n\ntype SubSection = {\n name: string;\n title: string;\n links: Link[];\n};\n\ntype MenuSection = {\n name: string;\n title: {\n id: string;\n defaultMessage: string;\n };\n customLink?: {\n id: string;\n defaultMessage: string;\n onClick: () => void;\n };\n links: Array<SubSection | Link>;\n linksCount?: number;\n};\n\ntype Menu = MenuSection[];\n\nexport const useContentTypeBuilderMenu = () => {\n const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } =\n useDataManager();\n const { trackUsage } = useTracking();\n const [searchValue, setSearchValue] = useState('');\n const { onOpenModalCreateSchema } = useFormModalNavigation();\n const { locale } = useIntl();\n\n const { contains } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const handleClickOpenModalCreateCollectionType = () => {\n trackUsage(`willCreateContentType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'collectionType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateSingleType = () => {\n trackUsage(`willCreateSingleType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'singleType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateComponent = () => {\n trackUsage('willCreateComponent');\n\n const nextState = {\n modalType: 'component',\n kind: null,\n actionType: 'create',\n forTarget: 'component',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const componentsData = Object.entries(componentsGroupedByCategory)\n .map(([category, components]) => ({\n name: category,\n title: upperFirst(category),\n links: components\n .map((component) => ({\n name: component.uid,\n to: `/plugins/${pluginId}/component-categories/${category}/${component.uid}`,\n title: component.info.displayName,\n status: component.status,\n }))\n .sort((a, b) => formatter.compare(a.title, b.title)),\n }))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n const displayedContentTypes = sortedContentTypesList\n .filter((obj) => obj.visible)\n .map((info) => ({\n kind: info.kind,\n name: info.name,\n to: info.to,\n title: info.title,\n status: info.status,\n }));\n\n const data: Menu = [\n {\n name: 'models',\n title: {\n id: `${getTrad('menu.section.models.name')}`,\n defaultMessage: 'Collection Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.model.create')}`,\n defaultMessage: 'Create new collection type',\n onClick: handleClickOpenModalCreateCollectionType,\n }\n : undefined,\n links: displayedContentTypes.filter((contentType) => contentType.kind === 'collectionType'),\n },\n {\n name: 'singleTypes',\n title: {\n id: `${getTrad('menu.section.single-types.name')}`,\n defaultMessage: 'Single Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.single-types.create')}`,\n defaultMessage: 'Create new single type',\n onClick: handleClickOpenModalCreateSingleType,\n }\n : undefined,\n links: displayedContentTypes.filter((singleType) => singleType.kind === 'singleType'),\n },\n {\n name: 'components',\n title: {\n id: `${getTrad('menu.section.components.name')}`,\n defaultMessage: 'Components',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.component.create')}`,\n defaultMessage: 'Create a new component',\n onClick: handleClickOpenModalCreateComponent,\n }\n : undefined,\n links: componentsData,\n },\n ].map((section) => {\n const hasChild = section.links.some((l) => 'links' in l && Array.isArray(l.links));\n\n if (hasChild) {\n let filteredLinksCount = 0;\n\n return {\n ...section,\n links: section.links.reduce((acc, link) => {\n const filteredLinks =\n 'links' in link ? link.links.filter((link) => contains(link.title, searchValue)) : [];\n\n if (filteredLinks.length === 0) {\n return acc;\n }\n\n filteredLinksCount += filteredLinks.length;\n\n acc.push({\n ...link,\n links: filteredLinks.sort((a, b) => formatter.compare(a.title, b.title)),\n });\n\n return acc;\n }, [] as SubSection[]),\n linksCount: filteredLinksCount,\n };\n }\n\n const filteredLinks = section.links\n .filter((link) => contains(link.title, searchValue))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n return {\n ...section,\n links: filteredLinks,\n linksCount: filteredLinks.length,\n };\n });\n\n return {\n menu: data,\n search: {\n value: searchValue,\n onChange: setSearchValue,\n clear: () => setSearchValue(''),\n },\n };\n};\n"],"names":["useContentTypeBuilderMenu","componentsGroupedByCategory","isInDevelopmentMode","sortedContentTypesList","useDataManager","trackUsage","useTracking","searchValue","setSearchValue","useState","onOpenModalCreateSchema","useFormModalNavigation","locale","useIntl","contains","useFilter","sensitivity","formatter","useCollator","handleClickOpenModalCreateCollectionType","nextState","modalType","kind","actionType","forTarget","handleClickOpenModalCreateSingleType","handleClickOpenModalCreateComponent","componentsData","Object","entries","map","category","components","name","title","upperFirst","links","component","uid","to","pluginId","info","displayName","status","sort","a","b","compare","displayedContentTypes","filter","obj","visible","data","id","getTrad","defaultMessage","customLink","onClick","undefined","contentType","singleType","section","hasChild","some","l","Array","isArray","filteredLinksCount","reduce","acc","link","filteredLinks","length","push","linksCount","menu","search","value","onChange","clear"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useContentTypeBuilderMenu.js","sources":["../../../../admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useCollator, useFilter } from '@strapi/design-system';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\n\nimport { pluginId } from '../../pluginId';\nimport { getTrad } from '../../utils/getTrad';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useDataManager } from '../DataManager/useDataManager';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport type { Status } from '../../types';\n\ntype Link = {\n name: string;\n to: string;\n status: Status;\n title: string;\n};\n\ntype SubSection = {\n name: string;\n title: string;\n links: Link[];\n};\n\ntype MenuSection = {\n name: string;\n title: {\n id: string;\n defaultMessage: string;\n };\n customLink?: {\n id: string;\n defaultMessage: string;\n onClick: () => void;\n };\n links: Array<SubSection | Link>;\n linksCount?: number;\n};\n\ntype Menu = MenuSection[];\n\nexport const useContentTypeBuilderMenu = () => {\n const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } =\n useDataManager();\n const { trackUsage } = useCTBTracking();\n const [searchValue, setSearchValue] = useState('');\n const { onOpenModalCreateSchema } = useFormModalNavigation();\n const { locale } = useIntl();\n\n const { contains } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const handleClickOpenModalCreateCollectionType = () => {\n trackUsage(`willCreateContentType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'collectionType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateSingleType = () => {\n trackUsage(`willCreateSingleType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'singleType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateComponent = () => {\n trackUsage('willCreateComponent');\n\n const nextState = {\n modalType: 'component',\n kind: null,\n actionType: 'create',\n forTarget: 'component',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const componentsData = Object.entries(componentsGroupedByCategory)\n .map(([category, components]) => ({\n name: category,\n title: upperFirst(category),\n links: components\n .map((component) => ({\n name: component.uid,\n to: `/plugins/${pluginId}/component-categories/${category}/${component.uid}`,\n title: component.info.displayName,\n status: component.status,\n }))\n .sort((a, b) => formatter.compare(a.title, b.title)),\n }))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n const displayedContentTypes = sortedContentTypesList\n .filter((obj) => obj.visible)\n .map((info) => ({\n kind: info.kind,\n name: info.name,\n to: info.to,\n title: info.title,\n status: info.status,\n }));\n\n const data: Menu = [\n {\n name: 'models',\n title: {\n id: `${getTrad('menu.section.models.name')}`,\n defaultMessage: 'Collection Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.model.create')}`,\n defaultMessage: 'Create new collection type',\n onClick: handleClickOpenModalCreateCollectionType,\n }\n : undefined,\n links: displayedContentTypes.filter((contentType) => contentType.kind === 'collectionType'),\n },\n {\n name: 'singleTypes',\n title: {\n id: `${getTrad('menu.section.single-types.name')}`,\n defaultMessage: 'Single Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.single-types.create')}`,\n defaultMessage: 'Create new single type',\n onClick: handleClickOpenModalCreateSingleType,\n }\n : undefined,\n links: displayedContentTypes.filter((singleType) => singleType.kind === 'singleType'),\n },\n {\n name: 'components',\n title: {\n id: `${getTrad('menu.section.components.name')}`,\n defaultMessage: 'Components',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.component.create')}`,\n defaultMessage: 'Create a new component',\n onClick: handleClickOpenModalCreateComponent,\n }\n : undefined,\n links: componentsData,\n },\n ].map((section) => {\n const hasChild = section.links.some((l) => 'links' in l && Array.isArray(l.links));\n\n if (hasChild) {\n let filteredLinksCount = 0;\n\n return {\n ...section,\n links: section.links.reduce((acc, link) => {\n const filteredLinks =\n 'links' in link ? link.links.filter((link) => contains(link.title, searchValue)) : [];\n\n if (filteredLinks.length === 0) {\n return acc;\n }\n\n filteredLinksCount += filteredLinks.length;\n\n acc.push({\n ...link,\n links: filteredLinks.sort((a, b) => formatter.compare(a.title, b.title)),\n });\n\n return acc;\n }, [] as SubSection[]),\n linksCount: filteredLinksCount,\n };\n }\n\n const filteredLinks = section.links\n .filter((link) => contains(link.title, searchValue))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n return {\n ...section,\n links: filteredLinks,\n linksCount: filteredLinks.length,\n };\n });\n\n return {\n menu: data,\n search: {\n value: searchValue,\n onChange: setSearchValue,\n clear: () => setSearchValue(''),\n },\n };\n};\n"],"names":["useContentTypeBuilderMenu","componentsGroupedByCategory","isInDevelopmentMode","sortedContentTypesList","useDataManager","trackUsage","useCTBTracking","searchValue","setSearchValue","useState","onOpenModalCreateSchema","useFormModalNavigation","locale","useIntl","contains","useFilter","sensitivity","formatter","useCollator","handleClickOpenModalCreateCollectionType","nextState","modalType","kind","actionType","forTarget","handleClickOpenModalCreateSingleType","handleClickOpenModalCreateComponent","componentsData","Object","entries","map","category","components","name","title","upperFirst","links","component","uid","to","pluginId","info","displayName","status","sort","a","b","compare","displayedContentTypes","filter","obj","visible","data","id","getTrad","defaultMessage","customLink","onClick","undefined","contentType","singleType","section","hasChild","some","l","Array","isArray","filteredLinksCount","reduce","acc","link","filteredLinks","length","push","linksCount","menu","search","value","onChange","clear"],"mappings":"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"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
|
-
import { useTracking } from '@strapi/admin/strapi-admin';
|
|
3
2
|
import { useFilter, useCollator } from '@strapi/design-system';
|
|
4
3
|
import upperFirst from 'lodash/upperFirst';
|
|
5
4
|
import { useIntl } from 'react-intl';
|
|
6
5
|
import { pluginId } from '../../pluginId.mjs';
|
|
7
6
|
import { getTrad } from '../../utils/getTrad.mjs';
|
|
7
|
+
import 'react/jsx-runtime';
|
|
8
|
+
import '../CTBSession/sessionContext.mjs';
|
|
9
|
+
import { useCTBTracking } from '../CTBSession/useCTBTracking.mjs';
|
|
8
10
|
import { useDataManager } from '../DataManager/useDataManager.mjs';
|
|
9
11
|
import { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation.mjs';
|
|
10
12
|
|
|
11
13
|
const useContentTypeBuilderMenu = ()=>{
|
|
12
14
|
const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } = useDataManager();
|
|
13
|
-
const { trackUsage } =
|
|
15
|
+
const { trackUsage } = useCTBTracking();
|
|
14
16
|
const [searchValue, setSearchValue] = useState('');
|
|
15
17
|
const { onOpenModalCreateSchema } = useFormModalNavigation();
|
|
16
18
|
const { locale } = useIntl();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContentTypeBuilderMenu.mjs","sources":["../../../../admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useCollator, useFilter } from '@strapi/design-system';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\n\nimport { pluginId } from '../../pluginId';\nimport { getTrad } from '../../utils/getTrad';\nimport { useDataManager } from '../DataManager/useDataManager';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport type { Status } from '../../types';\n\ntype Link = {\n name: string;\n to: string;\n status: Status;\n title: string;\n};\n\ntype SubSection = {\n name: string;\n title: string;\n links: Link[];\n};\n\ntype MenuSection = {\n name: string;\n title: {\n id: string;\n defaultMessage: string;\n };\n customLink?: {\n id: string;\n defaultMessage: string;\n onClick: () => void;\n };\n links: Array<SubSection | Link>;\n linksCount?: number;\n};\n\ntype Menu = MenuSection[];\n\nexport const useContentTypeBuilderMenu = () => {\n const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } =\n useDataManager();\n const { trackUsage } = useTracking();\n const [searchValue, setSearchValue] = useState('');\n const { onOpenModalCreateSchema } = useFormModalNavigation();\n const { locale } = useIntl();\n\n const { contains } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const handleClickOpenModalCreateCollectionType = () => {\n trackUsage(`willCreateContentType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'collectionType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateSingleType = () => {\n trackUsage(`willCreateSingleType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'singleType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateComponent = () => {\n trackUsage('willCreateComponent');\n\n const nextState = {\n modalType: 'component',\n kind: null,\n actionType: 'create',\n forTarget: 'component',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const componentsData = Object.entries(componentsGroupedByCategory)\n .map(([category, components]) => ({\n name: category,\n title: upperFirst(category),\n links: components\n .map((component) => ({\n name: component.uid,\n to: `/plugins/${pluginId}/component-categories/${category}/${component.uid}`,\n title: component.info.displayName,\n status: component.status,\n }))\n .sort((a, b) => formatter.compare(a.title, b.title)),\n }))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n const displayedContentTypes = sortedContentTypesList\n .filter((obj) => obj.visible)\n .map((info) => ({\n kind: info.kind,\n name: info.name,\n to: info.to,\n title: info.title,\n status: info.status,\n }));\n\n const data: Menu = [\n {\n name: 'models',\n title: {\n id: `${getTrad('menu.section.models.name')}`,\n defaultMessage: 'Collection Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.model.create')}`,\n defaultMessage: 'Create new collection type',\n onClick: handleClickOpenModalCreateCollectionType,\n }\n : undefined,\n links: displayedContentTypes.filter((contentType) => contentType.kind === 'collectionType'),\n },\n {\n name: 'singleTypes',\n title: {\n id: `${getTrad('menu.section.single-types.name')}`,\n defaultMessage: 'Single Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.single-types.create')}`,\n defaultMessage: 'Create new single type',\n onClick: handleClickOpenModalCreateSingleType,\n }\n : undefined,\n links: displayedContentTypes.filter((singleType) => singleType.kind === 'singleType'),\n },\n {\n name: 'components',\n title: {\n id: `${getTrad('menu.section.components.name')}`,\n defaultMessage: 'Components',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.component.create')}`,\n defaultMessage: 'Create a new component',\n onClick: handleClickOpenModalCreateComponent,\n }\n : undefined,\n links: componentsData,\n },\n ].map((section) => {\n const hasChild = section.links.some((l) => 'links' in l && Array.isArray(l.links));\n\n if (hasChild) {\n let filteredLinksCount = 0;\n\n return {\n ...section,\n links: section.links.reduce((acc, link) => {\n const filteredLinks =\n 'links' in link ? link.links.filter((link) => contains(link.title, searchValue)) : [];\n\n if (filteredLinks.length === 0) {\n return acc;\n }\n\n filteredLinksCount += filteredLinks.length;\n\n acc.push({\n ...link,\n links: filteredLinks.sort((a, b) => formatter.compare(a.title, b.title)),\n });\n\n return acc;\n }, [] as SubSection[]),\n linksCount: filteredLinksCount,\n };\n }\n\n const filteredLinks = section.links\n .filter((link) => contains(link.title, searchValue))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n return {\n ...section,\n links: filteredLinks,\n linksCount: filteredLinks.length,\n };\n });\n\n return {\n menu: data,\n search: {\n value: searchValue,\n onChange: setSearchValue,\n clear: () => setSearchValue(''),\n },\n };\n};\n"],"names":["useContentTypeBuilderMenu","componentsGroupedByCategory","isInDevelopmentMode","sortedContentTypesList","useDataManager","trackUsage","useTracking","searchValue","setSearchValue","useState","onOpenModalCreateSchema","useFormModalNavigation","locale","useIntl","contains","useFilter","sensitivity","formatter","useCollator","handleClickOpenModalCreateCollectionType","nextState","modalType","kind","actionType","forTarget","handleClickOpenModalCreateSingleType","handleClickOpenModalCreateComponent","componentsData","Object","entries","map","category","components","name","title","upperFirst","links","component","uid","to","pluginId","info","displayName","status","sort","a","b","compare","displayedContentTypes","filter","obj","visible","data","id","getTrad","defaultMessage","customLink","onClick","undefined","contentType","singleType","section","hasChild","some","l","Array","isArray","filteredLinksCount","reduce","acc","link","filteredLinks","length","push","linksCount","menu","search","value","onChange","clear"],"mappings":";;;;;;;;;;MA4CaA,yBAA4B,GAAA,IAAA;AACvC,IAAA,MAAM,EAAEC,2BAA2B,EAAEC,mBAAmB,EAAEC,sBAAsB,EAAE,GAChFC,cAAAA,EAAAA;IACF,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAM,CAACC,WAAAA,EAAaC,cAAe,CAAA,GAAGC,QAAS,CAAA,EAAA,CAAA;IAC/C,MAAM,EAAEC,uBAAuB,EAAE,GAAGC,sBAAAA,EAAAA;IACpC,MAAM,EAAEC,MAAM,EAAE,GAAGC,OAAAA,EAAAA;AAEnB,IAAA,MAAM,EAAEC,QAAQ,EAAE,GAAGC,UAAUH,MAAQ,EAAA;QACrCI,WAAa,EAAA;AACf,KAAA,CAAA;IAEA,MAAMC,SAAAA,GAAYC,YAAYN,MAAQ,EAAA;QACpCI,WAAa,EAAA;AACf,KAAA,CAAA;AAEA,IAAA,MAAMG,wCAA2C,GAAA,IAAA;QAC/Cd,UAAW,CAAA,CAAC,qBAAqB,CAAC,CAAA;AAElC,QAAA,MAAMe,SAAY,GAAA;YAChBC,SAAW,EAAA,aAAA;YACXC,IAAM,EAAA,gBAAA;YACNC,UAAY,EAAA,QAAA;YACZC,SAAW,EAAA;AACb,SAAA;QAEAd,uBAAwBU,CAAAA,SAAAA,CAAAA;AAC1B,KAAA;AAEA,IAAA,MAAMK,oCAAuC,GAAA,IAAA;QAC3CpB,UAAW,CAAA,CAAC,oBAAoB,CAAC,CAAA;AAEjC,QAAA,MAAMe,SAAY,GAAA;YAChBC,SAAW,EAAA,aAAA;YACXC,IAAM,EAAA,YAAA;YACNC,UAAY,EAAA,QAAA;YACZC,SAAW,EAAA;AACb,SAAA;QAEAd,uBAAwBU,CAAAA,SAAAA,CAAAA;AAC1B,KAAA;AAEA,IAAA,MAAMM,mCAAsC,GAAA,IAAA;QAC1CrB,UAAW,CAAA,qBAAA,CAAA;AAEX,QAAA,MAAMe,SAAY,GAAA;YAChBC,SAAW,EAAA,WAAA;YACXC,IAAM,EAAA,IAAA;YACNC,UAAY,EAAA,QAAA;YACZC,SAAW,EAAA;AACb,SAAA;QAEAd,uBAAwBU,CAAAA,SAAAA,CAAAA;AAC1B,KAAA;AAEA,IAAA,MAAMO,cAAiBC,GAAAA,MAAAA,CAAOC,OAAO,CAAC5B,2BACnC6B,CAAAA,CAAAA,GAAG,CAAC,CAAC,CAACC,QAAAA,EAAUC,UAAW,CAAA,IAAM;YAChCC,IAAMF,EAAAA,QAAAA;AACNG,YAAAA,KAAAA,EAAOC,UAAWJ,CAAAA,QAAAA,CAAAA;AAClBK,YAAAA,KAAAA,EAAOJ,UACJF,CAAAA,GAAG,CAAC,CAACO,aAAe;AACnBJ,oBAAAA,IAAAA,EAAMI,UAAUC,GAAG;oBACnBC,EAAI,EAAA,CAAC,SAAS,EAAEC,QAAS,CAAA,sBAAsB,EAAET,QAAAA,CAAS,CAAC,EAAEM,SAAUC,CAAAA,GAAG,CAAE,CAAA;oBAC5EJ,KAAOG,EAAAA,SAAAA,CAAUI,IAAI,CAACC,WAAW;AACjCC,oBAAAA,MAAAA,EAAQN,UAAUM;AACpB,iBAAA,CACCC,CAAAA,CAAAA,IAAI,CAAC,CAACC,CAAGC,EAAAA,CAAAA,GAAM7B,SAAU8B,CAAAA,OAAO,CAACF,CAAAA,CAAEX,KAAK,EAAEY,EAAEZ,KAAK,CAAA;AACtD,SAAA,CACCU,CAAAA,CAAAA,IAAI,CAAC,CAACC,CAAGC,EAAAA,CAAAA,GAAM7B,SAAU8B,CAAAA,OAAO,CAACF,CAAAA,CAAEX,KAAK,EAAEY,EAAEZ,KAAK,CAAA,CAAA;AAEpD,IAAA,MAAMc,qBAAwB7C,GAAAA,sBAAAA,CAC3B8C,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,OAAO,CAC3BrB,CAAAA,GAAG,CAAC,CAACW,QAAU;AACdnB,YAAAA,IAAAA,EAAMmB,KAAKnB,IAAI;AACfW,YAAAA,IAAAA,EAAMQ,KAAKR,IAAI;AACfM,YAAAA,EAAAA,EAAIE,KAAKF,EAAE;AACXL,YAAAA,KAAAA,EAAOO,KAAKP,KAAK;AACjBS,YAAAA,MAAAA,EAAQF,KAAKE;SACf,CAAA,CAAA;AAEF,IAAA,MAAMS,IAAa,GAAA;AACjB,QAAA;YACEnB,IAAM,EAAA,QAAA;YACNC,KAAO,EAAA;gBACLmB,EAAI,EAAA,CAAA,EAAGC,QAAQ,0BAA6B,CAAA,CAAA,CAAA;gBAC5CC,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,UAAAA,EAAYtD,mBACR,GAAA;gBACEmD,EAAI,EAAA,CAAA,EAAGC,QAAQ,qBAAwB,CAAA,CAAA,CAAA;gBACvCC,cAAgB,EAAA,4BAAA;gBAChBE,OAAStC,EAAAA;aAEXuC,GAAAA,SAAAA;AACJtB,YAAAA,KAAAA,EAAOY,sBAAsBC,MAAM,CAAC,CAACU,WAAgBA,GAAAA,WAAAA,CAAYrC,IAAI,KAAK,gBAAA;AAC5E,SAAA;AACA,QAAA;YACEW,IAAM,EAAA,aAAA;YACNC,KAAO,EAAA;gBACLmB,EAAI,EAAA,CAAA,EAAGC,QAAQ,gCAAmC,CAAA,CAAA,CAAA;gBAClDC,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,UAAAA,EAAYtD,mBACR,GAAA;gBACEmD,EAAI,EAAA,CAAA,EAAGC,QAAQ,4BAA+B,CAAA,CAAA,CAAA;gBAC9CC,cAAgB,EAAA,wBAAA;gBAChBE,OAAShC,EAAAA;aAEXiC,GAAAA,SAAAA;AACJtB,YAAAA,KAAAA,EAAOY,sBAAsBC,MAAM,CAAC,CAACW,UAAeA,GAAAA,UAAAA,CAAWtC,IAAI,KAAK,YAAA;AAC1E,SAAA;AACA,QAAA;YACEW,IAAM,EAAA,YAAA;YACNC,KAAO,EAAA;gBACLmB,EAAI,EAAA,CAAA,EAAGC,QAAQ,8BAAiC,CAAA,CAAA,CAAA;gBAChDC,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,UAAAA,EAAYtD,mBACR,GAAA;gBACEmD,EAAI,EAAA,CAAA,EAAGC,QAAQ,yBAA4B,CAAA,CAAA,CAAA;gBAC3CC,cAAgB,EAAA,wBAAA;gBAChBE,OAAS/B,EAAAA;aAEXgC,GAAAA,SAAAA;YACJtB,KAAOT,EAAAA;AACT;KACD,CAACG,GAAG,CAAC,CAAC+B,OAAAA,GAAAA;AACL,QAAA,MAAMC,QAAWD,GAAAA,OAAAA,CAAQzB,KAAK,CAAC2B,IAAI,CAAC,CAACC,CAAM,GAAA,OAAA,IAAWA,CAAKC,IAAAA,KAAAA,CAAMC,OAAO,CAACF,EAAE5B,KAAK,CAAA,CAAA;AAEhF,QAAA,IAAI0B,QAAU,EAAA;AACZ,YAAA,IAAIK,kBAAqB,GAAA,CAAA;YAEzB,OAAO;AACL,gBAAA,GAAGN,OAAO;AACVzB,gBAAAA,KAAAA,EAAOyB,QAAQzB,KAAK,CAACgC,MAAM,CAAC,CAACC,GAAKC,EAAAA,IAAAA,GAAAA;AAChC,oBAAA,MAAMC,aACJ,GAAA,OAAA,IAAWD,IAAOA,GAAAA,IAAAA,CAAKlC,KAAK,CAACa,MAAM,CAAC,CAACqB,OAASxD,QAASwD,CAAAA,IAAAA,CAAKpC,KAAK,EAAE3B,gBAAgB,EAAE;oBAEvF,IAAIgE,aAAAA,CAAcC,MAAM,KAAK,CAAG,EAAA;wBAC9B,OAAOH,GAAAA;AACT;AAEAF,oBAAAA,kBAAAA,IAAsBI,cAAcC,MAAM;AAE1CH,oBAAAA,GAAAA,CAAII,IAAI,CAAC;AACP,wBAAA,GAAGH,IAAI;AACPlC,wBAAAA,KAAAA,EAAOmC,aAAc3B,CAAAA,IAAI,CAAC,CAACC,CAAGC,EAAAA,CAAAA,GAAM7B,SAAU8B,CAAAA,OAAO,CAACF,CAAAA,CAAEX,KAAK,EAAEY,EAAEZ,KAAK,CAAA;AACxE,qBAAA,CAAA;oBAEA,OAAOmC,GAAAA;AACT,iBAAA,EAAG,EAAE,CAAA;gBACLK,UAAYP,EAAAA;AACd,aAAA;AACF;QAEA,MAAMI,aAAAA,GAAgBV,OAAQzB,CAAAA,KAAK,CAChCa,MAAM,CAAC,CAACqB,IAAAA,GAASxD,QAASwD,CAAAA,IAAAA,CAAKpC,KAAK,EAAE3B,cACtCqC,IAAI,CAAC,CAACC,CAAAA,EAAGC,CAAM7B,GAAAA,SAAAA,CAAU8B,OAAO,CAACF,CAAEX,CAAAA,KAAK,EAAEY,CAAAA,CAAEZ,KAAK,CAAA,CAAA;QAEpD,OAAO;AACL,YAAA,GAAG2B,OAAO;YACVzB,KAAOmC,EAAAA,aAAAA;AACPG,YAAAA,UAAAA,EAAYH,cAAcC;AAC5B,SAAA;AACF,KAAA,CAAA;IAEA,OAAO;QACLG,IAAMvB,EAAAA,IAAAA;QACNwB,MAAQ,EAAA;YACNC,KAAOtE,EAAAA,WAAAA;YACPuE,QAAUtE,EAAAA,cAAAA;AACVuE,YAAAA,KAAAA,EAAO,IAAMvE,cAAe,CAAA,EAAA;AAC9B;AACF,KAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"useContentTypeBuilderMenu.mjs","sources":["../../../../admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useCollator, useFilter } from '@strapi/design-system';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\n\nimport { pluginId } from '../../pluginId';\nimport { getTrad } from '../../utils/getTrad';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useDataManager } from '../DataManager/useDataManager';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport type { Status } from '../../types';\n\ntype Link = {\n name: string;\n to: string;\n status: Status;\n title: string;\n};\n\ntype SubSection = {\n name: string;\n title: string;\n links: Link[];\n};\n\ntype MenuSection = {\n name: string;\n title: {\n id: string;\n defaultMessage: string;\n };\n customLink?: {\n id: string;\n defaultMessage: string;\n onClick: () => void;\n };\n links: Array<SubSection | Link>;\n linksCount?: number;\n};\n\ntype Menu = MenuSection[];\n\nexport const useContentTypeBuilderMenu = () => {\n const { componentsGroupedByCategory, isInDevelopmentMode, sortedContentTypesList } =\n useDataManager();\n const { trackUsage } = useCTBTracking();\n const [searchValue, setSearchValue] = useState('');\n const { onOpenModalCreateSchema } = useFormModalNavigation();\n const { locale } = useIntl();\n\n const { contains } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const handleClickOpenModalCreateCollectionType = () => {\n trackUsage(`willCreateContentType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'collectionType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateSingleType = () => {\n trackUsage(`willCreateSingleType`);\n\n const nextState = {\n modalType: 'contentType',\n kind: 'singleType',\n actionType: 'create',\n forTarget: 'contentType',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const handleClickOpenModalCreateComponent = () => {\n trackUsage('willCreateComponent');\n\n const nextState = {\n modalType: 'component',\n kind: null,\n actionType: 'create',\n forTarget: 'component',\n };\n\n onOpenModalCreateSchema(nextState);\n };\n\n const componentsData = Object.entries(componentsGroupedByCategory)\n .map(([category, components]) => ({\n name: category,\n title: upperFirst(category),\n links: components\n .map((component) => ({\n name: component.uid,\n to: `/plugins/${pluginId}/component-categories/${category}/${component.uid}`,\n title: component.info.displayName,\n status: component.status,\n }))\n .sort((a, b) => formatter.compare(a.title, b.title)),\n }))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n const displayedContentTypes = sortedContentTypesList\n .filter((obj) => obj.visible)\n .map((info) => ({\n kind: info.kind,\n name: info.name,\n to: info.to,\n title: info.title,\n status: info.status,\n }));\n\n const data: Menu = [\n {\n name: 'models',\n title: {\n id: `${getTrad('menu.section.models.name')}`,\n defaultMessage: 'Collection Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.model.create')}`,\n defaultMessage: 'Create new collection type',\n onClick: handleClickOpenModalCreateCollectionType,\n }\n : undefined,\n links: displayedContentTypes.filter((contentType) => contentType.kind === 'collectionType'),\n },\n {\n name: 'singleTypes',\n title: {\n id: `${getTrad('menu.section.single-types.name')}`,\n defaultMessage: 'Single Types',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.single-types.create')}`,\n defaultMessage: 'Create new single type',\n onClick: handleClickOpenModalCreateSingleType,\n }\n : undefined,\n links: displayedContentTypes.filter((singleType) => singleType.kind === 'singleType'),\n },\n {\n name: 'components',\n title: {\n id: `${getTrad('menu.section.components.name')}`,\n defaultMessage: 'Components',\n },\n customLink: isInDevelopmentMode\n ? {\n id: `${getTrad('button.component.create')}`,\n defaultMessage: 'Create a new component',\n onClick: handleClickOpenModalCreateComponent,\n }\n : undefined,\n links: componentsData,\n },\n ].map((section) => {\n const hasChild = section.links.some((l) => 'links' in l && Array.isArray(l.links));\n\n if (hasChild) {\n let filteredLinksCount = 0;\n\n return {\n ...section,\n links: section.links.reduce((acc, link) => {\n const filteredLinks =\n 'links' in link ? link.links.filter((link) => contains(link.title, searchValue)) : [];\n\n if (filteredLinks.length === 0) {\n return acc;\n }\n\n filteredLinksCount += filteredLinks.length;\n\n acc.push({\n ...link,\n links: filteredLinks.sort((a, b) => formatter.compare(a.title, b.title)),\n });\n\n return acc;\n }, [] as SubSection[]),\n linksCount: filteredLinksCount,\n };\n }\n\n const filteredLinks = section.links\n .filter((link) => contains(link.title, searchValue))\n .sort((a, b) => formatter.compare(a.title, b.title));\n\n return {\n ...section,\n links: filteredLinks,\n linksCount: filteredLinks.length,\n };\n });\n\n return {\n menu: data,\n search: {\n value: searchValue,\n onChange: setSearchValue,\n clear: () => setSearchValue(''),\n },\n };\n};\n"],"names":["useContentTypeBuilderMenu","componentsGroupedByCategory","isInDevelopmentMode","sortedContentTypesList","useDataManager","trackUsage","useCTBTracking","searchValue","setSearchValue","useState","onOpenModalCreateSchema","useFormModalNavigation","locale","useIntl","contains","useFilter","sensitivity","formatter","useCollator","handleClickOpenModalCreateCollectionType","nextState","modalType","kind","actionType","forTarget","handleClickOpenModalCreateSingleType","handleClickOpenModalCreateComponent","componentsData","Object","entries","map","category","components","name","title","upperFirst","links","component","uid","to","pluginId","info","displayName","status","sort","a","b","compare","displayedContentTypes","filter","obj","visible","data","id","getTrad","defaultMessage","customLink","onClick","undefined","contentType","singleType","section","hasChild","some","l","Array","isArray","filteredLinksCount","reduce","acc","link","filteredLinks","length","push","linksCount","menu","search","value","onChange","clear"],"mappings":"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"}
|