@strapi/admin 5.12.3 → 5.12.5
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/admin/src/StrapiApp.js +2 -0
- package/dist/admin/admin/src/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/StrapiApp.mjs +2 -0
- package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/components/Context.js +7 -3
- package/dist/admin/admin/src/components/Context.js.map +1 -1
- package/dist/admin/admin/src/components/Context.mjs +7 -3
- package/dist/admin/admin/src/components/Context.mjs.map +1 -1
- package/dist/admin/admin/src/components/Providers.js +1 -0
- package/dist/admin/admin/src/components/Providers.js.map +1 -1
- package/dist/admin/admin/src/components/Providers.mjs +1 -0
- package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
- package/dist/admin/admin/src/{pages/Home/components/Widget.js → components/WidgetHelpers.js} +26 -69
- package/dist/admin/admin/src/components/WidgetHelpers.js.map +1 -0
- package/dist/admin/admin/src/{pages/Home/components/Widget.mjs → components/WidgetHelpers.mjs} +30 -54
- package/dist/admin/admin/src/components/WidgetHelpers.mjs.map +1 -0
- package/dist/admin/admin/src/core/apis/CustomFields.js.map +1 -1
- package/dist/admin/admin/src/core/apis/CustomFields.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js +34 -0
- package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -0
- package/dist/admin/admin/src/core/apis/Widgets.mjs +32 -0
- package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -0
- package/dist/admin/admin/src/features/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/features/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js +163 -3
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.mjs +145 -5
- package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.js +10 -30
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.mjs +5 -25
- package/dist/admin/admin/src/pages/Home/components/ContentManagerWidgets.mjs.map +1 -1
- package/dist/admin/admin/src/services/homepage.js +3 -2
- package/dist/admin/admin/src/services/homepage.js.map +1 -1
- package/dist/admin/admin/src/services/homepage.mjs +3 -2
- package/dist/admin/admin/src/services/homepage.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +1 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +1 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/tests/utils.js +5 -0
- package/dist/admin/admin/tests/utils.js.map +1 -1
- package/dist/admin/admin/tests/utils.mjs +5 -0
- package/dist/admin/admin/tests/utils.mjs.map +1 -1
- package/dist/admin/index.js +2 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/StrapiApp.d.ts +2 -0
- package/dist/admin/src/components/Context.d.ts +1 -1
- package/dist/admin/src/components/Form.d.ts +1 -1
- package/dist/admin/src/components/GuidedTour/Provider.d.ts +1 -1
- package/dist/admin/src/components/Table.d.ts +1 -1
- package/dist/admin/src/{pages/Home/components/Widget.d.ts → components/WidgetHelpers.d.ts} +4 -8
- package/dist/admin/src/core/apis/Widgets.d.ts +29 -0
- package/dist/admin/src/features/AppInfo.d.ts +1 -1
- package/dist/admin/src/features/Auth.d.ts +1 -1
- package/dist/admin/src/features/BackButton.d.ts +1 -1
- package/dist/admin/src/features/StrapiApp.d.ts +2 -2
- package/dist/admin/src/index.d.ts +1 -0
- package/dist/admin/src/pages/Home/HomePage.d.ts +8 -0
- package/dist/server/server/src/services/homepage.js +3 -1
- package/dist/server/server/src/services/homepage.js.map +1 -1
- package/dist/server/server/src/services/homepage.mjs +3 -1
- package/dist/server/server/src/services/homepage.mjs.map +1 -1
- package/dist/server/src/services/homepage.d.ts +3 -0
- package/dist/server/src/services/homepage.d.ts.map +1 -1
- package/package.json +11 -11
- package/dist/admin/admin/src/pages/Home/components/Widget.js.map +0 -1
- package/dist/admin/admin/src/pages/Home/components/Widget.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport type { GetRecentDocuments, RecentDocument } from '../../../shared/contracts/homepage';\n\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const MAX_DOCUMENTS = 4;\n\n const metadataService = strapi.plugin('content-manager').service('document-metadata');\n const permissionService = strapi.admin.services.permission as typeof import('./permission');\n\n type ContentTypeConfiguration = {\n uid: RecentDocument['contentTypeUid'];\n settings: { mainField: string };\n };\n const getConfiguration = async (\n contentTypeUids: RecentDocument['contentTypeUid'][]\n ): Promise<ContentTypeConfiguration[]> => {\n /**\n * Don't use the strapi.store util because we need to make\n * more precise queries than exact key matches, in order to make as few queries as possible.\n */\n const coreStore = strapi.db.query('strapi::core-store');\n const rawConfigurations = await coreStore.findMany({\n where: {\n key: {\n $in: contentTypeUids.map(\n (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n ),\n },\n },\n });\n\n return rawConfigurations.map((rawConfiguration) => {\n return JSON.parse(rawConfiguration.value);\n });\n };\n\n const getPermittedContentTypes = async () => {\n const readPermissions = await permissionService.findMany({\n where: {\n role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n action: 'plugin::content-manager.explorer.read',\n },\n });\n\n return readPermissions\n .map((permission) => permission.subject)\n .filter(Boolean) as RecentDocument['contentTypeUid'][];\n };\n\n type ContentTypeMeta = {\n fields: string[];\n mainField: string;\n contentType: Schema.ContentType;\n hasDraftAndPublish: boolean;\n uid: RecentDocument['contentTypeUid'];\n };\n\n const getContentTypesMeta = (\n allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n configurations: ContentTypeConfiguration[]\n ): ContentTypeMeta[] => {\n return allowedContentTypeUids.map((uid) => {\n const configuration = configurations.find((config) => config.uid === uid);\n const contentType = strapi.contentType(uid);\n const fields = ['documentId', 'updatedAt'];\n\n // Add fields required to get the status if D&P is enabled\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n if (hasDraftAndPublish) {\n fields.push('publishedAt');\n }\n\n // Only add the main field if it's defined\n if (configuration?.settings.mainField) {\n fields.push(configuration.settings.mainField);\n }\n\n // Only add locale if it's localized\n const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n if (isLocalized) {\n fields.push('locale');\n }\n\n return {\n fields,\n mainField: configuration!.settings.mainField,\n contentType,\n hasDraftAndPublish,\n uid,\n };\n });\n };\n\n const formatDocuments = (documents: Modules.Documents.AnyDocument[], meta: ContentTypeMeta) => {\n return documents.map((document) => {\n return {\n documentId: document.documentId,\n locale: document.locale ?? null,\n updatedAt: new Date(document.updatedAt),\n title: document[meta.mainField ?? 'documentId'],\n publishedAt:\n meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n contentTypeUid: meta.uid,\n contentTypeDisplayName: meta.contentType.info.displayName,\n kind: meta.contentType.kind,\n };\n });\n };\n\n const addStatusToDocuments = async (documents: RecentDocument[]): Promise<RecentDocument[]> => {\n return Promise.all(\n documents.map(async (recentDocument) => {\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n strapi.contentType(recentDocument.contentTypeUid)\n );\n /**\n * Tries to query the other version of the document if draft and publish is enabled,\n * so that we know when to give the \"modified\" status.\n */\n const { availableStatus } = await metadataService.getMetadata(\n recentDocument.contentTypeUid,\n recentDocument,\n {\n availableStatus: hasDraftAndPublish,\n availableLocales: false,\n }\n );\n const status: RecentDocument['status'] = metadataService.getStatus(\n recentDocument,\n availableStatus\n );\n\n return {\n ...recentDocument,\n status: hasDraftAndPublish ? status : undefined,\n };\n })\n );\n };\n\n const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n const getPermissionChecker = (uid: string) =>\n permissionCheckerService.create({\n userAbility: strapi.requestContext.get()?.state.userAbility,\n model: uid,\n });\n\n return {\n async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const permittedContentTypes = await getPermittedContentTypes();\n const allowedContentTypeUids = permittedContentTypes.filter((uid) => {\n return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\n });\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n // Now actually fetch and format the documents\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n sort: 'publishedAt:desc',\n fields: meta.fields,\n status: 'published',\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n\n return formatDocuments(docs, meta);\n })\n );\n\n const overallRecentDocuments = recentDocuments\n .flat()\n .sort((a, b) => {\n if (!a.publishedAt || !b.publishedAt) return 0;\n return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n })\n .slice(0, MAX_DOCUMENTS);\n\n return addStatusToDocuments(overallRecentDocuments);\n },\n\n async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const allowedContentTypeUids = await getPermittedContentTypes();\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n // Now actually fetch and format the documents\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n sort: 'updatedAt:desc',\n fields: meta.fields,\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n\n return formatDocuments(docs, meta);\n })\n );\n\n const overallRecentDocuments = recentDocuments\n .flat()\n .sort((a, b) => {\n return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n })\n .slice(0, MAX_DOCUMENTS);\n\n return addStatusToDocuments(overallRecentDocuments);\n },\n };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","document","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","permissionCheckerService","getPermissionChecker","create","userAbility","model","getRecentlyPublishedDocuments","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","sort","docs","overallRecentDocuments","flat","a","b","valueOf","slice","getRecentlyUpdatedDocuments"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"homepage.mjs","sources":["../../../../../server/src/services/homepage.ts"],"sourcesContent":["import type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport type { GetRecentDocuments, RecentDocument } from '../../../shared/contracts/homepage';\n\n/**\n * TODO: Remove this service when the future flag for the widget api is removed\n */\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n const MAX_DOCUMENTS = 4;\n\n const metadataService = strapi.plugin('content-manager').service('document-metadata');\n const permissionService = strapi.admin.services.permission as typeof import('./permission');\n\n type ContentTypeConfiguration = {\n uid: RecentDocument['contentTypeUid'];\n settings: { mainField: string };\n };\n const getConfiguration = async (\n contentTypeUids: RecentDocument['contentTypeUid'][]\n ): Promise<ContentTypeConfiguration[]> => {\n /**\n * Don't use the strapi.store util because we need to make\n * more precise queries than exact key matches, in order to make as few queries as possible.\n */\n const coreStore = strapi.db.query('strapi::core-store');\n const rawConfigurations = await coreStore.findMany({\n where: {\n key: {\n $in: contentTypeUids.map(\n (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n ),\n },\n },\n });\n\n return rawConfigurations.map((rawConfiguration) => {\n return JSON.parse(rawConfiguration.value);\n });\n };\n\n const getPermittedContentTypes = async () => {\n const readPermissions = await permissionService.findMany({\n where: {\n role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n action: 'plugin::content-manager.explorer.read',\n },\n });\n\n return readPermissions\n .map((permission) => permission.subject)\n .filter(Boolean) as RecentDocument['contentTypeUid'][];\n };\n\n type ContentTypeMeta = {\n fields: string[];\n mainField: string;\n contentType: Schema.ContentType;\n hasDraftAndPublish: boolean;\n uid: RecentDocument['contentTypeUid'];\n };\n\n const getContentTypesMeta = (\n allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n configurations: ContentTypeConfiguration[]\n ): ContentTypeMeta[] => {\n return allowedContentTypeUids.map((uid) => {\n const configuration = configurations.find((config) => config.uid === uid);\n const contentType = strapi.contentType(uid);\n const fields = ['documentId', 'updatedAt'];\n\n // Add fields required to get the status if D&P is enabled\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n if (hasDraftAndPublish) {\n fields.push('publishedAt');\n }\n\n // Only add the main field if it's defined\n if (configuration?.settings.mainField) {\n fields.push(configuration.settings.mainField);\n }\n\n // Only add locale if it's localized\n const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n if (isLocalized) {\n fields.push('locale');\n }\n\n return {\n fields,\n mainField: configuration!.settings.mainField,\n contentType,\n hasDraftAndPublish,\n uid,\n };\n });\n };\n\n const formatDocuments = (documents: Modules.Documents.AnyDocument[], meta: ContentTypeMeta) => {\n return documents.map((document) => {\n return {\n documentId: document.documentId,\n locale: document.locale ?? null,\n updatedAt: new Date(document.updatedAt),\n title: document[meta.mainField ?? 'documentId'],\n publishedAt:\n meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n contentTypeUid: meta.uid,\n contentTypeDisplayName: meta.contentType.info.displayName,\n kind: meta.contentType.kind,\n };\n });\n };\n\n const addStatusToDocuments = async (documents: RecentDocument[]): Promise<RecentDocument[]> => {\n return Promise.all(\n documents.map(async (recentDocument) => {\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n strapi.contentType(recentDocument.contentTypeUid)\n );\n /**\n * Tries to query the other version of the document if draft and publish is enabled,\n * so that we know when to give the \"modified\" status.\n */\n const { availableStatus } = await metadataService.getMetadata(\n recentDocument.contentTypeUid,\n recentDocument,\n {\n availableStatus: hasDraftAndPublish,\n availableLocales: false,\n }\n );\n const status: RecentDocument['status'] = metadataService.getStatus(\n recentDocument,\n availableStatus\n );\n\n return {\n ...recentDocument,\n status: hasDraftAndPublish ? status : undefined,\n };\n })\n );\n };\n\n const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n const getPermissionChecker = (uid: string) =>\n permissionCheckerService.create({\n userAbility: strapi.requestContext.get()?.state.userAbility,\n model: uid,\n });\n\n return {\n async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const permittedContentTypes = await getPermittedContentTypes();\n const allowedContentTypeUids = permittedContentTypes.filter((uid) => {\n return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\n });\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n // Now actually fetch and format the documents\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n sort: 'publishedAt:desc',\n fields: meta.fields,\n status: 'published',\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n\n return formatDocuments(docs, meta);\n })\n );\n\n const overallRecentDocuments = recentDocuments\n .flat()\n .sort((a, b) => {\n if (!a.publishedAt || !b.publishedAt) return 0;\n return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n })\n .slice(0, MAX_DOCUMENTS);\n\n return addStatusToDocuments(overallRecentDocuments);\n },\n\n async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n const allowedContentTypeUids = await getPermittedContentTypes();\n // Fetch the configuration for each content type in a single query\n const configurations = await getConfiguration(allowedContentTypeUids);\n // Get the necessary metadata for the documents\n const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n // Now actually fetch and format the documents\n const recentDocuments = await Promise.all(\n contentTypesMeta.map(async (meta) => {\n const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n limit: MAX_DOCUMENTS,\n sort: 'updatedAt:desc',\n fields: meta.fields,\n });\n\n const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n\n return formatDocuments(docs, meta);\n })\n );\n\n const overallRecentDocuments = recentDocuments\n .flat()\n .sort((a, b) => {\n return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n })\n .slice(0, MAX_DOCUMENTS);\n\n return addStatusToDocuments(overallRecentDocuments);\n },\n };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","document","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","permissionCheckerService","getPermissionChecker","create","userAbility","model","getRecentlyPublishedDocuments","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","sort","docs","overallRecentDocuments","flat","a","b","valueOf","slice","getRecentlyUpdatedDocuments"],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import type { Core } from '@strapi/types';
|
|
3
3
|
import type { GetRecentDocuments } from '../../../shared/contracts/homepage';
|
|
4
|
+
/**
|
|
5
|
+
* TODO: Remove this service when the future flag for the widget api is removed
|
|
6
|
+
*/
|
|
4
7
|
declare const createHomepageService: ({ strapi }: {
|
|
5
8
|
strapi: Core.Strapi;
|
|
6
9
|
}) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../server/src/services/homepage.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAkB,MAAM,oCAAoC,CAAC;AAE7F,QAAA,MAAM,qBAAqB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;qCAiJvB,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;mCAoC9C,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;CA+BpF,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../server/src/services/homepage.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAkB,MAAM,oCAAoC,CAAC;AAE7F;;GAEG;AACH,QAAA,MAAM,qBAAqB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;qCAiJvB,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;mCAoC9C,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;CA+BpF,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/admin",
|
|
3
|
-
"version": "5.12.
|
|
3
|
+
"version": "5.12.5",
|
|
4
4
|
"description": "Strapi Admin",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -84,16 +84,16 @@
|
|
|
84
84
|
"@radix-ui/react-context": "1.0.1",
|
|
85
85
|
"@radix-ui/react-toolbar": "1.0.4",
|
|
86
86
|
"@reduxjs/toolkit": "1.9.7",
|
|
87
|
-
"@strapi/design-system": "2.0.0-rc.
|
|
88
|
-
"@strapi/icons": "2.0.0-rc.
|
|
89
|
-
"@strapi/permissions": "5.12.
|
|
90
|
-
"@strapi/types": "5.12.
|
|
91
|
-
"@strapi/typescript-utils": "5.12.
|
|
92
|
-
"@strapi/utils": "5.12.
|
|
87
|
+
"@strapi/design-system": "2.0.0-rc.21",
|
|
88
|
+
"@strapi/icons": "2.0.0-rc.21",
|
|
89
|
+
"@strapi/permissions": "5.12.5",
|
|
90
|
+
"@strapi/types": "5.12.5",
|
|
91
|
+
"@strapi/typescript-utils": "5.12.5",
|
|
92
|
+
"@strapi/utils": "5.12.5",
|
|
93
93
|
"@testing-library/dom": "10.1.0",
|
|
94
94
|
"@testing-library/react": "15.0.7",
|
|
95
95
|
"@testing-library/user-event": "14.5.2",
|
|
96
|
-
"axios": "1.8.
|
|
96
|
+
"axios": "1.8.4",
|
|
97
97
|
"bcryptjs": "2.4.3",
|
|
98
98
|
"boxen": "5.1.2",
|
|
99
99
|
"chalk": "^4.1.2",
|
|
@@ -143,8 +143,8 @@
|
|
|
143
143
|
"zod": "^3.22.4"
|
|
144
144
|
},
|
|
145
145
|
"devDependencies": {
|
|
146
|
-
"@strapi/admin-test-utils": "5.12.
|
|
147
|
-
"@strapi/data-transfer": "5.12.
|
|
146
|
+
"@strapi/admin-test-utils": "5.12.5",
|
|
147
|
+
"@strapi/data-transfer": "5.12.5",
|
|
148
148
|
"@types/codemirror5": "npm:@types/codemirror@^5.60.15",
|
|
149
149
|
"@types/fs-extra": "11.0.4",
|
|
150
150
|
"@types/invariant": "2.2.36",
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"react-dom": "18.3.1",
|
|
168
168
|
"react-router-dom": "6.22.3",
|
|
169
169
|
"styled-components": "6.1.8",
|
|
170
|
-
"vite": "5.4.
|
|
170
|
+
"vite": "5.4.17",
|
|
171
171
|
"vite-plugin-dts": "^4.3.0"
|
|
172
172
|
},
|
|
173
173
|
"peerDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Widget.js","sources":["../../../../../../../admin/src/pages/Home/components/Widget.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Flex, type FlexProps, Loader, Typography } from '@strapi/design-system';\nimport { PuzzlePiece, WarningCircle } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\ninterface RootProps {\n title: MessageDescriptor;\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n children: React.ReactNode;\n}\n\nconst Root = ({ title, icon = PuzzlePiece, children }: RootProps) => {\n const { formatMessage } = useIntl();\n const id = React.useId();\n const Icon = icon;\n\n return (\n <Flex\n width=\"100%\"\n hasRadius\n direction=\"column\"\n alignItems=\"flex-start\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n shadow=\"tableShadow\"\n tag=\"section\"\n gap={4}\n padding={6}\n aria-labelledby={id}\n >\n <Flex direction=\"row\" alignItems=\"center\" gap={2} tag=\"header\">\n <Icon fill=\"neutral500\" aria-hidden />\n <Typography textColor=\"neutral500\" variant=\"sigma\" tag=\"h2\" id={id}>\n {formatMessage(title)}\n </Typography>\n </Flex>\n <Box width=\"100%\" height=\"261px\" overflow=\"auto\" tag=\"main\">\n {children}\n </Box>\n </Flex>\n );\n};\n\ninterface LoadingProps {\n children?: string;\n}\n\nconst Loading = ({ children }: LoadingProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex height=\"100%\" justifyContent=\"center\" alignItems=\"center\">\n <Loader>\n {children ??\n formatMessage({\n id: 'HomePage.widget.loading',\n defaultMessage: 'Loading widget content',\n })}\n </Loader>\n </Flex>\n );\n};\n\ninterface ErrorProps {\n children?: string;\n}\n\nconst Error = ({ children }: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex height=\"100%\" direction=\"column\" justifyContent=\"center\" alignItems=\"center\" gap={2}>\n <WarningCircle width=\"3.2rem\" height=\"3.2rem\" fill=\"danger600\" />\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'global.error',\n defaultMessage: 'Something went wrong',\n })}\n </Typography>\n <Typography textColor=\"neutral600\">\n {children ??\n formatMessage({\n id: 'HomePage.widget.error',\n defaultMessage: \"Couldn't load widget content.\",\n })}\n </Typography>\n </Flex>\n );\n};\n\ninterface NoDataProps {\n children?: string;\n}\n\nconst NoData = ({ children }: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex height=\"100%\" direction=\"column\" justifyContent=\"center\" alignItems=\"center\" gap={6}>\n <EmptyDocuments width=\"16rem\" height=\"8.8rem\" />\n <Typography textColor=\"neutral600\">\n {children ??\n formatMessage({\n id: 'HomePage.widget.no-data',\n defaultMessage: 'No content found.',\n })}\n </Typography>\n </Flex>\n );\n};\n\nconst Widget = {\n Root,\n Loading,\n Error,\n NoData,\n};\n\nexport { Widget };\n"],"names":["Root","title","icon","PuzzlePiece","children","formatMessage","useIntl","id","React","useId","Icon","_jsxs","Flex","width","hasRadius","direction","alignItems","background","borderColor","shadow","tag","gap","padding","aria-labelledby","_jsx","fill","aria-hidden","Typography","textColor","variant","Box","height","overflow","Loading","justifyContent","Loader","defaultMessage","Error","WarningCircle","NoData","EmptyDocuments","Widget"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Widget.mjs","sources":["../../../../../../../admin/src/pages/Home/components/Widget.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Flex, type FlexProps, Loader, Typography } from '@strapi/design-system';\nimport { PuzzlePiece, WarningCircle } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\ninterface RootProps {\n title: MessageDescriptor;\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n children: React.ReactNode;\n}\n\nconst Root = ({ title, icon = PuzzlePiece, children }: RootProps) => {\n const { formatMessage } = useIntl();\n const id = React.useId();\n const Icon = icon;\n\n return (\n <Flex\n width=\"100%\"\n hasRadius\n direction=\"column\"\n alignItems=\"flex-start\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n shadow=\"tableShadow\"\n tag=\"section\"\n gap={4}\n padding={6}\n aria-labelledby={id}\n >\n <Flex direction=\"row\" alignItems=\"center\" gap={2} tag=\"header\">\n <Icon fill=\"neutral500\" aria-hidden />\n <Typography textColor=\"neutral500\" variant=\"sigma\" tag=\"h2\" id={id}>\n {formatMessage(title)}\n </Typography>\n </Flex>\n <Box width=\"100%\" height=\"261px\" overflow=\"auto\" tag=\"main\">\n {children}\n </Box>\n </Flex>\n );\n};\n\ninterface LoadingProps {\n children?: string;\n}\n\nconst Loading = ({ children }: LoadingProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex height=\"100%\" justifyContent=\"center\" alignItems=\"center\">\n <Loader>\n {children ??\n formatMessage({\n id: 'HomePage.widget.loading',\n defaultMessage: 'Loading widget content',\n })}\n </Loader>\n </Flex>\n );\n};\n\ninterface ErrorProps {\n children?: string;\n}\n\nconst Error = ({ children }: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex height=\"100%\" direction=\"column\" justifyContent=\"center\" alignItems=\"center\" gap={2}>\n <WarningCircle width=\"3.2rem\" height=\"3.2rem\" fill=\"danger600\" />\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'global.error',\n defaultMessage: 'Something went wrong',\n })}\n </Typography>\n <Typography textColor=\"neutral600\">\n {children ??\n formatMessage({\n id: 'HomePage.widget.error',\n defaultMessage: \"Couldn't load widget content.\",\n })}\n </Typography>\n </Flex>\n );\n};\n\ninterface NoDataProps {\n children?: string;\n}\n\nconst NoData = ({ children }: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex height=\"100%\" direction=\"column\" justifyContent=\"center\" alignItems=\"center\" gap={6}>\n <EmptyDocuments width=\"16rem\" height=\"8.8rem\" />\n <Typography textColor=\"neutral600\">\n {children ??\n formatMessage({\n id: 'HomePage.widget.no-data',\n defaultMessage: 'No content found.',\n })}\n </Typography>\n </Flex>\n );\n};\n\nconst Widget = {\n Root,\n Loading,\n Error,\n NoData,\n};\n\nexport { Widget };\n"],"names":["Root","title","icon","PuzzlePiece","children","formatMessage","useIntl","id","React","useId","Icon","_jsxs","Flex","width","hasRadius","direction","alignItems","background","borderColor","shadow","tag","gap","padding","aria-labelledby","_jsx","fill","aria-hidden","Typography","textColor","variant","Box","height","overflow","Loading","justifyContent","Loader","defaultMessage","Error","WarningCircle","NoData","EmptyDocuments","Widget"],"mappings":"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"}
|