import {
buildValidParams as buildValidParams2,
getStageColorByHex
} from "./chunk-KGPWUC7Q.js";
import {
PERMISSIONS as PERMISSIONS5,
ReleaseActionMenu,
ReleaseActionOptions,
index,
pluginId as pluginId4
} from "./chunk-FVEHK4NK.js";
import {
getTimezoneOffset,
useCreateManyReleaseActionsMutation,
useCreateReleaseActionMutation,
useGetMappedEntriesInReleasesQuery,
useGetReleasesForEntryQuery,
useGetReleasesQuery
} from "./chunk-C4NW23D7.js";
import {
CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME,
CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME,
FEATURE_ID,
LimitsModal,
PLUGIN_ID,
STAGE_COLOR_DEFAULT,
useGetStagesQuery,
useUpdateAssigneeMutation,
useUpdateStageMutation
} from "./chunk-E3IW2VDN.js";
import {
useTypedSelector
} from "./chunk-MN3D3XJI.js";
import {
PERMISSIONS as PERMISSIONS4,
getTranslation,
i18nApi,
pluginId as pluginId3,
useGetLocalesQuery
} from "./chunk-U66AL5Y5.js";
import {
AssetGridList,
AudioPreview,
Breadcrumbs,
CopyLinkButton,
EditAssetContent,
EditAssetDialog,
EditFolderContent,
EditFolderDialog,
EmptyAssets,
FilterList,
FilterPopover,
FolderCard,
FolderCardBody,
FolderCardBodyAction,
FolderGridList,
SortPicker,
TableList,
UploadAssetDialog,
VideoPreview,
containsAssetFilter,
createAssetUrl,
displayedFilters,
prefixFileUrlWithBackendUrl,
rawFileToAsset,
useAssets,
useFolder,
useFolders,
useMediaLibraryPermissions,
usePersistentState,
useSelectionState
} from "./chunk-7KYK3FTC.js";
import {
useConfig
} from "./chunk-JF4AI5LV.js";
import {
AssetSource,
AssetType,
PERMISSIONS as PERMISSIONS3,
getTrad,
localStorageKeys,
pluginId as pluginId2,
pluginPkg,
viewOptions
} from "./chunk-ALMC553V.js";
import {
PERMISSIONS as PERMISSIONS2
} from "./chunk-PDGPTUUZ.js";
import {
useDocumentActions
} from "./chunk-GXKJFURG.js";
import {
buildValidParams,
useDocument,
useDocumentLayout
} from "./chunk-UATNJIHQ.js";
import {
PERMISSIONS,
reducer,
reducer2
} from "./chunk-7HX4OIS5.js";
import {
pluginId
} from "./chunk-SQLDXQZE.js";
import {
renderAdmin
} from "./chunk-QF6GPHA4.js";
import {
useLicenseLimits
} from "./chunk-G2UWKDMB.js";
import {
require_omit
} from "./chunk-5ESYXDTN.js";
import {
require_cloneDeep
} from "./chunk-GGK2TLCV.js";
import {
Form,
Formik,
useFormik
} from "./chunk-PW7XKCYO.js";
import {
create3 as create,
create4 as create2,
create6 as create3
} from "./chunk-XLSIZGJF.js";
import {
useTracking
} from "./chunk-GSN7U3BK.js";
import {
Table,
useTable
} from "./chunk-ZM6TT53G.js";
import {
useField,
useForm
} from "./chunk-BFLP6DBI.js";
import {
useRBAC
} from "./chunk-CMLQV3Z2.js";
import {
useAdminUsers
} from "./chunk-IGCTEXRF.js";
import {
ForwardRef$J,
Page,
useAPIErrorHandler
} from "./chunk-5CAWUBTQ.js";
import {
useAuth,
useQueryParams
} from "./chunk-W2TBR6J3.js";
import {
isFetchError,
require_get,
require_lib,
skipToken
} from "./chunk-LCL5TIBZ.js";
import {
useNotification
} from "./chunk-N55RVBRV.js";
import {
Badge,
Box,
Button,
CarouselActions,
CarouselInput,
CarouselSlide,
CheckboxImpl,
Combobox,
Dialog,
Divider,
EmptyStateLayout,
Field,
Flex,
Grid,
IconButton,
Link as Link2,
LinkButton,
Loader,
Modal,
Option,
Popover,
SearchForm,
Searchbar,
SingleSelect,
SingleSelectOption,
Status,
Tabs,
TooltipImpl,
Typography,
VisuallyHidden,
useCollator,
useIntl
} from "./chunk-7XB6XSWQ.js";
import {
Link,
matchPath,
useNavigate,
useParams
} from "./chunk-TUXTO2Z5.js";
import {
ForwardRef$1B,
ForwardRef$1f,
ForwardRef$1h,
ForwardRef$1v,
ForwardRef$2J,
ForwardRef$2n,
ForwardRef$2p,
ForwardRef$2x,
ForwardRef$3,
ForwardRef$39,
ForwardRef$3P,
ForwardRef$3j,
ForwardRef$3p,
ForwardRef$3v,
ForwardRef$43,
ForwardRef$45,
ForwardRef$4D,
ForwardRef$4T,
ForwardRef$4v,
ForwardRef$4x,
ForwardRef$59,
ForwardRef$X,
ForwardRef$j
} from "./chunk-WRD5KPDH.js";
import {
require_jsx_runtime
} from "./chunk-NIAJZ5MX.js";
import {
dt,
lt
} from "./chunk-ACIMPXWY.js";
import {
require_react
} from "./chunk-MADUDGYZ.js";
import {
__toESM
} from "./chunk-PLDDJCW6.js";
// node_modules/@strapi/content-type-builder/dist/admin/reducers.mjs
var reducers = {
[`${pluginId}_formModal`]: reducer2,
[`${pluginId}_dataManagerProvider`]: reducer
};
// node_modules/@strapi/content-type-builder/dist/admin/utils/formAPI.mjs
var import_cloneDeep = __toESM(require_cloneDeep(), 1);
var import_get = __toESM(require_get(), 1);
var formsAPI = {
components: {
inputs: {},
add({ id, component }) {
if (!this.inputs[id]) {
this.inputs[id] = component;
}
}
},
types: {
attribute: {},
contentType: {
validators: [],
form: {
advanced: [],
base: []
}
},
component: {
validators: [],
form: {
advanced: [],
base: []
}
}
},
contentTypeSchemaMutations: [],
addContentTypeSchemaMutation(cb) {
this.contentTypeSchemaMutations.push(cb);
},
extendContentType({ validator, form: { advanced, base } }) {
const { contentType } = this.types;
if (validator) {
contentType.validators.push(validator);
}
contentType.form.advanced.push(advanced);
contentType.form.base.push(base);
},
extendFields(fields, { validator, form: { advanced, base } }) {
const formType = this.types.attribute;
fields.forEach((field) => {
if (!formType[field]) {
formType[field] = {
validators: [],
form: {
advanced: [],
base: []
}
};
}
if (validator) {
formType[field].validators.push(validator);
}
formType[field].form.advanced.push(advanced);
formType[field].form.base.push(base);
});
},
getAdvancedForm(target, props = null) {
const sectionsToAdd = (0, import_get.default)(this.types, [
...target,
"form",
"advanced"
], []).reduce((acc, current) => {
const sections = current(props);
return [
...acc,
...sections
];
}, []);
return sectionsToAdd;
},
makeCustomFieldValidator(attributeShape, validator, ...validatorArgs) {
if (!validator) return attributeShape;
return attributeShape.shape({
options: create3().shape(validator(validatorArgs))
});
},
makeValidator(target, initShape, ...args) {
const validators = (0, import_get.default)(this.types, [
...target,
"validators"
], []);
const pluginOptionsShape = validators.reduce((acc, current) => {
const pluginOptionShape = current(args);
return {
...acc,
...pluginOptionShape
};
}, {});
return initShape.shape({
pluginOptions: create3().shape(pluginOptionsShape)
});
},
mutateContentTypeSchema(data, initialData) {
let enhancedData = (0, import_cloneDeep.default)(data);
const refData = (0, import_cloneDeep.default)(initialData);
this.contentTypeSchemaMutations.forEach((cb) => {
enhancedData = cb(enhancedData, refData);
});
return enhancedData;
}
};
// node_modules/@strapi/content-type-builder/dist/admin/utils/prefixPluginTranslations.mjs
var prefixPluginTranslations = (trad, pluginId5) => {
return Object.keys(trad).reduce((acc, current) => {
acc[`${pluginId5}.${current}`] = trad[current];
return acc;
}, {});
};
// node_modules/@strapi/content-type-builder/dist/admin/index.mjs
function __variableDynamicImportRuntime1__(path) {
switch (path) {
case "./translations/ar.json":
return import("./ar.json-3PFZZ3QC.js");
case "./translations/cs.json":
return import("./cs.json-BVIOKZG5.js");
case "./translations/de.json":
return import("./de.json-ANFC3UZR.js");
case "./translations/dk.json":
return import("./dk.json-6IAHVXGK.js");
case "./translations/en.json":
return import("./en.json-PWWUQZ3K.js");
case "./translations/es.json":
return import("./es.json-KFUNLRKE.js");
case "./translations/fr.json":
return import("./fr.json-FMGLNYTU.js");
case "./translations/id.json":
return import("./id.json-3OG5LH4D.js");
case "./translations/it.json":
return import("./it.json-VSEWBEC2.js");
case "./translations/ja.json":
return import("./ja.json-DWADQSVY.js");
case "./translations/ko.json":
return import("./ko.json-7T2BNQD5.js");
case "./translations/ms.json":
return import("./ms.json-OYRQIG7I.js");
case "./translations/nl.json":
return import("./nl.json-ZXDL5NWV.js");
case "./translations/pl.json":
return import("./pl.json-VIMQBH35.js");
case "./translations/pt-BR.json":
return import("./pt-BR.json-T4XKDE6W.js");
case "./translations/pt.json":
return import("./pt.json-WXQYIHXO.js");
case "./translations/ru.json":
return import("./ru.json-T6RCGPRT.js");
case "./translations/sk.json":
return import("./sk.json-A33FQAC4.js");
case "./translations/sv.json":
return import("./sv.json-KVW33BBW.js");
case "./translations/th.json":
return import("./th.json-VEBY3S5D.js");
case "./translations/tr.json":
return import("./tr.json-DNP2QMP3.js");
case "./translations/uk.json":
return import("./uk.json-CP6ZJYY2.js");
case "./translations/zh-Hans.json":
return import("./zh-Hans.json-7GSLOS5T.js");
case "./translations/zh.json":
return import("./zh.json-HBRR4C2Q.js");
default:
return new Promise(function(resolve, reject) {
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
reject.bind(null, new Error("Unknown variable dynamic import: " + path))
);
});
}
}
var index2 = {
register(app) {
app.addReducers(reducers);
app.addMenuLink({
to: `plugins/${pluginId}`,
icon: ForwardRef$2x,
intlLabel: {
id: `${pluginId}.plugin.name`,
defaultMessage: "Content-Type Builder"
},
permissions: PERMISSIONS.main,
Component: () => import("./App-H27Y6V6P.js"),
position: 5
});
app.registerPlugin({
id: pluginId,
name: pluginId,
// Internal APIs exposed by the CTB for the other plugins to use
apis: {
forms: formsAPI
}
});
},
bootstrap() {
},
async registerTrads({ locales }) {
const importedTrads = await Promise.all(locales.map((locale) => {
return __variableDynamicImportRuntime1__(`./translations/${locale}.json`).then(({ default: data }) => {
return {
data: prefixPluginTranslations(data, pluginId),
locale
};
}).catch(() => {
return {
data: {},
locale
};
});
}));
return Promise.resolve(importedTrads);
}
};
// node_modules/@strapi/email/dist/admin/utils/prefixPluginTranslations.mjs
var prefixPluginTranslations2 = (trad, pluginId5) => {
return Object.keys(trad).reduce((acc, current) => {
acc[`${pluginId5}.${current}`] = trad[current];
return acc;
}, {});
};
// node_modules/@strapi/email/dist/admin/index.mjs
function __variableDynamicImportRuntime1__2(path) {
switch (path) {
case "./translations/ar.json":
return import("./ar.json-XT2AE5MD.js");
case "./translations/cs.json":
return import("./cs.json-5JA7XHIC.js");
case "./translations/de.json":
return import("./de.json-7VRMCTYR.js");
case "./translations/dk.json":
return import("./dk.json-XKI7CLW6.js");
case "./translations/en.json":
return import("./en.json-MD5H2ZNO.js");
case "./translations/es.json":
return import("./es.json-WU2KAU5P.js");
case "./translations/fr.json":
return import("./fr.json-HZUEJNY3.js");
case "./translations/id.json":
return import("./id.json-FHZVCNDO.js");
case "./translations/it.json":
return import("./it.json-B3SKNTFX.js");
case "./translations/ja.json":
return import("./ja.json-EZKJRE4T.js");
case "./translations/ko.json":
return import("./ko.json-IY4N3EIS.js");
case "./translations/ms.json":
return import("./ms.json-XXLISYOZ.js");
case "./translations/nl.json":
return import("./nl.json-OPZTYQ5F.js");
case "./translations/pl.json":
return import("./pl.json-KIA6EPL4.js");
case "./translations/pt-BR.json":
return import("./pt-BR.json-6GSTCGDQ.js");
case "./translations/pt.json":
return import("./pt.json-TC5QVEJX.js");
case "./translations/ru.json":
return import("./ru.json-626W5GSD.js");
case "./translations/sk.json":
return import("./sk.json-3JI2YCKF.js");
case "./translations/th.json":
return import("./th.json-Z6CZT4Y2.js");
case "./translations/tr.json":
return import("./tr.json-MLYUSLWC.js");
case "./translations/uk.json":
return import("./uk.json-L5EGH2OL.js");
case "./translations/vi.json":
return import("./vi.json-PPZALNIY.js");
case "./translations/zh-Hans.json":
return import("./zh-Hans.json-RVHRMTOJ.js");
case "./translations/zh.json":
return import("./zh.json-4S7OU5HD.js");
default:
return new Promise(function(resolve, reject) {
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
reject.bind(null, new Error("Unknown variable dynamic import: " + path))
);
});
}
}
var admin = {
// TODO typing app in strapi/types as every plugin needs it
// eslint-disable-next-line @typescript-eslint/no-explicit-any
register(app) {
app.createSettingSection({
id: "email",
intlLabel: {
id: "email.SettingsNav.section-label",
defaultMessage: "Email Plugin"
}
}, [
{
intlLabel: {
id: "email.Settings.email.plugin.title",
defaultMessage: "Settings"
},
id: "settings",
to: "email",
Component: () => import("./Settings-GIICDRUW.js").then((mod) => ({
default: mod.ProtectedSettingsPage
})),
permissions: PERMISSIONS2.settings
}
]);
app.registerPlugin({
id: "email",
name: "email"
});
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
bootstrap() {
},
async registerTrads({ locales }) {
const importedTrads = await Promise.all(locales.map((locale) => {
return __variableDynamicImportRuntime1__2(`./translations/${locale}.json`).then(({ default: data }) => {
return {
data: prefixPluginTranslations2(data, "email"),
locale
};
}).catch(() => {
return {
data: {},
locale
};
});
}));
return Promise.resolve(importedTrads);
}
};
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs
var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
var React6 = __toESM(require_react(), 1);
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/AssetDialog.mjs
var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
var React5 = __toESM(require_react(), 1);
// node_modules/@strapi/upload/dist/admin/hooks/useModalQueryParams.mjs
var React = __toESM(require_react(), 1);
var import_qs = __toESM(require_lib(), 1);
var useModalQueryParams = (initialState) => {
const { trackUsage } = useTracking();
const { config: { data: config } } = useConfig();
const [queryObject, setQueryObject] = React.useState({
page: 1,
sort: "updatedAt:DESC",
pageSize: 10,
filters: {
$and: []
},
...initialState
});
React.useEffect(() => {
if (config && "sort" in config && "pageSize" in config) {
setQueryObject((prevQuery) => ({
...prevQuery,
sort: config.sort,
pageSize: config.pageSize
}));
}
}, [
config
]);
const handleChangeFilters = (nextFilters) => {
if (nextFilters) {
trackUsage("didFilterMediaLibraryElements", {
location: "content-manager",
filter: Object.keys(nextFilters[nextFilters.length - 1])[0]
});
setQueryObject((prev) => ({
...prev,
page: 1,
filters: {
$and: nextFilters
}
}));
}
};
const handleChangePageSize = (pageSize) => {
setQueryObject((prev) => ({
...prev,
pageSize: typeof pageSize === "string" ? parseInt(pageSize, 10) : pageSize,
page: 1
}));
};
const handeChangePage = (page) => {
setQueryObject((prev) => ({
...prev,
page
}));
};
const handleChangeSort = (sort) => {
if (sort) {
trackUsage("didSortMediaLibraryElements", {
location: "content-manager",
sort
});
setQueryObject((prev) => ({
...prev,
sort
}));
}
};
const handleChangeSearch = (_q) => {
if (_q) {
setQueryObject((prev) => ({
...prev,
_q,
page: 1
}));
} else {
const newState = {
page: 1
};
Object.keys(queryObject).forEach((key) => {
if (![
"page",
"_q"
].includes(key)) {
newState[key] = queryObject[key];
}
});
setQueryObject(newState);
}
};
const handleChangeFolder = (folder, folderPath) => {
setQueryObject((prev) => ({
...prev,
folder: folder ?? null,
folderPath
}));
};
return [
{
queryObject,
rawQuery: (0, import_qs.stringify)(queryObject, {
encode: false
})
},
{
onChangeFilters: handleChangeFilters,
onChangeFolder: handleChangeFolder,
onChangePage: handeChangePage,
onChangePageSize: handleChangePageSize,
onChangeSort: handleChangeSort,
onChangeSearch: handleChangeSearch
}
];
};
// node_modules/@strapi/upload/dist/admin/utils/toSingularTypes.mjs
var toSingularTypes = (types) => {
if (!types) {
return [];
}
return types.map((type) => type.substring(0, type.length - 1));
};
// node_modules/@strapi/upload/dist/admin/utils/getAllowedFiles.mjs
var getAllowedFiles = (pluralTypes, files) => {
const singularTypes = toSingularTypes(pluralTypes);
const allowedFiles = files.filter((file) => {
var _a;
const fileType = (_a = file == null ? void 0 : file.mime) == null ? void 0 : _a.split("/")[0];
if (!fileType) {
return false;
}
if (singularTypes.includes("file") && ![
"video",
"image",
"audio"
].includes(fileType)) {
return true;
}
return singularTypes.includes(fileType);
});
return allowedFiles;
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/AssetDialog.mjs
var import_qs6 = __toESM(require_lib(), 1);
// node_modules/@strapi/upload/dist/admin/utils/moveElement.mjs
var move = (array, oldIndex, newIndex) => {
if (newIndex >= array.length) {
newIndex = array.length - 1;
}
array.splice(newIndex, 0, array.splice(oldIndex, 1)[0]);
return array;
};
var moveElement = (array, index4, offset) => {
const newIndex = index4 + offset;
return move(array, index4, newIndex);
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs
var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
// node_modules/@strapi/upload/dist/admin/utils/getBreadcrumbDataCM.mjs
var getBreadcrumbDataCM = (folder) => {
var _a;
const data = [
{
id: null,
label: {
id: getTrad("plugin.name"),
defaultMessage: "Media Library"
}
}
];
if ((_a = folder == null ? void 0 : folder.parent) == null ? void 0 : _a.parent) {
data.push([]);
}
if (folder == null ? void 0 : folder.parent) {
data.push({
id: folder.parent.id,
label: folder.parent.name,
path: folder.parent.path
});
}
if (folder) {
data.push({
id: folder.id,
label: folder.name,
path: folder.path
});
}
return data;
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs
var import_qs4 = __toESM(require_lib(), 1);
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs
var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
var React2 = __toESM(require_react(), 1);
var import_qs2 = __toESM(require_lib(), 1);
var Filters = ({ appliedFilters, onChangeFilters }) => {
const [open, setOpen] = React2.useState(false);
const { formatMessage } = useIntl();
return (0, import_jsx_runtime.jsxs)(Popover.Root, {
open,
onOpenChange: setOpen,
children: [
(0, import_jsx_runtime.jsx)(Popover.Trigger, {
children: (0, import_jsx_runtime.jsx)(Button, {
variant: "tertiary",
startIcon: (0, import_jsx_runtime.jsx)(ForwardRef$3j, {}),
size: "S",
children: formatMessage({
id: "app.utils.filters",
defaultMessage: "Filters"
})
})
}),
(0, import_jsx_runtime.jsx)(FilterPopover, {
onToggle: () => setOpen((prev) => !prev),
displayedFilters,
filters: appliedFilters,
onSubmit: onChangeFilters
}),
appliedFilters && (0, import_jsx_runtime.jsx)(FilterList, {
appliedFilters,
filtersSchema: displayedFilters,
onRemoveFilter: onChangeFilters
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
var PageSize = ({ onChangePageSize, pageSize }) => {
const { formatMessage } = useIntl();
const handleChange = (value) => {
onChangePageSize(Number(value));
};
return (0, import_jsx_runtime2.jsxs)(Flex, {
children: [
(0, import_jsx_runtime2.jsxs)(SingleSelect, {
size: "S",
"aria-label": formatMessage({
id: "components.PageFooter.select",
defaultMessage: "Entries per page"
}),
onChange: handleChange,
value: pageSize.toString(),
children: [
(0, import_jsx_runtime2.jsx)(SingleSelectOption, {
value: "10",
children: "10"
}),
(0, import_jsx_runtime2.jsx)(SingleSelectOption, {
value: "20",
children: "20"
}),
(0, import_jsx_runtime2.jsx)(SingleSelectOption, {
value: "50",
children: "50"
}),
(0, import_jsx_runtime2.jsx)(SingleSelectOption, {
value: "100",
children: "100"
})
]
}),
(0, import_jsx_runtime2.jsx)(Box, {
paddingLeft: 2,
children: (0, import_jsx_runtime2.jsx)(Typography, {
textColor: "neutral600",
tag: "label",
htmlFor: "page-size",
children: formatMessage({
id: "components.PageFooter.select",
defaultMessage: "Entries per page"
})
})
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs
var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
var React3 = __toESM(require_react(), 1);
var PaginationContext = React3.createContext({
activePage: 1,
pageCount: 1
});
var usePagination = () => React3.useContext(PaginationContext);
var Pagination = ({ children, activePage, pageCount, label = "pagination" }) => {
const paginationValue = React3.useMemo(() => ({
activePage,
pageCount
}), [
activePage,
pageCount
]);
return (0, import_jsx_runtime3.jsx)(PaginationContext.Provider, {
value: paginationValue,
children: (0, import_jsx_runtime3.jsx)(Box, {
tag: "nav",
"aria-label": label,
children: (0, import_jsx_runtime3.jsx)(Flex, {
tag: "ul",
gap: 1,
children
})
})
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs
var PaginationText = dt(Typography)`
line-height: revert;
`;
var linkWrapperStyles = lt`
padding: ${({ theme }) => theme.spaces[3]};
border-radius: ${({ theme }) => theme.borderRadius};
box-shadow: ${({ $active, theme }) => $active ? theme.shadows.filterShadow : void 0};
text-decoration: none;
display: flex;
position: relative;
outline: none;
&:after {
transition-property: all;
transition-duration: 0.2s;
border-radius: 8px;
content: '';
position: absolute;
top: -4px;
bottom: -4px;
left: -4px;
right: -4px;
border: 2px solid transparent;
}
&:focus-visible {
outline: none;
&:after {
border-radius: 8px;
content: '';
position: absolute;
top: -5px;
bottom: -5px;
left: -5px;
right: -5px;
border: 2px solid ${(props) => props.theme.colors.primary600};
}
}
`;
var LinkWrapperButton = dt.button`
${linkWrapperStyles}
`;
var LinkWrapperDiv = dt.div`
${linkWrapperStyles}
`;
LinkWrapperButton.defaultProps = {
type: "button"
};
var PageLinkWrapper = dt(LinkWrapperButton)`
color: ${({ theme, $active }) => $active ? theme.colors.primary700 : theme.colors.neutral800};
background: ${({ theme, $active }) => $active ? theme.colors.neutral0 : void 0};
&:hover {
box-shadow: ${({ theme }) => theme.shadows.filterShadow};
}
`;
var ActionLinkWrapper = dt(LinkWrapperButton)`
font-size: 1.1rem;
svg path {
fill: ${(p) => p["aria-disabled"] ? p.theme.colors.neutral300 : p.theme.colors.neutral600};
}
&:focus,
&:hover {
svg path {
fill: ${(p) => p["aria-disabled"] ? p.theme.colors.neutral300 : p.theme.colors.neutral700};
}
}
${(p) => p["aria-disabled"] ? `
pointer-events: none;
` : void 0}
`;
var DotsWrapper = dt(LinkWrapperDiv)`
color: ${({ theme }) => theme.colors.neutral800};
`;
var PreviousLink = ({ children, ...props }) => {
const { activePage } = usePagination();
const disabled = activePage === 1;
return (0, import_jsx_runtime4.jsx)("li", {
children: (0, import_jsx_runtime4.jsxs)(ActionLinkWrapper, {
"aria-disabled": disabled,
tabIndex: disabled ? -1 : void 0,
...props,
children: [
(0, import_jsx_runtime4.jsx)(VisuallyHidden, {
children
}),
(0, import_jsx_runtime4.jsx)(ForwardRef$4x, {
"aria-hidden": true
})
]
})
});
};
var NextLink = ({ children, ...props }) => {
const { activePage, pageCount } = usePagination();
const disabled = activePage === pageCount;
return (0, import_jsx_runtime4.jsx)("li", {
children: (0, import_jsx_runtime4.jsxs)(ActionLinkWrapper, {
"aria-disabled": disabled,
tabIndex: disabled ? -1 : void 0,
...props,
children: [
(0, import_jsx_runtime4.jsx)(VisuallyHidden, {
children
}),
(0, import_jsx_runtime4.jsx)(ForwardRef$4v, {
"aria-hidden": true
})
]
})
});
};
var PageLink = ({ number, children, ...props }) => {
const { activePage } = usePagination();
const isActive = activePage === number;
return (0, import_jsx_runtime4.jsx)("li", {
children: (0, import_jsx_runtime4.jsxs)(PageLinkWrapper, {
...props,
$active: isActive,
children: [
(0, import_jsx_runtime4.jsx)(VisuallyHidden, {
children
}),
(0, import_jsx_runtime4.jsx)(PaginationText, {
"aria-hidden": true,
variant: "pi",
fontWeight: isActive ? "bold" : "",
children: number
})
]
})
});
};
var Dots = ({ children, ...props }) => (0, import_jsx_runtime4.jsx)("li", {
children: (0, import_jsx_runtime4.jsxs)(DotsWrapper, {
...props,
as: "div",
children: [
(0, import_jsx_runtime4.jsx)(VisuallyHidden, {
children
}),
(0, import_jsx_runtime4.jsx)(PaginationText, {
"aria-hidden": true,
small: true,
children: "…"
})
]
})
});
var PaginationFooter = ({ activePage, onChangePage, pagination: { pageCount } }) => {
const { formatMessage } = useIntl();
const previousActivePage = activePage - 1;
const nextActivePage = activePage + 1;
const firstLinks = [
(0, import_jsx_runtime4.jsx)(PageLink, {
number: 1,
onClick: () => {
onChangePage(1);
},
children: formatMessage({
id: "components.pagination.go-to",
defaultMessage: "Go to page {page}"
}, {
page: 1
})
}, 1)
];
if (pageCount <= 4) {
const links = Array.from({
length: pageCount
}).map((_, i) => i + 1).map((number) => {
return (0, import_jsx_runtime4.jsx)(PageLink, {
number,
onClick: () => onChangePage(number),
children: formatMessage({
id: "components.pagination.go-to",
defaultMessage: "Go to page {page}"
}, {
page: number
})
}, number);
});
return (0, import_jsx_runtime4.jsxs)(Pagination, {
activePage,
pageCount,
children: [
(0, import_jsx_runtime4.jsx)(PreviousLink, {
onClick: () => onChangePage(previousActivePage),
children: formatMessage({
id: "components.pagination.go-to-previous",
defaultMessage: "Go to previous page"
})
}),
links,
(0, import_jsx_runtime4.jsx)(NextLink, {
onClick: () => onChangePage(nextActivePage),
children: formatMessage({
id: "components.pagination.go-to-next",
defaultMessage: "Go to next page"
})
})
]
});
}
let firstLinksToCreate = [];
const lastLinks = [];
let lastLinksToCreate = [];
const middleLinks = [];
if (pageCount > 1) {
lastLinks.push((0, import_jsx_runtime4.jsx)(PageLink, {
number: pageCount,
onClick: () => onChangePage(pageCount),
children: formatMessage({
id: "components.pagination.go-to",
defaultMessage: "Go to page {page}"
}, {
page: pageCount
})
}, pageCount));
}
if (activePage === 1 && pageCount >= 3) {
firstLinksToCreate = [
2
];
}
if (activePage === 2 && pageCount >= 3) {
if (pageCount === 5) {
firstLinksToCreate = [
2,
3,
4
];
} else if (pageCount === 3) {
firstLinksToCreate = [
2
];
} else {
firstLinksToCreate = [
2,
3
];
}
}
if (activePage === 4 && pageCount >= 3) {
firstLinksToCreate = [
2
];
}
if (activePage === pageCount && pageCount >= 3) {
lastLinksToCreate = [
pageCount - 1
];
}
if (activePage === pageCount - 2 && pageCount > 3) {
lastLinksToCreate = [
activePage + 1,
activePage,
activePage - 1
];
}
if (activePage === pageCount - 3 && pageCount > 3 && activePage > 5) {
lastLinksToCreate = [
activePage + 2,
activePage + 1,
activePage,
activePage - 1
];
}
if (activePage === pageCount - 1 && pageCount > 3) {
lastLinksToCreate = [
activePage,
activePage - 1
];
}
lastLinksToCreate.forEach((number) => {
lastLinks.unshift((0, import_jsx_runtime4.jsxs)(PageLink, {
number,
onClick: () => onChangePage(number),
children: [
"Go to page ",
number
]
}, number));
});
firstLinksToCreate.forEach((number) => {
firstLinks.push((0, import_jsx_runtime4.jsx)(PageLink, {
number,
onClick: () => onChangePage(number),
children: formatMessage({
id: "components.pagination.go-to",
defaultMessage: "Go to page {page}"
}, {
page: number
})
}, number));
});
if (![
1,
2
].includes(activePage) && activePage <= pageCount - 3 && firstLinks.length + lastLinks.length < 6) {
const middleLinksToCreate = [
activePage - 1,
activePage,
activePage + 1
];
middleLinksToCreate.forEach((number) => {
middleLinks.push((0, import_jsx_runtime4.jsx)(PageLink, {
number,
onClick: () => onChangePage(number),
children: formatMessage({
id: "components.pagination.go-to",
defaultMessage: "Go to page {page}"
}, {
page: number
})
}, number));
});
}
const shouldShowDotsAfterFirstLink = pageCount > 5 || pageCount === 5 && (activePage === 1 || activePage === 5);
const shouldShowMiddleDots = middleLinks.length > 2 && activePage > 4 && pageCount > 5;
const beforeDotsLinksLength = shouldShowMiddleDots ? pageCount - activePage - 1 : pageCount - firstLinks.length - lastLinks.length;
const afterDotsLength = shouldShowMiddleDots ? pageCount - firstLinks.length - lastLinks.length : pageCount - activePage - 1;
return (0, import_jsx_runtime4.jsxs)(Pagination, {
activePage,
pageCount,
children: [
(0, import_jsx_runtime4.jsx)(PreviousLink, {
onClick: () => onChangePage(previousActivePage),
children: formatMessage({
id: "components.pagination.go-to-previous",
defaultMessage: "Go to previous page"
})
}),
firstLinks,
shouldShowMiddleDots && (0, import_jsx_runtime4.jsx)(Dots, {
children: formatMessage({
id: "components.pagination.remaining-links",
defaultMessage: "And {number} other links"
}, {
number: beforeDotsLinksLength
})
}),
middleLinks,
shouldShowDotsAfterFirstLink && (0, import_jsx_runtime4.jsx)(Dots, {
children: formatMessage({
id: "components.pagination.remaining-links",
defaultMessage: "And {number} other links"
}, {
number: afterDotsLength
})
}),
lastLinks,
(0, import_jsx_runtime4.jsx)(NextLink, {
onClick: () => onChangePage(nextActivePage),
children: formatMessage({
id: "components.pagination.go-to-next",
defaultMessage: "Go to next page"
})
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs
var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
var React4 = __toESM(require_react(), 1);
var import_qs3 = __toESM(require_lib(), 1);
var SearchAsset = ({ onChangeSearch, queryValue = null }) => {
const { formatMessage } = useIntl();
const { trackUsage } = useTracking();
const [isOpen, setIsOpen] = React4.useState(!!queryValue);
const [value, setValue] = React4.useState(queryValue || "");
const wrapperRef = React4.useRef(null);
React4.useLayoutEffect(() => {
if (isOpen) {
setTimeout(() => {
var _a, _b;
(_b = (_a = wrapperRef.current) == null ? void 0 : _a.querySelector("input")) == null ? void 0 : _b.focus();
}, 0);
}
}, [
isOpen
]);
const handleToggle = () => {
setIsOpen((prev) => !prev);
};
const handleClear = () => {
handleToggle();
onChangeSearch(null);
};
const handleSubmit = (e) => {
e.preventDefault();
e.stopPropagation();
trackUsage("didSearchMediaLibraryElements", {
location: "content-manager"
});
onChangeSearch(value);
};
if (isOpen) {
return (0, import_jsx_runtime5.jsx)("div", {
ref: wrapperRef,
children: (0, import_jsx_runtime5.jsx)(SearchForm, {
onSubmit: handleSubmit,
children: (0, import_jsx_runtime5.jsx)(Searchbar, {
name: "search",
onClear: handleClear,
onChange: (e) => setValue(e.target.value),
clearLabel: formatMessage({
id: getTrad("search.clear.label"),
defaultMessage: "Clear the search"
}),
"aria-label": "search",
size: "S",
value,
placeholder: formatMessage({
id: getTrad("search.placeholder"),
defaultMessage: "e.g: the first dog on the moon"
}),
children: formatMessage({
id: getTrad("search.label"),
defaultMessage: "Search for an asset"
})
})
})
});
}
return (0, import_jsx_runtime5.jsx)(IconButton, {
label: "Search",
onClick: handleToggle,
children: (0, import_jsx_runtime5.jsx)(ForwardRef$X, {})
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs
var isSelectable = (allowedTypes, mime = "") => {
if (!mime) return false;
const fileType = mime.split("/")[0];
return allowedTypes.includes(fileType) || allowedTypes.includes("file") && ![
"video",
"image",
"audio"
].includes(fileType);
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs
var TypographyMaxWidth = dt(Typography)`
max-width: 100%;
`;
var ActionContainer = dt(Box)`
svg {
path {
fill: ${({ theme }) => theme.colors.neutral500};
}
}
`;
var BrowseStep = ({ allowedTypes = [], assets: rawAssets, canCreate, canRead, folders = [], multiple = false, onAddAsset, onChangeFilters, onChangePage, onChangePageSize, onChangeSearch, onChangeSort, onChangeFolder, onEditAsset, onEditFolder, onSelectAllAsset, onSelectAsset, pagination, queryObject, selectedAssets }) => {
var _a, _b, _c;
const { formatMessage } = useIntl();
const [view, setView] = usePersistentState(localStorageKeys.modalView, viewOptions.GRID);
const isGridView = view === viewOptions.GRID;
const { data: currentFolder, isLoading: isCurrentFolderLoading } = useFolder(queryObject == null ? void 0 : queryObject.folder, {
enabled: canRead && !!(queryObject == null ? void 0 : queryObject.folder)
});
const singularTypes = toSingularTypes(allowedTypes);
const assets = rawAssets.map((asset) => ({
...asset,
isSelectable: isSelectable(singularTypes, asset == null ? void 0 : asset.mime),
type: "asset"
}));
const breadcrumbs = !isCurrentFolderLoading ? getBreadcrumbDataCM(currentFolder) : void 0;
const allAllowedAsset = getAllowedFiles(allowedTypes, assets);
const areAllAssetSelected = allAllowedAsset.length > 0 && selectedAssets.length > 0 && allAllowedAsset.every((asset) => selectedAssets.findIndex((currAsset) => currAsset.id === asset.id) !== -1);
const hasSomeAssetSelected = allAllowedAsset.some((asset) => selectedAssets.findIndex((currAsset) => currAsset.id === asset.id) !== -1);
const isSearching = !!(queryObject == null ? void 0 : queryObject._q);
const isFiltering = !!((_b = (_a = queryObject == null ? void 0 : queryObject.filters) == null ? void 0 : _a.$and) == null ? void 0 : _b.length) && queryObject.filters.$and.length > 0;
const isSearchingOrFiltering = isSearching || isFiltering;
const assetCount = assets.length;
const folderCount = folders.length;
const handleClickFolderCard = (...args) => {
onChangeSearch("");
onChangeFolder(...args);
};
return (0, import_jsx_runtime6.jsxs)(Box, {
children: [
onSelectAllAsset && (0, import_jsx_runtime6.jsx)(Box, {
paddingBottom: 4,
children: (0, import_jsx_runtime6.jsxs)(Flex, {
justifyContent: "space-between",
alignItems: "flex-start",
children: [
(assetCount > 0 || folderCount > 0 || isFiltering) && (0, import_jsx_runtime6.jsxs)(Flex, {
gap: 2,
wrap: "wrap",
children: [
multiple && isGridView && (0, import_jsx_runtime6.jsx)(Flex, {
paddingLeft: 2,
paddingRight: 2,
background: "neutral0",
hasRadius: true,
borderColor: "neutral200",
height: "3.2rem",
children: (0, import_jsx_runtime6.jsx)(CheckboxImpl, {
"aria-label": formatMessage({
id: getTrad("bulk.select.label"),
defaultMessage: "Select all assets"
}),
checked: !areAllAssetSelected && hasSomeAssetSelected ? "indeterminate" : areAllAssetSelected,
onCheckedChange: onSelectAllAsset
})
}),
isGridView && (0, import_jsx_runtime6.jsx)(SortPicker, {
onChangeSort,
value: queryObject == null ? void 0 : queryObject.sort
}),
(0, import_jsx_runtime6.jsx)(Filters, {
appliedFilters: (_c = queryObject == null ? void 0 : queryObject.filters) == null ? void 0 : _c.$and,
onChangeFilters
})
]
}),
(assetCount > 0 || folderCount > 0 || isSearching) && (0, import_jsx_runtime6.jsxs)(Flex, {
marginLeft: "auto",
shrink: 0,
gap: 2,
children: [
(0, import_jsx_runtime6.jsx)(ActionContainer, {
paddingTop: 1,
paddingBottom: 1,
children: (0, import_jsx_runtime6.jsx)(IconButton, {
label: isGridView ? formatMessage({
id: "view-switch.list",
defaultMessage: "List View"
}) : formatMessage({
id: "view-switch.grid",
defaultMessage: "Grid View"
}),
onClick: () => setView(isGridView ? viewOptions.LIST : viewOptions.GRID),
children: isGridView ? (0, import_jsx_runtime6.jsx)(ForwardRef$2p, {}) : (0, import_jsx_runtime6.jsx)(ForwardRef$39, {})
})
}),
(0, import_jsx_runtime6.jsx)(SearchAsset, {
onChangeSearch,
queryValue: queryObject._q || ""
})
]
})
]
})
}),
canRead && (breadcrumbs == null ? void 0 : breadcrumbs.length) && breadcrumbs.length > 0 && currentFolder && (0, import_jsx_runtime6.jsx)(Box, {
paddingTop: 3,
children: (0, import_jsx_runtime6.jsx)(Breadcrumbs, {
onChangeFolder,
label: formatMessage({
id: getTrad("header.breadcrumbs.nav.label"),
defaultMessage: "Folders navigation"
}),
breadcrumbs,
currentFolderId: queryObject == null ? void 0 : queryObject.folder
})
}),
assetCount === 0 && folderCount === 0 && (0, import_jsx_runtime6.jsx)(Box, {
paddingBottom: 6,
children: (0, import_jsx_runtime6.jsx)(EmptyAssets, {
size: "S",
count: 6,
action: canCreate && !isFiltering && !isSearching && (0, import_jsx_runtime6.jsx)(Button, {
variant: "secondary",
startIcon: (0, import_jsx_runtime6.jsx)(ForwardRef$1h, {}),
onClick: onAddAsset,
children: formatMessage({
id: getTrad("header.actions.add-assets"),
defaultMessage: "Add new assets"
})
}),
content: (
// eslint-disable-next-line no-nested-ternary
isSearchingOrFiltering ? formatMessage({
id: getTrad("list.assets-empty.title-withSearch"),
defaultMessage: "There are no assets with the applied filters"
}) : canCreate && !isSearching ? formatMessage({
id: getTrad("list.assets.empty"),
defaultMessage: "Upload your first assets..."
}) : formatMessage({
id: getTrad("list.assets.empty.no-permissions"),
defaultMessage: "The asset list is empty"
})
)
})
}),
!isGridView && (folderCount > 0 || assetCount > 0) && (0, import_jsx_runtime6.jsx)(TableList, {
allowedTypes,
assetCount,
folderCount,
indeterminate: !areAllAssetSelected && hasSomeAssetSelected,
isFolderSelectionAllowed: false,
onChangeSort,
onChangeFolder: handleClickFolderCard,
onEditAsset,
onEditFolder,
onSelectOne: onSelectAsset,
onSelectAll: onSelectAllAsset,
rows: [
...folders.map((folder) => ({
...folder,
type: "folder"
})),
...assets
],
selected: selectedAssets,
shouldDisableBulkSelect: !multiple,
sortQuery: (queryObject == null ? void 0 : queryObject.sort) ?? ""
}),
isGridView && (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, {
children: [
folderCount > 0 && (0, import_jsx_runtime6.jsx)(FolderGridList, {
title: (isSearchingOrFiltering && assetCount > 0 || !isSearchingOrFiltering) && formatMessage({
id: getTrad("list.folders.title"),
defaultMessage: "Folders ({count})"
}, {
count: folderCount
}) || "",
children: folders.map((folder) => {
var _a2, _b2;
return (0, import_jsx_runtime6.jsx)(Grid.Item, {
col: 3,
direction: "column",
alignItems: "stretch",
children: (0, import_jsx_runtime6.jsx)(FolderCard, {
ariaLabel: folder.name,
id: `folder-${folder.id}`,
onClick: () => handleClickFolderCard(folder.id, folder.path),
cardActions: onEditFolder && (0, import_jsx_runtime6.jsx)(IconButton, {
withTooltip: false,
label: formatMessage({
id: getTrad("list.folder.edit"),
defaultMessage: "Edit folder"
}),
onClick: () => onEditFolder(folder),
children: (0, import_jsx_runtime6.jsx)(ForwardRef$1v, {})
}),
children: (0, import_jsx_runtime6.jsx)(FolderCardBody, {
children: (0, import_jsx_runtime6.jsx)(FolderCardBodyAction, {
onClick: () => handleClickFolderCard(folder.id, folder.path),
children: (0, import_jsx_runtime6.jsxs)(Flex, {
tag: "h2",
direction: "column",
alignItems: "start",
maxWidth: "100%",
children: [
(0, import_jsx_runtime6.jsxs)(TypographyMaxWidth, {
fontWeight: "semiBold",
ellipsis: true,
textColor: "neutral800",
children: [
folder.name,
(0, import_jsx_runtime6.jsx)(VisuallyHidden, {
children: "-"
})
]
}),
(0, import_jsx_runtime6.jsx)(TypographyMaxWidth, {
tag: "span",
textColor: "neutral600",
variant: "pi",
ellipsis: true,
children: formatMessage({
id: getTrad("list.folder.subtitle"),
defaultMessage: "{folderCount, plural, =0 {# folder} one {# folder} other {# folders}}, {filesCount, plural, =0 {# asset} one {# asset} other {# assets}}"
}, {
folderCount: (_a2 = folder.children) == null ? void 0 : _a2.count,
filesCount: (_b2 = folder.files) == null ? void 0 : _b2.count
})
})
]
})
})
})
})
}, `folder-${folder.id}`);
})
}),
assetCount > 0 && folderCount > 0 && (0, import_jsx_runtime6.jsx)(Box, {
paddingTop: 6,
children: (0, import_jsx_runtime6.jsx)(Divider, {})
}),
assetCount > 0 && (0, import_jsx_runtime6.jsx)(Box, {
paddingTop: 6,
children: (0, import_jsx_runtime6.jsx)(AssetGridList, {
allowedTypes,
size: "S",
assets,
onSelectAsset,
selectedAssets,
onEditAsset,
title: (!isSearchingOrFiltering || isSearchingOrFiltering && folderCount > 0) && queryObject.page === 1 && formatMessage({
id: getTrad("list.assets.title"),
defaultMessage: "Assets ({count})"
}, {
count: assetCount
}) || ""
})
})
]
}),
pagination.pageCount > 0 && (0, import_jsx_runtime6.jsxs)(Flex, {
justifyContent: "space-between",
paddingTop: 4,
children: [
(0, import_jsx_runtime6.jsx)(PageSize, {
pageSize: queryObject.pageSize,
onChangePageSize
}),
(0, import_jsx_runtime6.jsx)(PaginationFooter, {
activePage: queryObject.page,
onChangePage,
pagination
})
]
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/DialogFooter.mjs
var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
var DialogFooter = ({ onClose, onValidate }) => {
const { formatMessage } = useIntl();
return (0, import_jsx_runtime7.jsxs)(Modal.Footer, {
children: [
(0, import_jsx_runtime7.jsx)(Button, {
onClick: onClose,
variant: "tertiary",
children: formatMessage({
id: "app.components.Button.cancel",
defaultMessage: "Cancel"
})
}),
onValidate && (0, import_jsx_runtime7.jsx)(Button, {
onClick: onValidate,
children: formatMessage({
id: "global.finish",
defaultMessage: "Finish"
})
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs
var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
var import_qs5 = __toESM(require_lib(), 1);
var SelectedStep = ({ selectedAssets, onSelectAsset, onReorderAsset }) => {
const { formatMessage } = useIntl();
return (0, import_jsx_runtime8.jsxs)(Flex, {
direction: "column",
alignItems: "stretch",
gap: 4,
children: [
(0, import_jsx_runtime8.jsxs)(Flex, {
gap: 0,
direction: "column",
alignItems: "start",
children: [
(0, import_jsx_runtime8.jsx)(Typography, {
variant: "pi",
fontWeight: "bold",
textColor: "neutral800",
children: formatMessage({
id: getTrad("list.assets.to-upload"),
defaultMessage: "{number, plural, =0 {No asset} one {1 asset} other {# assets}} ready to upload"
}, {
number: selectedAssets.length
})
}),
(0, import_jsx_runtime8.jsx)(Typography, {
variant: "pi",
textColor: "neutral600",
children: formatMessage({
id: getTrad("modal.upload-list.sub-header-subtitle"),
defaultMessage: "Manage the assets before adding them to the Media Library"
})
})
]
}),
(0, import_jsx_runtime8.jsx)(AssetGridList, {
size: "S",
assets: selectedAssets,
onSelectAsset,
selectedAssets,
onReorderAsset
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/AssetDialog/AssetDialog.mjs
var LoadingBody = dt(Flex)`
/* 80px are coming from the Tabs component that is not included in the ModalBody */
min-height: ${() => `calc(60vh + 8rem)`};
`;
var AssetContent = ({ allowedTypes = [], folderId = null, onClose, onAddAsset, onAddFolder, onChangeFolder, onValidate, multiple = false, initiallySelectedAssets = [], trackedLocation }) => {
const [assetToEdit, setAssetToEdit] = React5.useState(void 0);
const [folderToEdit, setFolderToEdit] = React5.useState(void 0);
const { formatMessage } = useIntl();
const { canRead, canCreate, isLoading: isLoadingPermissions, canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();
const [{ queryObject }, { onChangeFilters, onChangePage, onChangePageSize, onChangeSort, onChangeSearch, onChangeFolder: onChangeFolderParam }] = useModalQueryParams({
folder: folderId
});
const { data: { pagination, results: assets } = {}, isLoading: isLoadingAssets, error: errorAssets } = useAssets({
skipWhen: !canRead,
query: queryObject
});
const { data: folders, isLoading: isLoadingFolders, error: errorFolders } = useFolders({
enabled: canRead && !containsAssetFilter(queryObject) && (pagination == null ? void 0 : pagination.page) === 1,
query: queryObject
});
const [selectedAssets, { selectOne, selectOnly, setSelections, selectMultiple, deselectMultiple }] = useSelectionState([
"id"
], initiallySelectedAssets);
const handleSelectAllAssets = () => {
const allowedAssets = getAllowedFiles(allowedTypes, assets);
if (!multiple) {
return void 0;
}
const alreadySelected = allowedAssets.filter((asset) => selectedAssets.findIndex((selectedAsset) => selectedAsset.id === asset.id) !== -1);
if (alreadySelected.length > 0) {
deselectMultiple(alreadySelected);
} else {
selectMultiple(allowedAssets);
}
};
const handleSelectAsset = (asset) => {
return multiple ? selectOne(asset) : selectOnly(asset);
};
const isLoading = isLoadingPermissions || isLoadingAssets || isLoadingFolders;
const hasError = errorAssets || errorFolders;
if (isLoading) {
return (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, {
children: [
(0, import_jsx_runtime9.jsx)(Modal.Header, {
children: (0, import_jsx_runtime9.jsx)(Modal.Title, {
children: formatMessage({
id: getTrad("header.actions.add-assets"),
defaultMessage: "Add new assets"
})
})
}),
(0, import_jsx_runtime9.jsx)(LoadingBody, {
justifyContent: "center",
paddingTop: 4,
paddingBottom: 4,
children: (0, import_jsx_runtime9.jsx)(Loader, {
children: formatMessage({
id: getTrad("content.isLoading"),
defaultMessage: "Content is loading."
})
})
}),
(0, import_jsx_runtime9.jsx)(DialogFooter, {
onClose
})
]
});
}
if (hasError) {
return (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, {
children: [
(0, import_jsx_runtime9.jsx)(Modal.Header, {
children: (0, import_jsx_runtime9.jsx)(Modal.Title, {
children: formatMessage({
id: getTrad("header.actions.add-assets"),
defaultMessage: "Add new assets"
})
})
}),
(0, import_jsx_runtime9.jsx)(Page.Error, {}),
(0, import_jsx_runtime9.jsx)(DialogFooter, {
onClose
})
]
});
}
if (!canRead) {
return (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, {
children: [
(0, import_jsx_runtime9.jsx)(Modal.Header, {
children: (0, import_jsx_runtime9.jsx)(Modal.Title, {
children: formatMessage({
id: getTrad("header.actions.add-assets"),
defaultMessage: "Add new assets"
})
})
}),
(0, import_jsx_runtime9.jsx)(Page.NoPermissions, {}),
(0, import_jsx_runtime9.jsx)(DialogFooter, {
onClose
})
]
});
}
if (assetToEdit) {
return (0, import_jsx_runtime9.jsx)(EditAssetContent, {
onClose: () => setAssetToEdit(void 0),
asset: assetToEdit,
canUpdate,
canCopyLink,
canDownload,
trackedLocation
});
}
if (folderToEdit) {
return (0, import_jsx_runtime9.jsx)(EditFolderContent, {
folder: folderToEdit,
onClose: () => setFolderToEdit(void 0),
location: "content-manager",
parentFolderId: queryObject == null ? void 0 : queryObject.folder
});
}
const handleMoveItem = (hoverIndex, destIndex) => {
const offset = destIndex - hoverIndex;
const orderedAssetsClone = selectedAssets.slice();
const nextAssets = moveElement(orderedAssetsClone, hoverIndex, offset);
setSelections(nextAssets);
};
const handleFolderChange = (folderId2, folderPath) => {
onChangeFolder(folderId2);
if (onChangeFolderParam) {
onChangeFolderParam(folderId2, folderPath);
}
};
return (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, {
children: [
(0, import_jsx_runtime9.jsx)(Modal.Header, {
children: (0, import_jsx_runtime9.jsx)(Modal.Title, {
children: formatMessage({
id: getTrad("header.actions.add-assets"),
defaultMessage: "Add new assets"
})
})
}),
(0, import_jsx_runtime9.jsxs)(TabsRoot, {
variant: "simple",
defaultValue: selectedAssets.length > 0 ? "selected" : "browse",
children: [
(0, import_jsx_runtime9.jsxs)(Flex, {
paddingLeft: 8,
paddingRight: 8,
paddingTop: 6,
justifyContent: "space-between",
children: [
(0, import_jsx_runtime9.jsxs)(Tabs.List, {
children: [
(0, import_jsx_runtime9.jsx)(Tabs.Trigger, {
value: "browse",
children: formatMessage({
id: getTrad("modal.nav.browse"),
defaultMessage: "Browse"
})
}),
(0, import_jsx_runtime9.jsxs)(Tabs.Trigger, {
value: "selected",
children: [
formatMessage({
id: getTrad("modal.header.select-files"),
defaultMessage: "Selected files"
}),
(0, import_jsx_runtime9.jsx)(Badge, {
marginLeft: 2,
children: selectedAssets.length
})
]
})
]
}),
(0, import_jsx_runtime9.jsxs)(Flex, {
gap: 2,
children: [
(0, import_jsx_runtime9.jsx)(Button, {
variant: "secondary",
onClick: () => onAddFolder({
folderId: queryObject == null ? void 0 : queryObject.folder
}),
children: formatMessage({
id: getTrad("modal.upload-list.sub-header.add-folder"),
defaultMessage: "Add folder"
})
}),
(0, import_jsx_runtime9.jsx)(Button, {
onClick: () => onAddAsset({
folderId: queryObject == null ? void 0 : queryObject.folder
}),
children: formatMessage({
id: getTrad("modal.upload-list.sub-header.button"),
defaultMessage: "Add more assets"
})
})
]
})
]
}),
(0, import_jsx_runtime9.jsx)(Divider, {}),
(0, import_jsx_runtime9.jsxs)(Modal.Body, {
children: [
(0, import_jsx_runtime9.jsx)(Tabs.Content, {
value: "browse",
children: (0, import_jsx_runtime9.jsx)(BrowseStep, {
allowedTypes,
assets,
canCreate,
canRead,
folders,
onSelectAsset: handleSelectAsset,
selectedAssets,
multiple,
onSelectAllAsset: handleSelectAllAssets,
onEditAsset: setAssetToEdit,
onEditFolder: setFolderToEdit,
pagination,
queryObject,
onAddAsset,
onChangeFilters: (filters) => onChangeFilters(filters),
onChangeFolder: handleFolderChange,
onChangePage,
onChangePageSize,
onChangeSort: (sort) => onChangeSort(sort),
onChangeSearch
})
}),
(0, import_jsx_runtime9.jsx)(Tabs.Content, {
value: "selected",
children: (0, import_jsx_runtime9.jsx)(SelectedStep, {
selectedAssets,
onSelectAsset: handleSelectAsset,
onReorderAsset: handleMoveItem
})
})
]
})
]
}),
(0, import_jsx_runtime9.jsx)(DialogFooter, {
onClose,
onValidate: () => onValidate(selectedAssets)
})
]
});
};
var AssetDialog = ({ open = false, onClose, ...restProps }) => {
return (0, import_jsx_runtime9.jsx)(Modal.Root, {
open,
onOpenChange: onClose,
children: (0, import_jsx_runtime9.jsx)(Modal.Content, {
children: (0, import_jsx_runtime9.jsx)(AssetContent, {
onClose,
...restProps
})
})
});
};
var TabsRoot = dt(Tabs.Root)`
display: flex;
flex-direction: column;
overflow: hidden;
`;
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs
var STEPS = {
AssetSelect: "SelectAsset",
AssetUpload: "UploadAsset",
FolderCreate: "FolderCreate"
};
var MediaLibraryDialog = ({ onClose, onSelectAssets, allowedTypes = [
"files",
"images",
"videos",
"audios"
] }) => {
const [step, setStep] = React6.useState(STEPS.AssetSelect);
const [folderId, setFolderId] = React6.useState(null);
switch (step) {
case STEPS.AssetSelect:
return (0, import_jsx_runtime10.jsx)(AssetDialog, {
allowedTypes,
folderId,
open: true,
onClose,
onValidate: onSelectAssets,
onAddAsset: () => setStep(STEPS.AssetUpload),
onAddFolder: () => setStep(STEPS.FolderCreate),
onChangeFolder: (folderId2) => setFolderId(folderId2),
multiple: true
});
case STEPS.FolderCreate:
return (0, import_jsx_runtime10.jsx)(EditFolderDialog, {
open: true,
onClose: () => setStep(STEPS.AssetSelect),
parentFolderId: folderId
});
default:
return (0, import_jsx_runtime10.jsx)(UploadAssetDialog, {
open: true,
onClose: () => setStep(STEPS.AssetSelect),
folderId
});
}
};
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs
var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
var React9 = __toESM(require_react(), 1);
var import_qs10 = __toESM(require_lib(), 1);
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs
var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
var React8 = __toESM(require_react(), 1);
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs
var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
var import_qs7 = __toESM(require_lib(), 1);
var DocAsset = dt(Flex)`
background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);
`;
var VideoPreviewWrapper = dt(Box)`
canvas,
video {
max-width: 100%;
height: 124px;
}
`;
var AudioPreviewWrapper = dt(Box)`
canvas,
audio {
max-width: 100%;
}
`;
var CarouselAsset = ({ asset }) => {
var _a, _b, _c, _d;
if ((_a = asset.mime) == null ? void 0 : _a.includes(AssetType.Video)) {
return (0, import_jsx_runtime11.jsx)(VideoPreviewWrapper, {
height: "100%",
children: (0, import_jsx_runtime11.jsx)(VideoPreview, {
url: createAssetUrl(asset, true),
mime: asset.mime,
alt: asset.alternativeText || asset.name
})
});
}
if ((_b = asset.mime) == null ? void 0 : _b.includes(AssetType.Audio)) {
return (0, import_jsx_runtime11.jsx)(AudioPreviewWrapper, {
children: (0, import_jsx_runtime11.jsx)(AudioPreview, {
url: createAssetUrl(asset, true),
alt: asset.alternativeText || asset.name
})
});
}
if ((_c = asset.mime) == null ? void 0 : _c.includes(AssetType.Image)) {
return (0, import_jsx_runtime11.jsx)(Box, {
tag: "img",
maxHeight: "100%",
maxWidth: "100%",
src: createAssetUrl(asset, true),
alt: asset.alternativeText || asset.name
});
}
return (0, import_jsx_runtime11.jsx)(DocAsset, {
width: "100%",
height: "100%",
justifyContent: "center",
hasRadius: true,
children: ((_d = asset.ext) == null ? void 0 : _d.includes("pdf")) ? (0, import_jsx_runtime11.jsx)(ForwardRef$3p, {
"aria-label": asset.alternativeText || asset.name,
width: "24px",
height: "32px"
}) : (0, import_jsx_runtime11.jsx)(ForwardRef$3v, {
"aria-label": asset.alternativeText || asset.name,
width: "24px",
height: "32px"
})
});
};
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs
var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
var import_qs8 = __toESM(require_lib(), 1);
var CarouselAssetActions = ({ asset, onDeleteAsset, onAddAsset, onEditAsset }) => {
const { formatMessage } = useIntl();
return (0, import_jsx_runtime12.jsxs)(CarouselActions, {
children: [
onAddAsset && (0, import_jsx_runtime12.jsx)(IconButton, {
label: formatMessage({
id: getTrad("control-card.add"),
defaultMessage: "Add"
}),
onClick: () => onAddAsset(asset),
children: (0, import_jsx_runtime12.jsx)(ForwardRef$1h, {})
}),
(0, import_jsx_runtime12.jsx)(CopyLinkButton, {
url: prefixFileUrlWithBackendUrl(asset.url)
}),
onDeleteAsset && (0, import_jsx_runtime12.jsx)(IconButton, {
label: formatMessage({
id: "global.delete",
defaultMessage: "Delete"
}),
onClick: () => onDeleteAsset(asset),
children: (0, import_jsx_runtime12.jsx)(ForwardRef$j, {})
}),
onEditAsset && (0, import_jsx_runtime12.jsx)(IconButton, {
label: formatMessage({
id: getTrad("control-card.edit"),
defaultMessage: "edit"
}),
onClick: onEditAsset,
children: (0, import_jsx_runtime12.jsx)(ForwardRef$1v, {})
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs
var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
var React7 = __toESM(require_react(), 1);
var import_qs9 = __toESM(require_lib(), 1);
var TextAlignTypography = dt(Typography)`
align-items: center;
`;
var EmptyStateAsset = ({ disabled = false, onClick, onDropAsset }) => {
const { formatMessage } = useIntl();
const [dragOver, setDragOver] = React7.useState(false);
const handleDragEnter = (e) => {
e.preventDefault();
setDragOver(true);
};
const handleDragLeave = (e) => {
if (!e.currentTarget.contains(e.relatedTarget)) {
setDragOver(false);
}
};
const handleDragOver = (e) => {
e.preventDefault();
};
const handleDrop = (e) => {
var _a;
e.preventDefault();
if ((_a = e == null ? void 0 : e.dataTransfer) == null ? void 0 : _a.files) {
const files = e.dataTransfer.files;
const assets = [];
for (let i = 0; i < files.length; i++) {
const file = files.item(i);
if (file) {
const asset = rawFileToAsset(file, AssetSource.Computer);
assets.push(asset);
}
}
onDropAsset(assets);
}
setDragOver(false);
};
return (0, import_jsx_runtime13.jsxs)(Flex, {
borderStyle: dragOver ? "dashed" : void 0,
borderWidth: dragOver ? "1px" : void 0,
borderColor: dragOver ? "primary600" : void 0,
direction: "column",
justifyContent: "center",
alignItems: "center",
height: "100%",
width: "100%",
tag: "button",
type: "button",
disabled,
onClick,
onDragEnter: handleDragEnter,
onDragLeave: handleDragLeave,
onDragOver: handleDragOver,
onDrop: handleDrop,
gap: 3,
style: {
cursor: disabled ? "not-allowed" : "pointer"
},
children: [
(0, import_jsx_runtime13.jsx)(ForwardRef$1f, {
"aria-hidden": true,
width: "3.2rem",
height: "3.2rem",
fill: disabled ? "neutral400" : "primary600"
}),
(0, import_jsx_runtime13.jsx)(TextAlignTypography, {
variant: "pi",
fontWeight: "bold",
textColor: "neutral600",
style: {
textAlign: "center"
},
tag: "span",
children: formatMessage({
id: getTrad("mediaLibraryInput.placeholder"),
defaultMessage: "Click to add an asset or drag and drop one in this area"
})
})
]
});
};
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs
var CarouselAssets = React8.forwardRef(({ assets, disabled = false, error, hint, label, labelAction, onAddAsset, onDeleteAsset, onDeleteAssetFromMediaLibrary, onDropAsset, onEditAsset, onNext, onPrevious, required = false, selectedAssetIndex, trackedLocation }, forwardedRef) => {
const { formatMessage } = useIntl();
const [isEditingAsset, setIsEditingAsset] = React8.useState(false);
const currentAsset = assets[selectedAssetIndex];
return (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, {
children: [
(0, import_jsx_runtime14.jsx)(CarouselInput, {
ref: forwardedRef,
label,
labelAction,
secondaryLabel: currentAsset == null ? void 0 : currentAsset.name,
selectedSlide: selectedAssetIndex,
previousLabel: formatMessage({
id: getTrad("mediaLibraryInput.actions.previousSlide"),
defaultMessage: "Previous slide"
}),
nextLabel: formatMessage({
id: getTrad("mediaLibraryInput.actions.nextSlide"),
defaultMessage: "Next slide"
}),
onNext,
onPrevious,
hint,
error,
required,
actions: currentAsset ? (0, import_jsx_runtime14.jsx)(CarouselAssetActions, {
asset: currentAsset,
onDeleteAsset: disabled ? void 0 : onDeleteAsset,
onAddAsset: disabled ? void 0 : onAddAsset,
onEditAsset: onEditAsset ? () => setIsEditingAsset(true) : void 0
}) : void 0,
children: assets.length === 0 ? (0, import_jsx_runtime14.jsx)(CarouselSlide, {
label: formatMessage({
id: getTrad("mediaLibraryInput.slideCount"),
defaultMessage: "{n} of {m} slides"
}, {
n: 1,
m: 1
}),
children: (0, import_jsx_runtime14.jsx)(EmptyStateAsset, {
disabled,
onClick: onAddAsset,
onDropAsset
})
}) : assets.map((asset, index4) => (0, import_jsx_runtime14.jsx)(CarouselSlide, {
label: formatMessage({
id: getTrad("mediaLibraryInput.slideCount"),
defaultMessage: "{n} of {m} slides"
}, {
n: index4 + 1,
m: assets.length
}),
children: (0, import_jsx_runtime14.jsx)(CarouselAsset, {
asset
})
}, asset.id))
}),
(0, import_jsx_runtime14.jsx)(EditAssetDialog, {
open: isEditingAsset,
onClose: (editedAsset) => {
setIsEditingAsset(false);
if (editedAsset === null) {
onDeleteAssetFromMediaLibrary();
}
if (editedAsset && typeof editedAsset !== "boolean") {
onEditAsset == null ? void 0 : onEditAsset(editedAsset);
}
},
asset: currentAsset,
canUpdate: true,
canCopyLink: true,
canDownload: true,
trackedLocation
})
]
});
});
// node_modules/@strapi/upload/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs
var STEPS2 = {
AssetSelect: "SelectAsset",
AssetUpload: "UploadAsset",
FolderCreate: "FolderCreate"
};
var MediaLibraryInput = React9.forwardRef(({ attribute: { allowedTypes = [
"videos",
"files",
"images",
"audios"
], multiple = false } = {}, label, hint, disabled = false, labelAction = void 0, name: name2, required = false }, forwardedRef) => {
const { formatMessage } = useIntl();
const { onChange, value, error } = useField(name2);
const fieldAllowedTypes = allowedTypes || [
"files",
"images",
"videos",
"audios"
];
const [uploadedFiles, setUploadedFiles] = React9.useState([]);
const [step, setStep] = React9.useState(void 0);
const [selectedIndex, setSelectedIndex] = React9.useState(0);
const [droppedAssets, setDroppedAssets] = React9.useState();
const [folderId, setFolderId] = React9.useState(null);
const { toggleNotification } = useNotification();
React9.useEffect(() => {
if (step === void 0) {
setUploadedFiles([]);
}
}, [
step
]);
let selectedAssets = [];
if (Array.isArray(value)) {
selectedAssets = value;
} else if (value) {
selectedAssets = [
value
];
}
const handleValidation = (nextSelectedAssets) => {
const value2 = multiple ? nextSelectedAssets : nextSelectedAssets[0];
onChange(name2, value2);
setStep(void 0);
};
const handleDeleteAssetFromMediaLibrary = () => {
let nextValue;
if (multiple) {
const nextSelectedAssets = selectedAssets.filter((_, assetIndex) => assetIndex !== selectedIndex);
nextValue = nextSelectedAssets.length > 0 ? nextSelectedAssets : null;
} else {
nextValue = null;
}
const value2 = nextValue;
onChange(name2, value2);
setSelectedIndex(0);
};
const handleDeleteAsset = (asset) => {
let nextValue;
if (multiple) {
const nextSelectedAssets = selectedAssets.filter((prevAsset) => prevAsset.id !== asset.id);
nextValue = nextSelectedAssets.length > 0 ? nextSelectedAssets : null;
} else {
nextValue = null;
}
onChange(name2, nextValue);
setSelectedIndex(0);
};
const handleAssetEdit = (asset) => {
const nextSelectedAssets = selectedAssets.map((prevAsset) => prevAsset.id === asset.id ? asset : prevAsset);
onChange(name2, multiple ? nextSelectedAssets : nextSelectedAssets[0]);
};
const validateAssetsTypes = (assets, callback) => {
const allowedAssets = getAllowedFiles(fieldAllowedTypes, assets);
if (allowedAssets.length > 0) {
callback(allowedAssets);
} else {
toggleNotification({
type: "danger",
timeout: 4e3,
message: formatMessage({
id: getTrad("input.notification.not-supported"),
defaultMessage: `You can't upload this type of file.`
}, {
fileTypes: fieldAllowedTypes.join(",")
})
});
}
};
const handleAssetDrop = (assets) => {
validateAssetsTypes(assets, (allowedAssets) => {
setDroppedAssets(allowedAssets);
setStep(STEPS2.AssetUpload);
});
};
if (multiple && selectedAssets.length > 0) {
label = `${label} (${selectedIndex + 1} / ${selectedAssets.length})`;
}
const handleNext = () => {
setSelectedIndex((current) => current < selectedAssets.length - 1 ? current + 1 : 0);
};
const handlePrevious = () => {
setSelectedIndex((current) => current > 0 ? current - 1 : selectedAssets.length - 1);
};
const handleFilesUploadSucceeded = (uploadedFiles2) => {
setUploadedFiles((prev) => [
...prev,
...uploadedFiles2
]);
};
let initiallySelectedAssets = selectedAssets;
if (uploadedFiles.length > 0) {
const allowedUploadedFiles = getAllowedFiles(fieldAllowedTypes, uploadedFiles);
initiallySelectedAssets = multiple ? [
...allowedUploadedFiles,
...selectedAssets
] : [
allowedUploadedFiles[0]
];
}
return (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, {
children: [
(0, import_jsx_runtime15.jsx)(CarouselAssets, {
ref: forwardedRef,
assets: selectedAssets,
disabled,
label,
labelAction,
onDeleteAsset: handleDeleteAsset,
onDeleteAssetFromMediaLibrary: handleDeleteAssetFromMediaLibrary,
onAddAsset: () => setStep(STEPS2.AssetSelect),
onDropAsset: handleAssetDrop,
onEditAsset: handleAssetEdit,
onNext: handleNext,
onPrevious: handlePrevious,
error,
hint,
required,
selectedAssetIndex: selectedIndex,
trackedLocation: "content-manager"
}),
step === STEPS2.AssetSelect && (0, import_jsx_runtime15.jsx)(AssetDialog, {
allowedTypes: fieldAllowedTypes,
initiallySelectedAssets,
folderId,
onClose: () => {
setStep(void 0);
setFolderId(null);
},
open: step === STEPS2.AssetSelect,
onValidate: handleValidation,
multiple,
onAddAsset: () => setStep(STEPS2.AssetUpload),
onAddFolder: () => setStep(STEPS2.FolderCreate),
onChangeFolder: (folder) => setFolderId(folder),
trackedLocation: "content-manager"
}),
step === STEPS2.AssetUpload && (0, import_jsx_runtime15.jsx)(UploadAssetDialog, {
open: step === STEPS2.AssetUpload,
onClose: () => setStep(STEPS2.AssetSelect),
initialAssetsToAdd: droppedAssets,
addUploadedFiles: handleFilesUploadSucceeded,
trackedLocation: "content-manager",
folderId,
validateAssetsTypes
}),
step === STEPS2.FolderCreate && (0, import_jsx_runtime15.jsx)(EditFolderDialog, {
open: step === STEPS2.FolderCreate,
onClose: () => setStep(STEPS2.AssetSelect),
parentFolderId: folderId
})
]
});
});
// node_modules/@strapi/upload/dist/admin/index.mjs
var import_qs11 = __toESM(require_lib(), 1);
// node_modules/@strapi/upload/dist/admin/utils/prefixPluginTranslations.mjs
var prefixPluginTranslations3 = (trad, pluginId5) => {
if (!pluginId5) {
throw new TypeError("pluginId can't be empty");
}
return Object.keys(trad).reduce((acc, current) => {
acc[`${pluginId5}.${current}`] = trad[current];
return acc;
}, {});
};
// node_modules/@strapi/upload/dist/admin/index.mjs
function __variableDynamicImportRuntime2__(path) {
switch (path) {
case "./translations/ca.json":
return import("./ca.json-SGLYOKFN.js");
case "./translations/de.json":
return import("./de.json-ZBRIRFBP.js");
case "./translations/dk.json":
return import("./dk.json-V2MWWTY7.js");
case "./translations/en.json":
return import("./en.json-7E4TPUWN.js");
case "./translations/es.json":
return import("./es.json-W3AZZ4NL.js");
case "./translations/fr.json":
return import("./fr.json-5MRAYCZS.js");
case "./translations/he.json":
return import("./he.json-G7H73RQW.js");
case "./translations/it.json":
return import("./it.json-ZDRZ7F5X.js");
case "./translations/ja.json":
return import("./ja.json-A5FGOGTR.js");
case "./translations/ko.json":
return import("./ko.json-TUNMS3U3.js");
case "./translations/ms.json":
return import("./ms.json-4TMLK7KR.js");
case "./translations/pl.json":
return import("./pl.json-WI3YPLLQ.js");
case "./translations/pt-BR.json":
return import("./pt-BR.json-IHUN7DZM.js");
case "./translations/pt.json":
return import("./pt.json-3PC4SO3V.js");
case "./translations/ru.json":
return import("./ru.json-E3NA2AA2.js");
case "./translations/sk.json":
return import("./sk.json-CIND4NQ3.js");
case "./translations/th.json":
return import("./th.json-FIKGWXOL.js");
case "./translations/tr.json":
return import("./tr.json-OVRXCZHU.js");
case "./translations/uk.json":
return import("./uk.json-WPUUSCPA.js");
case "./translations/zh-Hans.json":
return import("./zh-Hans.json-WPBNXHYL.js");
case "./translations/zh.json":
return import("./zh.json-BZJDH453.js");
default:
return new Promise(function(resolve, reject) {
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
reject.bind(null, new Error("Unknown variable dynamic import: " + path))
);
});
}
}
var name = pluginPkg.strapi.name;
var admin2 = {
register(app) {
app.addMenuLink({
to: `plugins/${pluginId2}`,
icon: ForwardRef$2J,
intlLabel: {
id: `${pluginId2}.plugin.name`,
defaultMessage: "Media Library"
},
permissions: PERMISSIONS3.main,
Component: () => import("./App-SVHNQJEN.js").then((mod) => ({
default: mod.Upload
})),
position: 4
});
app.addSettingsLink("global", {
id: "media-library-settings",
to: "media-library",
intlLabel: {
id: getTrad("plugin.name"),
defaultMessage: "Media Library"
},
async Component() {
const { ProtectedSettingsPage } = await import("./SettingsPage-RQMX2WLO.js");
return {
default: ProtectedSettingsPage
};
},
permissions: PERMISSIONS3.settings
});
app.addFields({
type: "media",
Component: MediaLibraryInput
});
app.addComponents([
{
name: "media-library",
Component: MediaLibraryDialog
}
]);
app.registerPlugin({
id: pluginId2,
name
});
},
async registerTrads({ locales }) {
const importedTrads = await Promise.all(locales.map((locale) => {
return __variableDynamicImportRuntime2__(`./translations/${locale}.json`).then(({ default: data }) => {
return {
data: prefixPluginTranslations3(data, pluginId2),
locale
};
}).catch(() => {
return {
data: {},
locale
};
});
}));
return Promise.resolve(importedTrads);
}
};
// node_modules/@strapi/i18n/dist/admin/index.mjs
var import_get3 = __toESM(require_get(), 1);
// node_modules/@strapi/i18n/dist/admin/components/CheckboxConfirmation.mjs
var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
var React10 = __toESM(require_react(), 1);
var TextAlignTypography2 = dt(Typography)`
text-align: center;
`;
var CheckboxConfirmation = ({ description, isCreating = false, intlLabel, name: name2, onChange, value }) => {
const { formatMessage } = useIntl();
const [isOpen, setIsOpen] = React10.useState(false);
const handleChange = (value2) => {
if (isCreating || value2) {
return onChange({
target: {
name: name2,
value: value2,
type: "checkbox"
}
});
}
if (!value2) {
return setIsOpen(true);
}
return null;
};
const handleConfirm = () => {
onChange({
target: {
name: name2,
value: false,
type: "checkbox"
}
});
};
const label = intlLabel.id ? formatMessage({
id: intlLabel.id,
defaultMessage: intlLabel.defaultMessage
}, {
...intlLabel.values
}) : name2;
const hint = description ? formatMessage({
id: description.id,
defaultMessage: description.defaultMessage
}, {
...description.values
}) : "";
return (0, import_jsx_runtime16.jsxs)(Dialog.Root, {
open: isOpen,
onOpenChange: setIsOpen,
children: [
(0, import_jsx_runtime16.jsxs)(Field.Root, {
hint,
name: name2,
children: [
(0, import_jsx_runtime16.jsx)(CheckboxImpl, {
onCheckedChange: handleChange,
checked: value,
children: label
}),
(0, import_jsx_runtime16.jsx)(Field.Hint, {})
]
}),
(0, import_jsx_runtime16.jsxs)(Dialog.Content, {
children: [
(0, import_jsx_runtime16.jsx)(Dialog.Header, {
children: formatMessage({
id: getTranslation("CheckboxConfirmation.Modal.title"),
defaultMessage: "Disable localization"
})
}),
(0, import_jsx_runtime16.jsx)(Dialog.Body, {
icon: (0, import_jsx_runtime16.jsx)(ForwardRef$3, {}),
children: (0, import_jsx_runtime16.jsxs)(Flex, {
direction: "column",
alignItems: "stretch",
gap: 2,
children: [
(0, import_jsx_runtime16.jsx)(Flex, {
justifyContent: "center",
children: (0, import_jsx_runtime16.jsx)(TextAlignTypography2, {
children: formatMessage({
id: getTranslation("CheckboxConfirmation.Modal.content"),
defaultMessage: "Disabling localization will engender the deletion of all your content but the one associated to your default locale (if existing)."
})
})
}),
(0, import_jsx_runtime16.jsx)(Flex, {
justifyContent: "center",
children: (0, import_jsx_runtime16.jsx)(Typography, {
fontWeight: "semiBold",
children: formatMessage({
id: getTranslation("CheckboxConfirmation.Modal.body"),
defaultMessage: "Do you want to disable it?"
})
})
})
]
})
}),
(0, import_jsx_runtime16.jsxs)(Dialog.Footer, {
children: [
(0, import_jsx_runtime16.jsx)(Dialog.Cancel, {
children: (0, import_jsx_runtime16.jsx)(Button, {
variant: "tertiary",
children: formatMessage({
id: "components.popUpWarning.button.cancel",
defaultMessage: "No, cancel"
})
})
}),
(0, import_jsx_runtime16.jsx)(Dialog.Action, {
children: (0, import_jsx_runtime16.jsx)(Button, {
variant: "danger-light",
onClick: handleConfirm,
children: formatMessage({
id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
defaultMessage: "Yes, disable"
})
})
})
]
})
]
})
]
});
};
// node_modules/@strapi/i18n/dist/admin/components/CMHeaderActions.mjs
var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
var React12 = __toESM(require_react(), 1);
// node_modules/@strapi/i18n/dist/admin/hooks/useI18n.mjs
var React11 = __toESM(require_react(), 1);
// node_modules/@strapi/i18n/dist/admin/utils/fields.mjs
var LOCALIZED_FIELDS = [
"biginteger",
"boolean",
"component",
"date",
"datetime",
"decimal",
"dynamiczone",
"email",
"enumeration",
"float",
"integer",
"json",
"media",
"number",
"password",
"richtext",
"blocks",
"string",
"text",
"time"
];
var doesPluginOptionsHaveI18nLocalized = (opts) => typeof opts === "object" && opts !== null && "i18n" in opts && typeof opts.i18n === "object" && opts.i18n !== null && "localized" in opts.i18n && typeof opts.i18n.localized === "boolean";
// node_modules/@strapi/i18n/dist/admin/utils/strings.mjs
var capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
// node_modules/@strapi/i18n/dist/admin/hooks/useI18n.mjs
var useI18n = () => {
const params = useParams();
const userPermissions = useAuth("useI18n", (state) => state.permissions);
const actions = React11.useMemo(() => {
const permissions = userPermissions.filter((permission) => permission.subject === params.slug);
return permissions.reduce((acc, permission) => {
var _a;
const [actionShorthand] = permission.action.split(".").slice(-1);
return {
...acc,
[`can${capitalize(actionShorthand)}`]: ((_a = permission.properties) == null ? void 0 : _a.locales) ?? []
};
}, {
canCreate: [],
canRead: [],
canUpdate: [],
canDelete: [],
canPublish: []
});
}, [
params.slug,
userPermissions
]);
const { schema } = useDocument({
// We can non-null assert these because below we skip the query if they are not present
collectionType: params.collectionType,
model: params.slug
}, {
skip: true
});
if (doesPluginOptionsHaveI18nLocalized(schema == null ? void 0 : schema.pluginOptions)) {
return {
hasI18n: schema.pluginOptions.i18n.localized,
...actions
};
}
return {
hasI18n: false,
...actions
};
};
// node_modules/@strapi/i18n/dist/admin/services/relations.mjs
var relationsApi = i18nApi.injectEndpoints({
overrideExisting: true,
endpoints: (builder) => ({
getManyDraftRelationCount: builder.query({
query: ({ model, ...params }) => ({
url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,
method: "GET",
config: {
params
}
}),
transformResponse: (response) => response.data
})
})
});
var { useGetManyDraftRelationCountQuery } = relationsApi;
// node_modules/@strapi/i18n/dist/admin/utils/clean.mjs
var cleanData = (data, schema, components) => {
const cleanedData = removeFields(data, [
"createdAt",
"createdBy",
"updatedAt",
"updatedBy",
"id",
"documentId",
"publishedAt",
"strapi_stage",
"strapi_assignee",
"locale",
"status"
]);
const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(cleanedData, schema, components, [
"relation",
"password"
]);
return cleanedDataWithoutPasswordAndRelation;
};
var removeFields = (data, fields) => {
return Object.keys(data).reduce((acc, current) => {
if (fields.includes(current)) {
return acc;
}
acc[current] = data[current];
return acc;
}, {});
};
var recursiveRemoveFieldTypes = (data, schema, components, fields) => {
return Object.keys(data).reduce((acc, current) => {
const attribute = schema.attributes[current] ?? {
type: void 0
};
if (fields.includes(attribute.type)) {
return acc;
}
if (attribute.type === "dynamiczone") {
acc[current] = data[current].map((componentValue, index4) => {
const { id: _, ...rest } = recursiveRemoveFieldTypes(componentValue, components[componentValue.__component], components, fields);
return {
...rest,
__temp_key__: index4 + 1
};
});
} else if (attribute.type === "component") {
const { repeatable, component } = attribute;
if (repeatable) {
acc[current] = (data[current] ?? []).map((compoData, index4) => {
const { id: _, ...rest } = recursiveRemoveFieldTypes(compoData, components[component], components, fields);
return {
...rest,
__temp_key__: index4 + 1
};
});
} else {
const { id: _, ...rest } = recursiveRemoveFieldTypes(data[current] ?? {}, components[component], components, fields);
acc[current] = rest;
}
} else {
acc[current] = data[current];
}
return acc;
}, {});
};
// node_modules/@strapi/i18n/dist/admin/components/BulkLocaleActionModal.mjs
var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1);
var import_react = __toESM(require_react(), 1);
var import_qs12 = __toESM(require_lib(), 1);
var isErrorMessageDescriptor = (object) => {
return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
};
var EntryValidationText = ({ status = "draft", validationErrors, action }) => {
const { formatMessage } = useIntl();
const getErrorStr = (key, value) => {
if (typeof value === "string") {
return `${key}: ${value}`;
} else if (isErrorMessageDescriptor(value)) {
return `${key}: ${formatMessage(value)}`;
} else if (Array.isArray(value)) {
return value.map((v) => getErrorStr(key, v)).join(" ");
} else if (typeof value === "object" && !Array.isArray(value)) {
return Object.entries(value).map(([k, v]) => getErrorStr(k, v)).join(" ");
} else {
return "";
}
};
if (validationErrors) {
const validationErrorsMessages = Object.entries(validationErrors).map(([key, value]) => {
return getErrorStr(key, value);
}).join(" ");
return (0, import_jsx_runtime17.jsxs)(Flex, {
gap: 2,
children: [
(0, import_jsx_runtime17.jsx)(ForwardRef$43, {
fill: "danger600"
}),
(0, import_jsx_runtime17.jsx)(TooltipImpl, {
label: validationErrorsMessages,
children: (0, import_jsx_runtime17.jsx)(Typography, {
maxWidth: "30rem",
textColor: "danger600",
variant: "omega",
fontWeight: "semiBold",
ellipsis: true,
children: validationErrorsMessages
})
})
]
});
}
const getStatusMessage = () => {
if (action === "bulk-publish") {
if (status === "published") {
return {
icon: (0, import_jsx_runtime17.jsx)(ForwardRef$4D, {
fill: "success600"
}),
text: formatMessage({
id: "content-manager.bulk-publish.already-published",
defaultMessage: "Already Published"
}),
textColor: "success600",
fontWeight: "bold"
};
} else if (status === "modified") {
return {
icon: (0, import_jsx_runtime17.jsx)(ForwardRef$59, {
fill: "alternative600"
}),
text: formatMessage({
id: "app.utils.ready-to-publish-changes",
defaultMessage: "Ready to publish changes"
})
};
} else {
return {
icon: (0, import_jsx_runtime17.jsx)(ForwardRef$4D, {
fill: "success600"
}),
text: formatMessage({
id: "app.utils.ready-to-publish",
defaultMessage: "Ready to publish"
})
};
}
} else {
if (status === "draft") {
return {
icon: (0, import_jsx_runtime17.jsx)(ForwardRef$4D, {
fill: "success600"
}),
text: formatMessage({
id: "content-manager.bulk-unpublish.already-unpublished",
defaultMessage: "Already Unpublished"
}),
textColor: "success600",
fontWeight: "bold"
};
} else {
return {
icon: (0, import_jsx_runtime17.jsx)(ForwardRef$4D, {
fill: "success600"
}),
text: formatMessage({
id: "app.utils.ready-to-unpublish-changes",
defaultMessage: "Ready to unpublish"
}),
textColor: "success600",
fontWeight: "bold"
};
}
}
};
const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
return (0, import_jsx_runtime17.jsxs)(Flex, {
gap: 2,
children: [
icon,
(0, import_jsx_runtime17.jsx)(Typography, {
textColor,
fontWeight,
children: text
})
]
});
};
var BoldChunk = (chunks) => (0, import_jsx_runtime17.jsx)(Typography, {
fontWeight: "bold",
children: chunks
});
var BulkLocaleActionModal = ({ headers, rows, localesMetadata, validationErrors = {}, action }) => {
const { formatMessage } = useIntl();
const selectedRows = useTable("BulkLocaleActionModal", (state) => state.selectedRows);
const getFormattedCountMessage = () => {
const currentStatusByLocale = rows.reduce((acc, { locale, status }) => {
acc[locale] = status;
return acc;
}, {});
const localesWithErrors = Object.keys(validationErrors);
const publishedCount = selectedRows.filter(({ locale }) => currentStatusByLocale[locale] === "published").length;
const draftCount = selectedRows.filter(({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)).length;
const withErrorsCount = localesWithErrors.length;
const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
const defaultMessage = action === "bulk-publish" ? "{publishedCount} {publishedCount, plural, =0 {entries} one {entry} other {entries}} already published. {draftCount} {draftCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. {withErrorsCount} {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action." : "{draftCount} {draftCount, plural, =0 {entries} one {entry} other {entries}} already unpublished. {publishedCount} {publishedCount, plural, =0 {entries} one {entry} other {entries}} ready to unpublish.";
return formatMessage({
id: messageId,
defaultMessage
}, {
withErrorsCount,
draftCount,
publishedCount,
b: BoldChunk
});
};
return (0, import_jsx_runtime17.jsxs)(Modal.Body, {
children: [
(0, import_jsx_runtime17.jsx)(Typography, {
children: getFormattedCountMessage()
}),
(0, import_jsx_runtime17.jsx)(Box, {
marginTop: 5,
children: (0, import_jsx_runtime17.jsxs)(Table.Content, {
children: [
(0, import_jsx_runtime17.jsxs)(Table.Head, {
children: [
(0, import_jsx_runtime17.jsx)(Table.HeaderCheckboxCell, {}),
headers.map((head) => (0, import_jsx_runtime17.jsx)(Table.HeaderCell, {
...head
}, head.name))
]
}),
(0, import_jsx_runtime17.jsx)(Table.Body, {
children: rows.map(({ locale, status }, index4) => {
var _a;
const error = (validationErrors == null ? void 0 : validationErrors[locale]) ?? null;
const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
return (0, import_jsx_runtime17.jsxs)(Table.Row, {
children: [
(0, import_jsx_runtime17.jsx)(Table.CheckboxCell, {
id: locale,
"aria-label": `Select ${locale}`
}),
(0, import_jsx_runtime17.jsx)(Table.Cell, {
children: (0, import_jsx_runtime17.jsx)(Typography, {
variant: "sigma",
textColor: "neutral600",
children: Array.isArray(localesMetadata) ? (_a = localesMetadata.find((localeEntry) => localeEntry.code === locale)) == null ? void 0 : _a.name : locale
})
}),
(0, import_jsx_runtime17.jsx)(Table.Cell, {
children: (0, import_jsx_runtime17.jsx)(Box, {
display: "flex",
children: (0, import_jsx_runtime17.jsx)(Status, {
display: "flex",
paddingLeft: "6px",
paddingRight: "6px",
paddingTop: "2px",
paddingBottom: "2px",
size: "S",
variant: statusVariant,
children: (0, import_jsx_runtime17.jsx)(Typography, {
tag: "span",
variant: "pi",
fontWeight: "bold",
children: capitalize(status)
})
})
})
}),
(0, import_jsx_runtime17.jsx)(Table.Cell, {
children: (0, import_jsx_runtime17.jsx)(EntryValidationText, {
validationErrors: error,
status,
action
})
}),
(0, import_jsx_runtime17.jsx)(Table.Cell, {
children: (0, import_jsx_runtime17.jsx)(IconButton, {
tag: Link,
to: {
search: (0, import_qs12.stringify)({
plugins: {
i18n: {
locale
}
}
})
},
label: formatMessage({
id: getTranslation("Settings.list.actions.edit"),
defaultMessage: "Edit {name} locale"
}, {
name: locale
}),
variant: "ghost",
children: (0, import_jsx_runtime17.jsx)(ForwardRef$1v, {})
})
})
]
}, index4);
})
})
]
})
})
]
});
};
// node_modules/@strapi/i18n/dist/admin/components/CMHeaderActions.mjs
var statusVariants = {
draft: "secondary",
published: "success",
modified: "alternative"
};
var LocaleOption = ({ isDraftAndPublishEnabled, locale, status, entryExists }) => {
const { formatMessage } = useIntl();
if (!entryExists) {
return formatMessage({
id: getTranslation("CMEditViewLocalePicker.locale.create"),
defaultMessage: "Create {locale} locale"
}, {
bold: (locale2) => (0, import_jsx_runtime18.jsx)("b", {
children: locale2
}),
locale: locale.name
});
}
return (0, import_jsx_runtime18.jsxs)(Flex, {
width: "100%",
gap: 1,
justifyContent: "space-between",
children: [
(0, import_jsx_runtime18.jsx)(Typography, {
children: locale.name
}),
isDraftAndPublishEnabled ? (0, import_jsx_runtime18.jsx)(Status, {
display: "flex",
paddingLeft: "6px",
paddingRight: "6px",
paddingTop: "2px",
paddingBottom: "2px",
size: "S",
variant: statusVariants[status],
children: (0, import_jsx_runtime18.jsx)(Typography, {
tag: "span",
variant: "pi",
fontWeight: "bold",
children: capitalize(status)
})
}) : null
]
});
};
var LocalePickerAction = ({ document, meta, model, collectionType, documentId }) => {
var _a, _b;
const { formatMessage } = useIntl();
const [{ query }, setQuery] = useQueryParams();
const { hasI18n, canCreate, canRead } = useI18n();
const { data: locales = [] } = useGetLocalesQuery();
const currentDesiredLocale = (_b = (_a = query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale;
const { schema } = useDocument({
model,
collectionType,
documentId,
params: {
locale: currentDesiredLocale
}
});
const handleSelect = React12.useCallback((value) => {
setQuery({
plugins: {
...query.plugins,
i18n: {
locale: value
}
}
});
}, [
query.plugins,
setQuery
]);
React12.useEffect(() => {
if (!Array.isArray(locales) || !hasI18n) {
return;
}
const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
const defaultLocale = locales.find((locale) => locale.isDefault);
if (!doesLocaleExist && (defaultLocale == null ? void 0 : defaultLocale.code)) {
handleSelect(defaultLocale.code);
}
}, [
handleSelect,
hasI18n,
locales,
currentDesiredLocale
]);
const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
const allCurrentLocales = [
{
status: getDocumentStatus(document, meta),
locale: currentLocale == null ? void 0 : currentLocale.code
},
...(document == null ? void 0 : document.localizations) ?? []
];
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
return null;
}
const displayedLocales = locales.filter((locale) => {
return canRead.includes(locale.code);
});
return {
label: formatMessage({
id: getTranslation("Settings.locales.modal.locales.label"),
defaultMessage: "Locales"
}),
options: displayedLocales.map((locale) => {
var _a2;
const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
const currentLocaleDoc = allCurrentLocales.find((doc) => "locale" in doc ? doc.locale === locale.code : false);
const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
return {
disabled: !permissionsToCheck.includes(locale.code),
value: locale.code,
label: (0, import_jsx_runtime18.jsx)(LocaleOption, {
isDraftAndPublishEnabled: !!((_a2 = schema == null ? void 0 : schema.options) == null ? void 0 : _a2.draftAndPublish),
locale,
status: currentLocaleDoc == null ? void 0 : currentLocaleDoc.status,
entryExists: entryWithLocaleExists
}),
startIcon: !entryWithLocaleExists ? (0, import_jsx_runtime18.jsx)(ForwardRef$1h, {}) : null
};
}),
customizeContent: () => currentLocale == null ? void 0 : currentLocale.name,
onSelect: handleSelect,
value: currentLocale
};
};
var getDocumentStatus = (document, meta) => {
const docStatus = document == null ? void 0 : document.status;
const statuses = (meta == null ? void 0 : meta.availableStatus) ?? [];
if (!docStatus) {
return "draft";
}
if (docStatus === "draft" && statuses.find((doc) => doc.publishedAt !== null)) {
return "published";
}
return docStatus;
};
var FillFromAnotherLocaleAction = ({ documentId, meta, model, collectionType }) => {
var _a, _b;
const { formatMessage } = useIntl();
const [{ query }] = useQueryParams();
const { hasI18n } = useI18n();
const currentDesiredLocale = (_b = (_a = query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale;
const [localeSelected, setLocaleSelected] = React12.useState(null);
const setValues = useForm("FillFromAnotherLocale", (state) => state.setValues);
const { getDocument } = useDocumentActions();
const { schema, components } = useDocument({
model,
documentId,
collectionType,
params: {
locale: currentDesiredLocale
}
});
const { data: locales = [] } = useGetLocalesQuery();
const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta == null ? void 0 : meta.availableLocales.some((l) => l.locale === locale.code)) : [];
const fillFromLocale = (onClose) => async () => {
const response = await getDocument({
collectionType,
model,
documentId,
params: {
locale: localeSelected
}
});
if (!response || !schema) {
return;
}
const { data } = response;
const cleanedData = cleanData(data, schema, components);
setValues(cleanedData);
onClose();
};
if (!hasI18n) {
return null;
}
return {
type: "icon",
icon: (0, import_jsx_runtime18.jsx)(ForwardRef$3P, {}),
disabled: availableLocales.length === 0,
label: formatMessage({
id: getTranslation("CMEditViewCopyLocale.copy-text"),
defaultMessage: "Fill in from another locale"
}),
dialog: {
type: "dialog",
title: formatMessage({
id: getTranslation("CMEditViewCopyLocale.dialog.title"),
defaultMessage: "Confirmation"
}),
content: ({ onClose }) => (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, {
children: [
(0, import_jsx_runtime18.jsx)(Dialog.Body, {
children: (0, import_jsx_runtime18.jsxs)(Flex, {
direction: "column",
gap: 3,
children: [
(0, import_jsx_runtime18.jsx)(ForwardRef$3, {
width: "24px",
height: "24px",
fill: "danger600"
}),
(0, import_jsx_runtime18.jsx)(Typography, {
textAlign: "center",
children: formatMessage({
id: getTranslation("CMEditViewCopyLocale.dialog.body"),
defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
})
}),
(0, import_jsx_runtime18.jsxs)(Field.Root, {
width: "100%",
children: [
(0, import_jsx_runtime18.jsx)(Field.Label, {
children: formatMessage({
id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
defaultMessage: "Locale"
})
}),
(0, import_jsx_runtime18.jsx)(SingleSelect, {
value: localeSelected,
placeholder: formatMessage({
id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
defaultMessage: "Select one locale..."
}),
// @ts-expect-error – the DS will handle numbers, but we're not allowing the API.
onChange: (value) => setLocaleSelected(value),
children: availableLocales.map((locale) => (0, import_jsx_runtime18.jsx)(SingleSelectOption, {
value: locale.code,
children: locale.name
}, locale.code))
})
]
})
]
})
}),
(0, import_jsx_runtime18.jsx)(Dialog.Footer, {
children: (0, import_jsx_runtime18.jsxs)(Flex, {
gap: 2,
width: "100%",
children: [
(0, import_jsx_runtime18.jsx)(Button, {
flex: "auto",
variant: "tertiary",
onClick: onClose,
children: formatMessage({
id: getTranslation("CMEditViewCopyLocale.cancel-text"),
defaultMessage: "No, cancel"
})
}),
(0, import_jsx_runtime18.jsx)(Button, {
flex: "auto",
variant: "success",
onClick: fillFromLocale(onClose),
children: formatMessage({
id: getTranslation("CMEditViewCopyLocale.submit-text"),
defaultMessage: "Yes, fill in"
})
})
]
})
})
]
})
}
};
};
var DeleteLocaleAction = ({ document, documentId, model, collectionType }) => {
var _a, _b;
const { formatMessage } = useIntl();
const navigate = useNavigate();
const { toggleNotification } = useNotification();
const { delete: deleteAction, isLoading } = useDocumentActions();
const { hasI18n, canDelete } = useI18n();
const [{ query }] = useQueryParams();
const { data: locales = [] } = useGetLocalesQuery();
const currentDesiredLocale = (_b = (_a = query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale;
const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
if (!hasI18n) {
return null;
}
return {
disabled: (document == null ? void 0 : document.locale) && !canDelete.includes(document.locale) || !document || !document.id,
position: [
"header",
"table-row"
],
label: formatMessage({
id: getTranslation("actions.delete.label"),
defaultMessage: "Delete entry ({locale})"
}, {
locale: locale && locale.name
}),
icon: (0, import_jsx_runtime18.jsx)(StyledTrash, {}),
variant: "danger",
dialog: {
type: "dialog",
title: formatMessage({
id: getTranslation("actions.delete.dialog.title"),
defaultMessage: "Confirmation"
}),
content: (0, import_jsx_runtime18.jsxs)(Flex, {
direction: "column",
gap: 2,
children: [
(0, import_jsx_runtime18.jsx)(ForwardRef$3, {
width: "24px",
height: "24px",
fill: "danger600"
}),
(0, import_jsx_runtime18.jsx)(Typography, {
tag: "p",
variant: "omega",
textAlign: "center",
children: formatMessage({
id: getTranslation("actions.delete.dialog.body"),
defaultMessage: "Are you sure?"
})
})
]
}),
loading: isLoading,
onConfirm: async () => {
const unableToDelete = (
// We are unable to delete a collection type without a document ID
// & unable to delete generally if there is no document locale
collectionType !== "single-types" && !documentId || !(document == null ? void 0 : document.locale)
);
if (unableToDelete) {
console.error("You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue.");
toggleNotification({
message: formatMessage({
id: getTranslation("actions.delete.error"),
defaultMessage: "An error occurred while trying to delete the document locale."
}),
type: "danger"
});
return;
}
const res = await deleteAction({
documentId,
model,
collectionType,
params: {
locale: document.locale
}
});
if (!("error" in res)) {
navigate({
pathname: `../${collectionType}/${model}`
}, {
replace: true
});
}
}
}
};
};
var BulkLocaleAction = ({ document, documentId, model, collectionType, action }) => {
var _a;
const locale = (document == null ? void 0 : document.locale) ?? null;
const [{ query }] = useQueryParams();
const params = React12.useMemo(() => buildValidParams(query), [
query
]);
const isOnPublishedTab = query.status === "published";
const { formatMessage } = useIntl();
const { hasI18n, canPublish } = useI18n();
const { toggleNotification } = useNotification();
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
const [selectedRows, setSelectedRows] = React12.useState([]);
const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React12.useState(false);
const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = useDocumentActions();
const { schema, validate } = useDocument({
model,
collectionType,
documentId,
params: {
locale
}
}, {
// No need to fetch the document, the data is already available in the `document` prop
skip: true
});
const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : skipToken);
const headers = [
{
label: formatMessage({
id: "global.name",
defaultMessage: "Name"
}),
name: "name"
},
{
label: formatMessage({
id: getTranslation("CMEditViewBulkLocale.status"),
defaultMessage: "Status"
}),
name: "status"
},
{
label: formatMessage({
id: getTranslation("CMEditViewBulkLocale.publication-status"),
defaultMessage: "Publication Status"
}),
name: "publication-status"
}
];
const [rows, validationErrors] = React12.useMemo(() => {
if (!document) {
return [
[],
{}
];
}
const localizations = document.localizations ?? [];
const locales = localizations.map((doc) => {
const { locale: locale2, status } = doc;
return {
locale: locale2,
status
};
});
locales.unshift({
locale: document.locale,
status: document.status
});
const allDocuments = [
document,
...localizations
];
const errors = allDocuments.reduce((errs, document2) => {
if (!document2) {
return errs;
}
const validation = validate(document2);
if (validation !== null) {
errs[document2.locale] = validation;
}
return errs;
}, {});
return [
locales,
errors
];
}, [
document,
validate
]);
const isBulkPublish = action === "bulk-publish";
const localesForAction = selectedRows.reduce((acc, selectedRow) => {
const isValidLocale = (
// Validation errors are irrelevant if we are trying to unpublish
!isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
);
const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
if (shouldAddLocale) {
acc.push(selectedRow.locale);
}
return acc;
}, []);
const enableDraftRelationsCount = false;
const { data: draftRelationsCount = 0, isLoading: isDraftRelationsLoading, error: isDraftRelationsError } = useGetManyDraftRelationCountQuery({
model,
documentIds: [
documentId
],
locale: localesForAction
}, {
skip: !enableDraftRelationsCount
});
React12.useEffect(() => {
if (isDraftRelationsError) {
toggleNotification({
type: "danger",
message: formatAPIError(isDraftRelationsError)
});
}
}, [
isDraftRelationsError,
toggleNotification,
formatAPIError
]);
if (!((_a = schema == null ? void 0 : schema.options) == null ? void 0 : _a.draftAndPublish)) {
return null;
}
if (!hasI18n) {
return null;
}
if (!documentId) {
return null;
}
const publish = async () => {
await publishManyAction({
model,
documentIds: [
documentId
],
params: {
...params,
locale: localesForAction
}
});
setSelectedRows([]);
};
const unpublish = async () => {
await unpublishManyAction({
model,
documentIds: [
documentId
],
params: {
...params,
locale: localesForAction
}
});
setSelectedRows([]);
};
const handleAction = async () => {
if (draftRelationsCount > 0) {
setIsDraftRelationConfirmationOpen(true);
} else if (isBulkPublish) {
await publish();
} else {
await unpublish();
}
};
if (isDraftRelationConfirmationOpen) {
return {
label: formatMessage({
id: "app.components.ConfirmDialog.title",
defaultMessage: "Confirmation"
}),
variant: "danger",
dialog: {
onCancel: () => {
setIsDraftRelationConfirmationOpen(false);
},
onConfirm: async () => {
await publish();
setIsDraftRelationConfirmationOpen(false);
},
type: "dialog",
title: formatMessage({
id: getTranslation("actions.publish.dialog.title"),
defaultMessage: "Confirmation"
}),
content: (0, import_jsx_runtime18.jsxs)(Flex, {
direction: "column",
alignItems: "center",
gap: 2,
children: [
(0, import_jsx_runtime18.jsx)(ForwardRef$3, {
width: "2.4rem",
height: "2.4rem",
fill: "danger600"
}),
(0, import_jsx_runtime18.jsx)(Typography, {
textAlign: "center",
children: formatMessage({
id: getTranslation("CMEditViewBulkLocale.draft-relation-warning"),
defaultMessage: "Some locales are related to draft entries. Publishing them could leave broken links in your app."
})
}),
(0, import_jsx_runtime18.jsx)(Typography, {
textAlign: "center",
children: formatMessage({
id: getTranslation("CMEditViewBulkLocale.continue-confirmation"),
defaultMessage: "Are you sure you want to continue?"
})
})
]
})
}
};
}
const hasPermission = selectedRows.map(({ locale: locale2 }) => locale2).every((locale2) => canPublish.includes(locale2));
return {
label: formatMessage({
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
}),
variant: isBulkPublish ? "secondary" : "danger",
icon: isBulkPublish ? (0, import_jsx_runtime18.jsx)(ForwardRef$2n, {}) : (0, import_jsx_runtime18.jsx)(ForwardRef$45, {}),
disabled: isOnPublishedTab || canPublish.length === 0,
position: [
"panel"
],
dialog: {
type: "modal",
title: formatMessage({
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
}),
content: () => {
return (0, import_jsx_runtime18.jsx)(Table.Root, {
headers,
rows: rows.map((row) => ({
...row,
id: row.locale
})),
selectedRows,
onSelectedRowsChange: (tableSelectedRows) => setSelectedRows(tableSelectedRows),
children: (0, import_jsx_runtime18.jsx)(BulkLocaleActionModal, {
validationErrors,
headers,
rows,
localesMetadata,
action: action ?? "bulk-publish"
})
});
},
footer: () => (0, import_jsx_runtime18.jsx)(Modal.Footer, {
justifyContent: "flex-end",
children: (0, import_jsx_runtime18.jsx)(Button, {
loading: isDraftRelationsLoading,
disabled: !hasPermission || localesForAction.length === 0,
variant: "default",
onClick: handleAction,
children: formatMessage({
id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
})
})
})
}
};
};
var BulkLocalePublishAction = (props) => {
return BulkLocaleAction({
action: "bulk-publish",
...props
});
};
var BulkLocaleUnpublishAction = (props) => {
return BulkLocaleAction({
action: "bulk-unpublish",
...props
});
};
var StyledTrash = dt(ForwardRef$j)`
path {
fill: currentColor;
}
`;
// node_modules/@strapi/i18n/dist/admin/components/CMListViewModalsAdditionalInformation.mjs
var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1);
var import_react2 = __toESM(require_react(), 1);
var Emphasis = (chunks) => {
return (0, import_jsx_runtime19.jsx)(Typography, {
fontWeight: "semiBold",
textColor: "danger500",
children: chunks
});
};
var DeleteModalAdditionalInfo = () => {
const { hasI18n } = useI18n();
const { formatMessage } = useIntl();
if (!hasI18n) {
return null;
}
return (0, import_jsx_runtime19.jsx)(Typography, {
textColor: "danger500",
children: formatMessage({
id: getTranslation("Settings.list.actions.deleteAdditionalInfos"),
defaultMessage: "This will delete the active locale versions (from Internationalization)"
}, {
em: Emphasis
})
});
};
var PublishModalAdditionalInfo = () => {
const { hasI18n } = useI18n();
const { formatMessage } = useIntl();
if (!hasI18n) {
return null;
}
return (0, import_jsx_runtime19.jsx)(Typography, {
textColor: "danger500",
children: formatMessage({
id: getTranslation("Settings.list.actions.publishAdditionalInfos"),
defaultMessage: "This will publish the active locale versions (from Internationalization)"
}, {
em: Emphasis
})
});
};
var UnpublishModalAdditionalInfo = () => {
const { hasI18n } = useI18n();
const { formatMessage } = useIntl();
if (!hasI18n) {
return null;
}
return (0, import_jsx_runtime19.jsx)(Typography, {
textColor: "danger500",
children: formatMessage({
id: getTranslation("Settings.list.actions.unpublishAdditionalInfos"),
defaultMessage: "This will unpublish the active locale versions (from Internationalization)"
}, {
em: Emphasis
})
});
};
// node_modules/@strapi/i18n/dist/admin/components/LocalePicker.mjs
var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1);
var React13 = __toESM(require_react(), 1);
var LocalePicker = () => {
var _a, _b, _c, _d, _e;
const { formatMessage } = useIntl();
const [{ query }, setQuery] = useQueryParams();
const { hasI18n, canRead, canCreate } = useI18n();
const { data: locales = [] } = useGetLocalesQuery(void 0, {
skip: !hasI18n
});
const handleChange = React13.useCallback((code, replace = false) => {
setQuery({
page: 1,
plugins: {
...query.plugins,
i18n: {
locale: code
}
}
}, "push", replace);
}, [
query.plugins,
setQuery
]);
React13.useEffect(() => {
var _a2, _b2;
if (!Array.isArray(locales) || !hasI18n) {
return;
}
const currentDesiredLocale = (_b2 = (_a2 = query.plugins) == null ? void 0 : _a2.i18n) == null ? void 0 : _b2.locale;
const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
const defaultLocale = locales.find((locale) => locale.isDefault);
if (!doesLocaleExist && (defaultLocale == null ? void 0 : defaultLocale.code)) {
handleChange(defaultLocale.code, true);
}
}, [
hasI18n,
handleChange,
locales,
(_b = (_a = query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale
]);
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
return null;
}
const displayedLocales = locales.filter((locale) => {
return canCreate.includes(locale.code) || canRead.includes(locale.code);
});
return (0, import_jsx_runtime20.jsx)(SingleSelect, {
size: "S",
"aria-label": formatMessage({
id: getTranslation("actions.select-locale"),
defaultMessage: "Select locale"
}),
value: ((_d = (_c = query.plugins) == null ? void 0 : _c.i18n) == null ? void 0 : _d.locale) || ((_e = locales.find((locale) => locale.isDefault)) == null ? void 0 : _e.code),
// @ts-expect-error – This can be removed in V2 of the DS.
onChange: handleChange,
children: displayedLocales.map((locale) => (0, import_jsx_runtime20.jsx)(SingleSelectOption, {
value: locale.code,
children: locale.name
}, locale.id))
});
};
// node_modules/@strapi/i18n/dist/admin/contentManagerHooks/editView.mjs
var import_jsx_runtime21 = __toESM(require_jsx_runtime(), 1);
var React14 = __toESM(require_react(), 1);
var mutateEditViewHook = ({ layout }) => {
if (!("i18n" in layout.options) || typeof layout.options.i18n === "object" && layout.options.i18n !== null && "localized" in layout.options.i18n && !layout.options.i18n.localized) {
return {
layout
};
}
const components = Object.entries(layout.components).reduce((acc, [key, componentLayout]) => {
return {
...acc,
[key]: {
...componentLayout,
layout: componentLayout.layout.map((row) => row.map(addLabelActionToField))
}
};
}, {});
return {
layout: {
...layout,
components,
layout: layout.layout.map((panel) => panel.map((row) => row.map(addLabelActionToField)))
}
};
};
var addLabelActionToField = (field) => {
const isFieldLocalized = doesFieldHaveI18nPluginOpt(field.attribute.pluginOptions) ? field.attribute.pluginOptions.i18n.localized : true;
const labelActionProps = {
title: {
id: isFieldLocalized ? getTranslation("Field.localized") : getTranslation("Field.not-localized"),
defaultMessage: isFieldLocalized ? "This value is unique for the selected locale" : "This value is the same across all locales"
},
icon: isFieldLocalized ? (0, import_jsx_runtime21.jsx)(ForwardRef$3P, {}) : null
};
return {
...field,
labelAction: isFieldLocalized ? (0, import_jsx_runtime21.jsx)(LabelAction, {
...labelActionProps
}) : null
};
};
var doesFieldHaveI18nPluginOpt = (pluginOpts) => {
if (!pluginOpts) {
return false;
}
return "i18n" in pluginOpts && typeof pluginOpts.i18n === "object" && pluginOpts.i18n !== null && "localized" in pluginOpts.i18n;
};
var LabelAction = ({ title, icon }) => {
const { formatMessage } = useIntl();
return (0, import_jsx_runtime21.jsxs)(Span, {
tag: "span",
children: [
(0, import_jsx_runtime21.jsx)(VisuallyHidden, {
tag: "span",
children: formatMessage(title)
}),
React14.cloneElement(icon, {
"aria-hidden": true,
focusable: false
})
]
});
};
var Span = dt(Flex)`
svg {
width: 12px;
height: 12px;
fill: ${({ theme }) => theme.colors.neutral500};
path {
fill: ${({ theme }) => theme.colors.neutral500};
}
}
`;
// node_modules/@strapi/i18n/dist/admin/contentManagerHooks/listView.mjs
var import_jsx_runtime23 = __toESM(require_jsx_runtime(), 1);
// node_modules/@strapi/i18n/dist/admin/components/LocaleListCell.mjs
var import_jsx_runtime22 = __toESM(require_jsx_runtime(), 1);
var LocaleListCell = ({ locale: currentLocale, localizations }) => {
const { locale: language } = useIntl();
const { data: locales = [] } = useGetLocalesQuery();
const formatter = useCollator(language, {
sensitivity: "base"
});
if (!Array.isArray(locales) || !localizations) {
return null;
}
const availableLocales = localizations.map((loc) => loc.locale);
const localesForDocument = locales.reduce((acc, locale) => {
const createdLocale = [
currentLocale,
...availableLocales
].find((loc) => {
return loc === locale.code;
});
if (createdLocale) {
acc.push(locale);
}
return acc;
}, []).map((locale) => {
if (locale.isDefault) {
return `${locale.name} (default)`;
}
return locale.name;
}).toSorted((a, b) => formatter.compare(a, b));
return (0, import_jsx_runtime22.jsxs)(Popover.Root, {
children: [
(0, import_jsx_runtime22.jsx)(Popover.Trigger, {
children: (0, import_jsx_runtime22.jsx)(Button, {
variant: "ghost",
type: "button",
onClick: (e) => e.stopPropagation(),
children: (0, import_jsx_runtime22.jsxs)(Flex, {
minWidth: "100%",
alignItems: "center",
justifyContent: "center",
fontWeight: "regular",
children: [
(0, import_jsx_runtime22.jsx)(Typography, {
textColor: "neutral800",
ellipsis: true,
marginRight: 2,
children: localesForDocument.join(", ")
}),
(0, import_jsx_runtime22.jsx)(Flex, {
children: (0, import_jsx_runtime22.jsx)(ForwardRef$4T, {
width: "1.2rem",
height: "1.2rem"
})
})
]
})
})
}),
(0, import_jsx_runtime22.jsx)(Popover.Content, {
sideOffset: 16,
children: (0, import_jsx_runtime22.jsx)("ul", {
children: localesForDocument.map((name2) => (0, import_jsx_runtime22.jsx)(Box, {
padding: 3,
tag: "li",
children: (0, import_jsx_runtime22.jsx)(Typography, {
children: name2
})
}, name2))
})
})
]
});
};
// node_modules/@strapi/i18n/dist/admin/contentManagerHooks/listView.mjs
var addColumnToTableHook = ({ displayedHeaders, layout }) => {
const { options } = layout;
const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
if (!isFieldLocalized) {
return {
displayedHeaders,
layout
};
}
return {
displayedHeaders: [
...displayedHeaders,
{
attribute: {
type: "string"
},
label: {
id: getTranslation("list-view.table.header.label"),
defaultMessage: "Available in"
},
searchable: false,
sortable: false,
name: "locales",
// @ts-expect-error – ID is seen as number | string; this will change when we move the type over.
cellFormatter: (props, _header, meta) => (0, import_jsx_runtime23.jsx)(LocaleListCell, {
...props,
...meta
})
}
],
layout
};
};
// node_modules/@strapi/i18n/dist/admin/contentReleasesHooks/releaseDetailsView.mjs
var addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
return {
displayedHeaders: [
...displayedHeaders,
{
label: {
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
defaultMessage: "locale"
},
name: "locale"
}
],
hasI18nEnabled: true
};
};
// node_modules/@strapi/i18n/dist/admin/middlewares/extendCTBAttributeInitialData.mjs
var import_get2 = __toESM(require_get(), 1);
var extendCTBAttributeInitialDataMiddleware = () => {
return ({ getState }) => (next) => (action) => {
const enhanceAction = () => {
try {
const store = getState();
const hasi18nEnabled = (0, import_get2.default)(store, [
"content-type-builder_dataManagerProvider",
"modifiedData",
"contentType",
"schema",
"pluginOptions",
"i18n",
"localized"
], false);
if (hasi18nEnabled) {
const pluginOptions = action.options ? {
...action.options.pluginOptions,
i18n: {
localized: true
}
} : {
i18n: {
localized: true
}
};
return next({
...action,
options: {
pluginOptions
}
});
}
return next(action);
} catch (err) {
return next(action);
}
};
if (action.type === "ContentTypeBuilder/FormModal/SET_ATTRIBUTE_DATA_SCHEMA" && action.forTarget === "contentType" && ![
"relation",
"component"
].includes(action.attributeType) && !action.isEditing) {
return enhanceAction();
}
if (action.type === "ContentTypeBuilder/FormModal/SET_CUSTOM_FIELD_DATA_SCHEMA" && action.forTarget === "contentType" && !action.isEditing) {
return enhanceAction();
}
if ((action.type === "ContentTypeBuilder/FormModal/RESET_PROPS_AND_SET_FORM_FOR_ADDING_AN_EXISTING_COMPO" || action.type === "ContentTypeBuilder/FormModal/RESET_PROPS_AND_SAVE_CURRENT_DATA") && action.forTarget === "contentType") {
return enhanceAction();
}
return next(action);
};
};
// node_modules/@strapi/i18n/dist/admin/middlewares/extendCTBInitialData.mjs
var extendCTBInitialDataMiddleware = () => {
return () => (next) => (action) => {
var _a, _b;
if (action.type === "ContentTypeBuilder/FormModal/SET_DATA_TO_EDIT" && action.modalType === "contentType") {
const i18n = {
localized: false
};
const pluginOptions = action.data.pluginOptions ? {
...action.data.pluginOptions,
i18n
} : {
i18n
};
const data = {
...action.data,
pluginOptions
};
if (action.actionType === "create") {
return next({
...action,
data
});
}
if (!((_b = (_a = action.data.pluginOptions) == null ? void 0 : _a.i18n) == null ? void 0 : _b.localized)) {
return next({
...action,
data
});
}
}
return next(action);
};
};
// node_modules/@strapi/i18n/dist/admin/middlewares/rbac-middleware.mjs
var qs = __toESM(require_lib(), 1);
var localeMiddleware = (ctx) => (next) => (permissions) => {
const match = matchPath("/content-manager/:collectionType/:model?/:id", ctx.pathname);
if (!match) {
return next(permissions);
}
const search = qs.parse(ctx.search);
if (typeof search !== "object") {
return next(permissions);
}
if (!("plugins" in search && typeof search.plugins === "object")) {
return next(permissions);
}
if (!("i18n" in search.plugins && typeof search.plugins.i18n === "object" && !Array.isArray(search.plugins.i18n))) {
return next(permissions);
}
const { locale } = search.plugins.i18n;
if (typeof locale !== "string") {
return next(permissions);
}
const revisedPermissions = permissions.filter((permission) => {
var _a;
return !((_a = permission.properties) == null ? void 0 : _a.locales) || permission.properties.locales.includes(locale);
});
return next(revisedPermissions);
};
// node_modules/@strapi/i18n/dist/admin/utils/prefixPluginTranslations.mjs
var prefixPluginTranslations4 = (trad, pluginId5) => {
return Object.keys(trad).reduce((acc, current) => {
acc[`${pluginId5}.${current}`] = trad[current];
return acc;
}, {});
};
// node_modules/@strapi/i18n/dist/admin/utils/schemas.mjs
var import_omit = __toESM(require_omit(), 1);
var mutateCTBContentTypeSchema = (nextSchema, prevSchema) => {
var _a, _b;
if (!doesPluginOptionsHaveI18nLocalized(nextSchema.pluginOptions)) {
return nextSchema;
}
const isNextSchemaLocalized = nextSchema.pluginOptions.i18n.localized;
const isPrevSchemaLocalized = doesPluginOptionsHaveI18nLocalized((_a = prevSchema == null ? void 0 : prevSchema.schema) == null ? void 0 : _a.pluginOptions) ? (_b = prevSchema == null ? void 0 : prevSchema.schema) == null ? void 0 : _b.pluginOptions.i18n.localized : false;
if (isNextSchemaLocalized && isPrevSchemaLocalized) {
return nextSchema;
}
if (isNextSchemaLocalized) {
const attributes = addLocalisationToFields(nextSchema.attributes);
return {
...nextSchema,
attributes
};
}
if (!isNextSchemaLocalized) {
const pluginOptions = (0, import_omit.default)(nextSchema.pluginOptions, "i18n");
const attributes = disableAttributesLocalisation(nextSchema.attributes);
return {
...nextSchema,
pluginOptions,
attributes
};
}
return nextSchema;
};
var addLocalisationToFields = (attributes) => Object.keys(attributes).reduce((acc, current) => {
const currentAttribute = attributes[current];
if (LOCALIZED_FIELDS.includes(currentAttribute.type)) {
const i18n = {
localized: true
};
const pluginOptions = currentAttribute.pluginOptions ? {
...currentAttribute.pluginOptions,
i18n
} : {
i18n
};
acc[current] = {
...currentAttribute,
pluginOptions
};
return acc;
}
acc[current] = currentAttribute;
return acc;
}, {});
var disableAttributesLocalisation = (attributes) => Object.keys(attributes).reduce((acc, current) => {
acc[current] = (0, import_omit.default)(attributes[current], "pluginOptions.i18n");
return acc;
}, {});
// node_modules/@strapi/i18n/dist/admin/index.mjs
function __variableDynamicImportRuntime1__3(path) {
switch (path) {
case "./translations/de.json":
return import("./de.json-YTOGLXJI.js");
case "./translations/dk.json":
return import("./dk.json-72I6MEAZ.js");
case "./translations/en.json":
return import("./en.json-M6YDYHQC.js");
case "./translations/es.json":
return import("./es.json-NYTG6PJT.js");
case "./translations/fr.json":
return import("./fr.json-KOZ5KIZ5.js");
case "./translations/ko.json":
return import("./ko.json-7LNB7CNC.js");
case "./translations/pl.json":
return import("./pl.json-FYKDY6BQ.js");
case "./translations/ru.json":
return import("./ru.json-R3U5MBSO.js");
case "./translations/tr.json":
return import("./tr.json-HDJKSAL6.js");
case "./translations/uk.json":
return import("./uk.json-R5OQDKG4.js");
case "./translations/zh-Hans.json":
return import("./zh-Hans.json-JB5YZZP7.js");
case "./translations/zh.json":
return import("./zh.json-32A62ZT5.js");
default:
return new Promise(function(resolve, reject) {
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
reject.bind(null, new Error("Unknown variable dynamic import: " + path))
);
});
}
}
var index3 = {
register(app) {
app.addMiddlewares([
extendCTBAttributeInitialDataMiddleware,
extendCTBInitialDataMiddleware
]);
app.addMiddlewares([
() => i18nApi.middleware
]);
app.addReducers({
[i18nApi.reducerPath]: i18nApi.reducer
});
app.addRBACMiddleware([
localeMiddleware
]);
app.registerPlugin({
id: pluginId3,
name: pluginId3
});
},
bootstrap(app) {
app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
app.registerHook("Admin/CM/pages/EditView/mutate-edit-view-layout", mutateEditViewHook);
app.registerHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", addLocaleToReleasesHook);
app.addSettingsLink("global", {
intlLabel: {
id: getTranslation("plugin.name"),
defaultMessage: "Internationalization"
},
id: "internationalization",
to: "internationalization",
Component: () => import("./SettingsPage-VPRFRWWW.js").then((mod) => ({
default: mod.ProtectedSettingsPage
})),
permissions: PERMISSIONS4.accessMain
});
const contentManager = app.getPlugin("content-manager");
contentManager.apis.addDocumentHeaderAction([
LocalePickerAction,
FillFromAnotherLocaleAction
]);
contentManager.apis.addDocumentAction((actions) => {
const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
return actions;
});
contentManager.apis.addDocumentAction((actions) => {
actions.splice(2, 0, BulkLocalePublishAction);
actions.splice(5, 0, BulkLocaleUnpublishAction);
return actions;
});
contentManager.injectComponent("listView", "actions", {
name: "i18n-locale-filter",
Component: LocalePicker
});
contentManager.injectComponent("listView", "publishModalAdditionalInfos", {
name: "i18n-publish-bullets-in-modal",
Component: PublishModalAdditionalInfo
});
contentManager.injectComponent("listView", "unpublishModalAdditionalInfos", {
name: "i18n-unpublish-bullets-in-modal",
Component: UnpublishModalAdditionalInfo
});
contentManager.injectComponent("listView", "deleteModalAdditionalInfos", {
name: "i18n-delete-bullets-in-modal",
Component: DeleteModalAdditionalInfo
});
const ctbPlugin = app.getPlugin("content-type-builder");
if (ctbPlugin) {
const ctbFormsAPI = ctbPlugin.apis.forms;
ctbFormsAPI.addContentTypeSchemaMutation(mutateCTBContentTypeSchema);
ctbFormsAPI.components.add({
id: "checkboxConfirmation",
component: CheckboxConfirmation
});
ctbFormsAPI.extendContentType({
validator: () => ({
i18n: create3().shape({
localized: create()
})
}),
form: {
advanced() {
return [
{
name: "pluginOptions.i18n.localized",
description: {
id: getTranslation("plugin.schema.i18n.localized.description-content-type"),
defaultMessage: "Allows translating an entry into different languages"
},
type: "checkboxConfirmation",
intlLabel: {
id: getTranslation("plugin.schema.i18n.localized.label-content-type"),
defaultMessage: "Localization"
}
}
];
}
}
});
ctbFormsAPI.extendFields(LOCALIZED_FIELDS, {
form: {
advanced({ contentTypeSchema, forTarget, type, step }) {
if (forTarget !== "contentType") {
return [];
}
const hasI18nEnabled = (0, import_get3.default)(contentTypeSchema, [
"schema",
"pluginOptions",
"i18n",
"localized"
], false);
if (!hasI18nEnabled) {
return [];
}
if (type === "component" && step === "1") {
return [];
}
return [
{
name: "pluginOptions.i18n.localized",
description: {
id: getTranslation("plugin.schema.i18n.localized.description-field"),
defaultMessage: "The field can have different values in each locale"
},
type: "checkbox",
intlLabel: {
id: getTranslation("plugin.schema.i18n.localized.label-field"),
defaultMessage: "Enable localization for this field"
}
}
];
}
}
});
}
},
async registerTrads({ locales }) {
const importedTrads = await Promise.all(locales.map((locale) => {
return __variableDynamicImportRuntime1__3(`./translations/${locale}.json`).then(({ default: data }) => {
return {
data: prefixPluginTranslations4(data, pluginId3),
locale
};
}).catch(() => {
return {
data: {},
locale
};
});
}));
return Promise.resolve(importedTrads);
}
};
// node_modules/@strapi/content-releases/dist/admin/components/ReleaseAction.mjs
var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1);
var import_react4 = __toESM(require_react(), 1);
// node_modules/@strapi/content-releases/dist/admin/components/ReleaseActionModal.mjs
var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1);
var import_react3 = __toESM(require_react(), 1);
var RELEASE_ACTION_FORM_SCHEMA = create3().shape({
type: create2().oneOf([
"publish",
"unpublish"
]).required(),
releaseId: create2().required()
});
var INITIAL_VALUES = {
type: "publish",
releaseId: ""
};
var NoReleases = () => {
const { formatMessage } = useIntl();
return (0, import_jsx_runtime24.jsx)(EmptyStateLayout, {
icon: (0, import_jsx_runtime24.jsx)(ForwardRef$J, {
width: "16rem"
}),
content: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
defaultMessage: "No available releases. Open the list of releases and create a new one from there."
}),
action: (0, import_jsx_runtime24.jsx)(LinkButton, {
to: {
pathname: "/plugins/content-releases"
},
tag: Link,
variant: "secondary",
children: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
defaultMessage: "Open the list of releases"
})
}),
shadow: "none"
});
};
var AddActionToReleaseModal = ({ contentType, documentId, onInputChange, values }) => {
var _a, _b, _c;
const { formatMessage } = useIntl();
const [{ query }] = useQueryParams();
const locale = (_b = (_a = query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale;
const response = useGetReleasesForEntryQuery({
contentType,
entryDocumentId: documentId,
hasEntryAttached: false,
locale
});
const releases = (_c = response.data) == null ? void 0 : _c.data;
if ((releases == null ? void 0 : releases.length) === 0) {
return (0, import_jsx_runtime24.jsx)(NoReleases, {});
}
return (0, import_jsx_runtime24.jsxs)(Flex, {
direction: "column",
alignItems: "stretch",
gap: 2,
children: [
(0, import_jsx_runtime24.jsx)(Box, {
paddingBottom: 6,
children: (0, import_jsx_runtime24.jsxs)(Field.Root, {
required: true,
children: [
(0, import_jsx_runtime24.jsx)(Field.Label, {
children: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.select-label",
defaultMessage: "Select a release"
})
}),
(0, import_jsx_runtime24.jsx)(SingleSelect, {
required: true,
placeholder: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
defaultMessage: "Select"
}),
name: "releaseId",
onChange: (value) => onInputChange("releaseId", value),
value: values.releaseId,
children: releases == null ? void 0 : releases.map((release) => (0, import_jsx_runtime24.jsx)(SingleSelectOption, {
value: release.id,
children: release.name
}, release.id))
})
]
})
}),
(0, import_jsx_runtime24.jsx)(Field.Label, {
children: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
defaultMessage: "What do you want to do with this entry?"
})
}),
(0, import_jsx_runtime24.jsx)(ReleaseActionOptions, {
selected: values.type,
handleChange: (e) => onInputChange("type", e.target.value),
name: "type"
})
]
});
};
var ReleaseActionModalForm = ({ documentId, document, model, collectionType }) => {
var _a, _b;
const { formatMessage } = useIntl();
const { allowedActions } = useRBAC(PERMISSIONS5);
const { canCreateAction } = allowedActions;
const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
const { toggleNotification } = useNotification();
const { formatAPIError } = useAPIErrorHandler();
const [{ query }] = useQueryParams();
const locale = (_b = (_a = query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale;
const handleSubmit = async (e, onClose) => {
try {
await formik.handleSubmit(e);
onClose();
} catch (error) {
if (isFetchError(error)) {
toggleNotification({
type: "danger",
message: formatAPIError(error)
});
} else {
toggleNotification({
type: "danger",
message: formatMessage({
id: "notification.error",
defaultMessage: "An error occurred"
})
});
}
}
};
const formik = useFormik({
initialValues: INITIAL_VALUES,
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
onSubmit: async (values) => {
if (collectionType === "collection-types" && !documentId) {
throw new Error("Document id is required");
}
const response = await createReleaseAction({
body: {
type: values.type,
contentType: model,
entryDocumentId: documentId,
locale
},
params: {
releaseId: values.releaseId
}
});
if ("data" in response) {
toggleNotification({
type: "success",
message: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
defaultMessage: "Entry added to release"
})
});
return;
}
if ("error" in response) {
throw response.error;
}
}
});
const { edit: { options } } = useDocumentLayout(model);
if (!window.strapi.isEE || !(options == null ? void 0 : options.draftAndPublish) || !canCreateAction) {
return null;
}
if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
return null;
}
return {
label: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release",
defaultMessage: "Add to release"
}),
icon: (0, import_jsx_runtime24.jsx)(ForwardRef$1B, {}),
// Entry is creating so we don't want to allow adding it to a release
disabled: !document,
position: [
"panel",
"table-row"
],
dialog: {
type: "modal",
title: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release",
defaultMessage: "Add to release"
}),
content: (0, import_jsx_runtime24.jsx)(AddActionToReleaseModal, {
contentType: model,
documentId,
onInputChange: formik.setFieldValue,
values: formik.values
}),
footer: ({ onClose }) => (0, import_jsx_runtime24.jsxs)(Modal.Footer, {
children: [
(0, import_jsx_runtime24.jsx)(Button, {
onClick: onClose,
variant: "tertiary",
name: "cancel",
children: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
defaultMessage: "Cancel"
})
}),
(0, import_jsx_runtime24.jsx)(Button, {
type: "submit",
// @ts-expect-error - formik ReactEvent types don't match button onClick types as they expect a MouseEvent
onClick: (e) => handleSubmit(e, onClose),
disabled: !formik.values.releaseId,
loading: isLoading,
children: formatMessage({
id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
defaultMessage: "Continue"
})
})
]
})
}
};
};
// node_modules/@strapi/content-releases/dist/admin/components/ReleaseAction.mjs
var getContentPermissions = (subject) => {
const permissions = {
publish: [
{
action: "plugin::content-manager.explorer.publish",
subject,
id: "",
actionParameters: {},
properties: {},
conditions: []
}
]
};
return permissions;
};
var ReleaseAction = ({ documents, model }) => {
var _a;
const { formatMessage } = useIntl();
const { toggleNotification } = useNotification();
const { formatAPIError } = useAPIErrorHandler();
const [{ query }] = useQueryParams();
const contentPermissions = getContentPermissions(model);
const { allowedActions: { canPublish } } = useRBAC(contentPermissions);
const { allowedActions: { canCreate } } = useRBAC(PERMISSIONS5);
const response = useGetReleasesQuery();
const releases = (_a = response.data) == null ? void 0 : _a.data;
const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
const documentIds = documents.map((doc) => doc.documentId);
const handleSubmit = async (values) => {
var _a2, _b;
const locale = (_b = (_a2 = query.plugins) == null ? void 0 : _a2.i18n) == null ? void 0 : _b.locale;
const releaseActionEntries = documentIds.map((entryDocumentId) => ({
type: values.type,
contentType: model,
entryDocumentId,
locale
}));
const response2 = await createManyReleaseActions({
body: releaseActionEntries,
params: {
releaseId: values.releaseId
}
});
if ("data" in response2) {
const notificationMessage = formatMessage({
id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
}, {
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
totalEntries: response2.data.meta.totalEntries
});
const notification = {
type: "success",
title: formatMessage({
id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
defaultMessage: "Successfully added to release."
}, {
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
totalEntries: response2.data.meta.totalEntries
}),
message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
};
toggleNotification(notification);
return true;
}
if ("error" in response2) {
if (isFetchError(response2.error)) {
toggleNotification({
type: "warning",
message: formatAPIError(response2.error)
});
} else {
toggleNotification({
type: "warning",
message: formatMessage({
id: "notification.error",
defaultMessage: "An error occurred"
})
});
}
}
};
if (!canCreate || !canPublish) return null;
return {
actionType: "release",
variant: "tertiary",
label: formatMessage({
id: "content-manager-list-view.add-to-release",
defaultMessage: "Add to Release"
}),
dialog: {
type: "modal",
title: formatMessage({
id: "content-manager-list-view.add-to-release",
defaultMessage: "Add to Release"
}),
content: ({ onClose }) => {
return (0, import_jsx_runtime25.jsx)(Formik, {
onSubmit: async (values) => {
const data = await handleSubmit(values);
if (data) {
return onClose();
}
},
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
initialValues: INITIAL_VALUES,
children: ({ values, setFieldValue }) => (0, import_jsx_runtime25.jsxs)(Form, {
children: [
(releases == null ? void 0 : releases.length) === 0 ? (0, import_jsx_runtime25.jsx)(NoReleases, {}) : (0, import_jsx_runtime25.jsx)(Modal.Body, {
children: (0, import_jsx_runtime25.jsxs)(Flex, {
direction: "column",
alignItems: "stretch",
gap: 2,
children: [
(0, import_jsx_runtime25.jsx)(Box, {
paddingBottom: 6,
children: (0, import_jsx_runtime25.jsxs)(Field.Root, {
required: true,
children: [
(0, import_jsx_runtime25.jsx)(Field.Label, {
children: formatMessage({
id: "content-releases.content-manager-list-view.add-to-release.select-label",
defaultMessage: "Select a release"
})
}),
(0, import_jsx_runtime25.jsx)(SingleSelect, {
placeholder: formatMessage({
id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
defaultMessage: "Select"
}),
onChange: (value) => setFieldValue("releaseId", value),
value: values.releaseId,
children: releases == null ? void 0 : releases.map((release) => (0, import_jsx_runtime25.jsx)(SingleSelectOption, {
value: release.id,
children: release.name
}, release.id))
})
]
})
}),
(0, import_jsx_runtime25.jsx)(Field.Label, {
children: formatMessage({
id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
defaultMessage: "What do you want to do with these entries?"
})
}),
(0, import_jsx_runtime25.jsx)(ReleaseActionOptions, {
selected: values.type,
handleChange: (e) => setFieldValue("type", e.target.value),
name: "type"
})
]
})
}),
(0, import_jsx_runtime25.jsxs)(Modal.Footer, {
children: [
(0, import_jsx_runtime25.jsx)(Button, {
onClick: onClose,
variant: "tertiary",
name: "cancel",
children: formatMessage({
id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
defaultMessage: "Cancel"
})
}),
(0, import_jsx_runtime25.jsx)(Button, {
type: "submit",
disabled: !values.releaseId,
loading: isLoading,
children: formatMessage({
id: "content-releases.content-manager-list-view.add-to-release.continue-button",
defaultMessage: "Continue"
})
})
]
})
]
})
});
}
}
};
};
// node_modules/@strapi/content-releases/dist/admin/components/ReleaseListCell.mjs
var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1);
var import_react5 = __toESM(require_react(), 1);
var useReleasesList = (contentTypeUid, documentId) => {
var _a, _b;
const listViewData = useTable("ListView", (state) => state.rows);
const documentIds = listViewData.map((entry) => entry.documentId);
const [{ query }] = useQueryParams();
const locale = ((_b = (_a = query == null ? void 0 : query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale) || void 0;
const response = useGetMappedEntriesInReleasesQuery({
contentTypeUid,
documentIds,
locale
}, {
skip: !documentIds || !contentTypeUid || documentIds.length === 0
});
const mappedEntriesInReleases = response.data || {};
return (mappedEntriesInReleases == null ? void 0 : mappedEntriesInReleases[documentId]) || [];
};
var addColumnToTableHook2 = ({ displayedHeaders, layout }) => {
const { options } = layout;
if (!(options == null ? void 0 : options.draftAndPublish)) {
return {
displayedHeaders,
layout
};
}
return {
displayedHeaders: [
...displayedHeaders,
{
searchable: false,
sortable: false,
name: "releases",
label: {
id: "content-releases.content-manager.list-view.releases.header",
defaultMessage: "To be released in"
},
cellFormatter: (props, _, { model }) => (0, import_jsx_runtime26.jsx)(ReleaseListCell, {
...props,
model
})
}
],
layout
};
};
var ReleaseListCell = ({ documentId, model }) => {
const releases = useReleasesList(model, documentId);
const { formatMessage } = useIntl();
return (0, import_jsx_runtime26.jsxs)(Popover.Root, {
children: [
(0, import_jsx_runtime26.jsx)(Popover.Trigger, {
children: (0, import_jsx_runtime26.jsx)(Button, {
variant: "ghost",
onClick: (e) => e.stopPropagation(),
// TODO: find a way in the DS to define the widht and height of the icon
endIcon: releases.length > 0 ? (0, import_jsx_runtime26.jsx)(ForwardRef$4T, {
width: "1.2rem",
height: "1.2rem"
}) : null,
children: (0, import_jsx_runtime26.jsx)(Typography, {
style: {
maxWidth: "252px",
cursor: "pointer"
},
textColor: "neutral800",
fontWeight: "regular",
children: releases.length > 0 ? formatMessage({
id: "content-releases.content-manager.list-view.releases-number",
defaultMessage: "{number} {number, plural, one {release} other {releases}}"
}, {
number: releases.length
}) : "-"
})
})
}),
(0, import_jsx_runtime26.jsx)(Popover.Content, {
children: (0, import_jsx_runtime26.jsx)("ul", {
children: releases.map(({ id, name: name2 }) => (0, import_jsx_runtime26.jsx)(Box, {
padding: 3,
tag: "li",
children: (0, import_jsx_runtime26.jsx)(Link2, {
href: `/admin/plugins/content-releases/${id}`,
isExternal: false,
children: name2
})
}, id))
})
})
]
});
};
// node_modules/@strapi/content-releases/dist/admin/components/ReleasesPanel.mjs
var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
var Panel = ({ model, document, documentId, collectionType }) => {
var _a, _b, _c;
const [{ query }] = useQueryParams();
const locale = (_b = (_a = query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale;
const { edit: { options } } = useDocumentLayout(model);
const { formatMessage, formatDate, formatTime } = useIntl();
const { allowedActions } = useRBAC(PERMISSIONS5);
const { canRead, canDeleteAction } = allowedActions;
const response = useGetReleasesForEntryQuery({
contentType: model,
entryDocumentId: documentId,
locale,
hasEntryAttached: true
}, {
skip: !document
});
const releases = (_c = response.data) == null ? void 0 : _c.data;
const getReleaseColorVariant = (actionType, shade) => {
if (actionType === "unpublish") {
return `secondary${shade}`;
}
return `success${shade}`;
};
if (!window.strapi.isEE || !(options == null ? void 0 : options.draftAndPublish) || !canRead) {
return null;
}
if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
return null;
}
if (!releases || releases.length === 0) {
return null;
}
return {
title: formatMessage({
id: "content-releases.plugin.name",
defaultMessage: "Releases"
}),
content: (0, import_jsx_runtime27.jsx)(Flex, {
direction: "column",
alignItems: "stretch",
gap: 3,
width: "100%",
children: releases == null ? void 0 : releases.map((release) => (0, import_jsx_runtime27.jsxs)(Flex, {
direction: "column",
alignItems: "start",
borderWidth: "1px",
borderStyle: "solid",
borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
overflow: "hidden",
hasRadius: true,
children: [
(0, import_jsx_runtime27.jsx)(Box, {
paddingTop: 3,
paddingBottom: 3,
paddingLeft: 4,
paddingRight: 4,
background: getReleaseColorVariant(release.actions[0].type, "100"),
width: "100%",
children: (0, import_jsx_runtime27.jsx)(Typography, {
fontSize: 1,
variant: "pi",
textColor: getReleaseColorVariant(release.actions[0].type, "600"),
children: formatMessage({
id: "content-releases.content-manager-edit-view.list-releases.title",
defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
}, {
isPublish: release.actions[0].type === "publish"
})
})
}),
(0, import_jsx_runtime27.jsxs)(Flex, {
padding: 4,
direction: "column",
gap: 2,
width: "100%",
alignItems: "flex-start",
children: [
(0, import_jsx_runtime27.jsx)(Typography, {
fontSize: 2,
fontWeight: "bold",
variant: "omega",
textColor: "neutral700",
children: release.name
}),
release.scheduledAt && release.timezone && (0, import_jsx_runtime27.jsx)(Typography, {
variant: "pi",
textColor: "neutral600",
children: formatMessage({
id: "content-releases.content-manager-edit-view.scheduled.date",
defaultMessage: "{date} at {time} ({offset})"
}, {
date: formatDate(new Date(release.scheduledAt), {
day: "2-digit",
month: "2-digit",
year: "numeric",
timeZone: release.timezone
}),
time: formatTime(new Date(release.scheduledAt), {
hourCycle: "h23",
timeZone: release.timezone
}),
offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
})
}),
canDeleteAction ? (0, import_jsx_runtime27.jsxs)(ReleaseActionMenu.Root, {
hasTriggerBorder: true,
children: [
(0, import_jsx_runtime27.jsx)(ReleaseActionMenu.EditReleaseItem, {
releaseId: release.id
}),
(0, import_jsx_runtime27.jsx)(ReleaseActionMenu.DeleteReleaseActionItem, {
releaseId: release.id,
actionId: release.actions[0].id
})
]
}) : null
]
})
]
}, release.id))
})
};
};
// node_modules/@strapi/content-releases/dist/admin/utils/prefixPluginTranslations.mjs
var prefixPluginTranslations5 = (trad, pluginId5) => {
return Object.keys(trad).reduce((acc, current) => {
acc[`${pluginId5}.${current}`] = trad[current];
return acc;
}, {});
};
// node_modules/@strapi/content-releases/dist/admin/index.mjs
function __variableDynamicImportRuntime3__(path) {
switch (path) {
case "./translations/en.json":
return import("./en.json-5ZS55JRN.js");
case "./translations/uk.json":
return import("./uk.json-R7E67MQ6.js");
default:
return new Promise(function(resolve, reject) {
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
reject.bind(null, new Error("Unknown variable dynamic import: " + path))
);
});
}
}
var admin3 = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
register(app) {
var _a, _b;
app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
if (window.strapi.features.isEnabled("cms-content-releases")) {
app.addMenuLink({
to: `plugins/${pluginId4}`,
icon: ForwardRef$1B,
intlLabel: {
id: `${pluginId4}.plugin.name`,
defaultMessage: "Releases"
},
Component: () => import("./App-XU5HKBHI.js").then((mod) => ({
default: mod.App
})),
permissions: PERMISSIONS5.main,
position: 2
});
const contentManagerPluginApis = app.getPlugin("content-manager").apis;
if ("addEditViewSidePanel" in contentManagerPluginApis && typeof contentManagerPluginApis.addEditViewSidePanel === "function") {
contentManagerPluginApis.addEditViewSidePanel([
Panel
]);
}
if ("addDocumentAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addDocumentAction === "function") {
contentManagerPluginApis.addDocumentAction((actions) => {
const indexOfDeleteAction = actions.findIndex((action) => action.type === "unpublish");
actions.splice(indexOfDeleteAction, 0, ReleaseActionModalForm);
return actions;
});
}
app.addSettingsLink("global", {
id: pluginId4,
to: "releases",
intlLabel: {
id: `${pluginId4}.plugin.name`,
defaultMessage: "Releases"
},
permissions: [],
async Component() {
const { ProtectedReleasesSettingsPage } = await import("./ReleasesSettingsPage-CZCSJTDR.js");
return {
default: ProtectedReleasesSettingsPage
};
}
});
if ("addBulkAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addBulkAction === "function") {
contentManagerPluginApis.addBulkAction((actions) => {
const deleteActionIndex = actions.findIndex((action) => action.type === "delete");
actions.splice(deleteActionIndex, 0, ReleaseAction);
return actions;
});
}
app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook2);
} else if (!window.strapi.features.isEnabled("cms-content-releases") && ((_b = (_a = window.strapi) == null ? void 0 : _a.flags) == null ? void 0 : _b.promoteEE)) {
app.addSettingsLink("global", {
id: pluginId4,
to: "/plugins/purchase-content-releases",
intlLabel: {
id: `${pluginId4}.plugin.name`,
defaultMessage: "Releases"
},
permissions: [],
async Component() {
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-MRAQG65C.js");
return {
default: PurchaseContentReleases
};
},
licenseOnly: true
});
}
},
async registerTrads({ locales }) {
const importedTrads = await Promise.all(locales.map((locale) => {
return __variableDynamicImportRuntime3__(`./translations/${locale}.json`).then(({ default: data }) => {
return {
data: prefixPluginTranslations5(data, "content-releases"),
locale
};
}).catch(() => {
return {
data: {},
locale
};
});
}));
return Promise.resolve(importedTrads);
}
};
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/id/components/Header.mjs
var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1);
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.mjs
var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
var React15 = __toESM(require_react(), 1);
// node_modules/@strapi/review-workflows/dist/admin/utils/users.mjs
var getDisplayName = ({ firstname, lastname, username, email } = {}) => {
if (username) {
return username;
}
if (firstname) {
return `${firstname} ${lastname ?? ""}`.trim();
}
return email ?? "";
};
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/id/components/constants.mjs
var STAGE_ATTRIBUTE_NAME = "strapi_stage";
var ASSIGNEE_ATTRIBUTE_NAME = "strapi_assignee";
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.mjs
var AssigneeSelect = ({ isCompact }) => {
var _a;
const { collectionType = "", id, slug: model = "" } = useParams();
const permissions = useTypedSelector((state) => state.admin_app.permissions);
const { formatMessage } = useIntl();
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
const { toggleNotification } = useNotification();
const { allowedActions: { canRead }, isLoading: isLoadingPermissions } = useRBAC((_a = permissions.settings) == null ? void 0 : _a.users);
const [{ query }] = useQueryParams();
const params = React15.useMemo(() => buildValidParams2(query), [
query
]);
const { data, isLoading: isLoadingUsers, isError } = useAdminUsers(void 0, {
skip: isLoadingPermissions || !canRead
});
const { document } = useDocument({
collectionType,
model,
documentId: id
}, {
skip: !id && collectionType !== "single-types"
});
const users = (data == null ? void 0 : data.users) || [];
const currentAssignee = document ? document[ASSIGNEE_ATTRIBUTE_NAME] : null;
const [updateAssignee, { error, isLoading: isMutating }] = useUpdateAssigneeMutation();
if (!collectionType || !model || !(document == null ? void 0 : document.documentId)) {
return null;
}
const handleChange = async (assigneeId) => {
if ((currentAssignee == null ? void 0 : currentAssignee.id) === assigneeId) {
return;
}
const res = await updateAssignee({
slug: collectionType,
model,
id: document.documentId,
params,
data: {
id: assigneeId ? parseInt(assigneeId, 10) : null
}
});
if ("data" in res) {
toggleNotification({
type: "success",
message: formatMessage({
id: "content-manager.reviewWorkflows.assignee.notification.saved",
defaultMessage: "Assignee updated"
})
});
}
if (isCompact && "error" in res) {
toggleNotification({
type: "danger",
message: formatAPIError(res.error)
});
}
};
const isDisabled = !isLoadingPermissions && !isLoadingUsers && users.length === 0 || !document.documentId;
const isLoading = isLoadingUsers || isLoadingPermissions || isMutating;
const assigneeLabel = formatMessage({
id: "content-manager.reviewWorkflows.assignee.label",
defaultMessage: "Assignee"
});
const assigneeClearLabel = formatMessage({
id: "content-manager.reviewWorkflows.assignee.clear",
defaultMessage: "Clear assignee"
});
const assigneePlaceholder = formatMessage({
id: "content-manager.reviewWorkflows.assignee.placeholder",
defaultMessage: "Select…"
});
if (isCompact) {
return (0, import_jsx_runtime28.jsxs)(Field.Root, {
name: ASSIGNEE_ATTRIBUTE_NAME,
id: ASSIGNEE_ATTRIBUTE_NAME,
children: [
(0, import_jsx_runtime28.jsx)(VisuallyHidden, {
children: (0, import_jsx_runtime28.jsx)(Field.Label, {
children: assigneeLabel
})
}),
(0, import_jsx_runtime28.jsx)(Combobox, {
clearLabel: assigneeClearLabel,
disabled: isDisabled,
value: currentAssignee ? currentAssignee.id.toString() : null,
onChange: handleChange,
onClear: () => handleChange(null),
placeholder: assigneePlaceholder,
loading: isLoading || isLoadingPermissions || isMutating,
size: "S",
children: users.map((user) => {
return (0, import_jsx_runtime28.jsx)(Option, {
value: user.id.toString(),
textValue: getDisplayName(user),
children: getDisplayName(user)
}, user.id);
})
})
]
});
}
return (0, import_jsx_runtime28.jsxs)(Field.Root, {
name: ASSIGNEE_ATTRIBUTE_NAME,
id: ASSIGNEE_ATTRIBUTE_NAME,
error: (isError && canRead && formatMessage({
id: "content-manager.reviewWorkflows.assignee.error",
defaultMessage: "An error occurred while fetching users"
}) || error && formatAPIError(error)) ?? void 0,
children: [
(0, import_jsx_runtime28.jsx)(Field.Label, {
children: assigneeLabel
}),
(0, import_jsx_runtime28.jsx)(Combobox, {
clearLabel: assigneeClearLabel,
disabled: !isLoadingPermissions && !isLoading && users.length === 0 || !document.documentId,
value: currentAssignee ? currentAssignee.id.toString() : null,
onChange: handleChange,
onClear: () => handleChange(null),
placeholder: assigneePlaceholder,
loading: isLoading || isLoadingPermissions || isMutating,
children: users.map((user) => {
return (0, import_jsx_runtime28.jsx)(Option, {
value: user.id.toString(),
textValue: getDisplayName(user),
children: getDisplayName(user)
}, user.id);
})
}),
(0, import_jsx_runtime28.jsx)(Field.Error, {})
]
});
};
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/id/components/StageSelect.mjs
var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1);
var React16 = __toESM(require_react(), 1);
var WorkflowLimitModal = ({ open, onOpenChange }) => {
const { formatMessage } = useIntl();
return (0, import_jsx_runtime29.jsxs)(LimitsModal.Root, {
open,
onOpenChange,
children: [
(0, import_jsx_runtime29.jsx)(LimitsModal.Title, {
children: formatMessage({
id: "content-manager.reviewWorkflows.workflows.limit.title",
defaultMessage: "You’ve reached the limit of workflows in your plan"
})
}),
(0, import_jsx_runtime29.jsx)(LimitsModal.Body, {
children: formatMessage({
id: "content-manager.reviewWorkflows.workflows.limit.body",
defaultMessage: "Delete a workflow or contact Sales to enable more workflows."
})
})
]
});
};
var StageLimitModal = ({ open, onOpenChange }) => {
const { formatMessage } = useIntl();
return (0, import_jsx_runtime29.jsxs)(LimitsModal.Root, {
open,
onOpenChange,
children: [
(0, import_jsx_runtime29.jsx)(LimitsModal.Title, {
children: formatMessage({
id: "content-manager.reviewWorkflows.stages.limit.title",
defaultMessage: "You have reached the limit of stages for this workflow in your plan"
})
}),
(0, import_jsx_runtime29.jsx)(LimitsModal.Body, {
children: formatMessage({
id: "content-manager.reviewWorkflows.stages.limit.body",
defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
})
})
]
});
};
var Select = ({ stages, activeWorkflowStage, isLoading, ...props }) => {
const { formatMessage } = useIntl();
const { themeColorName } = getStageColorByHex(activeWorkflowStage == null ? void 0 : activeWorkflowStage.color) ?? {};
return (0, import_jsx_runtime29.jsx)(SingleSelect, {
disabled: stages.length === 0,
placeholder: formatMessage({
id: "content-manager.reviewWorkflows.assignee.placeholder",
defaultMessage: "Select…"
}),
startIcon: activeWorkflowStage && (0, import_jsx_runtime29.jsx)(Flex, {
tag: "span",
height: 2,
background: activeWorkflowStage == null ? void 0 : activeWorkflowStage.color,
borderColor: themeColorName === "neutral0" ? "neutral150" : void 0,
hasRadius: true,
shrink: 0,
width: 2,
marginRight: "-3px"
}),
// @ts-expect-error – `customizeContent` is not correctly typed in the DS.
customizeContent: () => {
return (0, import_jsx_runtime29.jsxs)(Flex, {
tag: "span",
justifyContent: "space-between",
alignItems: "center",
width: "100%",
children: [
(0, import_jsx_runtime29.jsx)(Typography, {
textColor: "neutral800",
ellipsis: true,
lineHeight: "inherit",
children: (activeWorkflowStage == null ? void 0 : activeWorkflowStage.name) ?? ""
}),
isLoading ? (0, import_jsx_runtime29.jsx)(Loader, {
small: true,
style: {
display: "flex"
},
"data-testid": "loader"
}) : null
]
});
},
...props,
children: stages.map(({ id, color, name: name2 }) => {
const { themeColorName: themeColorName2 } = getStageColorByHex(color) ?? {};
return (0, import_jsx_runtime29.jsx)(SingleSelectOption, {
startIcon: (0, import_jsx_runtime29.jsx)(Flex, {
height: 2,
background: color,
borderColor: themeColorName2 === "neutral0" ? "neutral150" : void 0,
hasRadius: true,
shrink: 0,
width: 2
}),
value: id,
textValue: name2,
children: name2
}, id);
})
});
};
var StageSelect = ({ isCompact }) => {
const { collectionType = "", slug: model = "", id = "" } = useParams();
const { formatMessage } = useIntl();
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
const { toggleNotification } = useNotification();
const [{ query }] = useQueryParams();
const params = React16.useMemo(() => buildValidParams2(query), [
query
]);
const { document, isLoading: isLoadingDocument } = useDocument({
collectionType,
model,
documentId: id
}, {
skip: !id && collectionType !== "single-types"
});
const { data, isLoading: isLoadingStages } = useGetStagesQuery({
slug: collectionType,
model,
// @ts-expect-error – `id` is not correctly typed in the DS.
id: document == null ? void 0 : document.documentId,
params
}, {
skip: !(document == null ? void 0 : document.documentId)
});
const { meta, stages = [] } = data ?? {};
const { getFeature } = useLicenseLimits();
const [showLimitModal, setShowLimitModal] = React16.useState(null);
const limits = getFeature("review-workflows") ?? {};
const activeWorkflowStage = document ? document[STAGE_ATTRIBUTE_NAME] : null;
const [updateStage, { error }] = useUpdateStageMutation();
const handleChange = async (stageId) => {
try {
if ((limits == null ? void 0 : limits[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME]) && parseInt(limits[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME], 10) < ((meta == null ? void 0 : meta.workflowCount) ?? 0)) {
setShowLimitModal("workflow");
} else if ((limits == null ? void 0 : limits[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME]) && parseInt(limits[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME], 10) < stages.length) {
setShowLimitModal("stage");
} else {
if (document == null ? void 0 : document.documentId) {
const res = await updateStage({
model,
id: document.documentId,
slug: collectionType,
params,
data: {
id: stageId
}
});
if ("data" in res) {
toggleNotification({
type: "success",
message: formatMessage({
id: "content-manager.reviewWorkflows.stage.notification.saved",
defaultMessage: "Review stage updated"
})
});
}
if (isCompact && "error" in res) {
toggleNotification({
type: "danger",
message: formatAPIError(res.error)
});
}
}
}
} catch (error2) {
toggleNotification({
type: "danger",
message: formatMessage({
id: "content-manager.reviewWorkflows.stage.notification.error",
defaultMessage: "An error occurred while updating the review stage"
})
});
}
};
const isLoading = isLoadingStages || isLoadingDocument;
const reviewStageLabel = formatMessage({
id: "content-manager.reviewWorkflows.stage.label",
defaultMessage: "Review stage"
});
const reviewStageHint = !isLoading && stages.length === 0 && // TODO: Handle errors and hints
formatMessage({
id: "content-manager.reviewWorkflows.stages.no-transition",
defaultMessage: "You don’t have the permission to update this stage."
});
if (isCompact) {
return (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, {
children: [
(0, import_jsx_runtime29.jsx)(TooltipImpl, {
label: reviewStageHint,
children: (0, import_jsx_runtime29.jsx)(Field.Root, {
name: STAGE_ATTRIBUTE_NAME,
id: STAGE_ATTRIBUTE_NAME,
children: (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, {
children: [
(0, import_jsx_runtime29.jsx)(VisuallyHidden, {
children: (0, import_jsx_runtime29.jsx)(Field.Label, {
children: reviewStageLabel
})
}),
(0, import_jsx_runtime29.jsx)(Select, {
stages,
activeWorkflowStage,
isLoading,
size: "S",
disabled: stages.length === 0,
value: activeWorkflowStage == null ? void 0 : activeWorkflowStage.id,
onChange: handleChange,
placeholder: formatMessage({
id: "content-manager.reviewWorkflows.assignee.placeholder",
defaultMessage: "Select…"
})
})
]
})
})
}),
(0, import_jsx_runtime29.jsx)(WorkflowLimitModal, {
open: showLimitModal === "workflow",
onOpenChange: () => setShowLimitModal(null)
}),
(0, import_jsx_runtime29.jsx)(StageLimitModal, {
open: showLimitModal === "stage",
onOpenChange: () => setShowLimitModal(null)
})
]
});
}
return (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, {
children: [
(0, import_jsx_runtime29.jsxs)(Field.Root, {
hint: reviewStageHint,
error: error && formatAPIError(error) || void 0,
name: STAGE_ATTRIBUTE_NAME,
id: STAGE_ATTRIBUTE_NAME,
children: [
(0, import_jsx_runtime29.jsx)(Field.Label, {
children: reviewStageLabel
}),
(0, import_jsx_runtime29.jsx)(Select, {
stages,
activeWorkflowStage,
isLoading,
disabled: stages.length === 0,
value: activeWorkflowStage == null ? void 0 : activeWorkflowStage.id,
onChange: handleChange,
placeholder: formatMessage({
id: "content-manager.reviewWorkflows.assignee.placeholder",
defaultMessage: "Select…"
})
}),
(0, import_jsx_runtime29.jsx)(Field.Hint, {}),
(0, import_jsx_runtime29.jsx)(Field.Error, {})
]
}),
(0, import_jsx_runtime29.jsx)(WorkflowLimitModal, {
open: showLimitModal === "workflow",
onOpenChange: () => setShowLimitModal(null)
}),
(0, import_jsx_runtime29.jsx)(StageLimitModal, {
open: showLimitModal === "stage",
onOpenChange: () => setShowLimitModal(null)
})
]
});
};
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/id/components/Header.mjs
var Header = () => {
const { slug = "", id, collectionType } = useParams();
const { edit: { options } } = useDocumentLayout(slug);
if (!window.strapi.isEE || !(options == null ? void 0 : options.reviewWorkflows) || collectionType !== "single-types" && !id || id === "create") {
return null;
}
return (0, import_jsx_runtime30.jsxs)(Flex, {
gap: 2,
children: [
(0, import_jsx_runtime30.jsx)(AssigneeSelect, {
isCompact: true
}),
(0, import_jsx_runtime30.jsx)(StageSelect, {
isCompact: true
})
]
});
};
Header.type = "preview";
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/id/components/Panel.mjs
var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1);
var Panel2 = () => {
const { slug = "", id, collectionType } = useParams();
const { edit: { options } } = useDocumentLayout(slug);
const { formatMessage } = useIntl();
if (!window.strapi.isEE || !(options == null ? void 0 : options.reviewWorkflows) || collectionType !== "single-types" && !id || id === "create") {
return null;
}
return {
title: formatMessage({
id: "content-manager.containers.edit.panels.review-workflows.title",
defaultMessage: "Review Workflows"
}),
content: (0, import_jsx_runtime31.jsxs)(Flex, {
direction: "column",
gap: 2,
alignItems: "stretch",
width: "100%",
children: [
(0, import_jsx_runtime31.jsx)(AssigneeSelect, {}),
(0, import_jsx_runtime31.jsx)(StageSelect, {})
]
})
};
};
Panel2.type = "review-workflows";
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/constants.mjs
var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1);
var import_react6 = __toESM(require_react(), 1);
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/components/TableColumns.mjs
var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
var StageColumn = (props) => {
const { color = STAGE_COLOR_DEFAULT, name: name2 } = props.strapi_stage ?? {};
const { themeColorName } = getStageColorByHex(color) ?? {};
return (0, import_jsx_runtime32.jsxs)(Flex, {
alignItems: "center",
gap: 2,
maxWidth: "30rem",
children: [
(0, import_jsx_runtime32.jsx)(Box, {
height: 2,
background: color,
borderColor: themeColorName === "neutral0" ? "neutral150" : void 0,
hasRadius: true,
shrink: 0,
width: 2
}),
(0, import_jsx_runtime32.jsx)(Typography, {
fontWeight: "regular",
textColor: "neutral700",
ellipsis: true,
children: name2
})
]
});
};
var AssigneeColumn = (props) => {
const { strapi_assignee: user } = props;
return (0, import_jsx_runtime32.jsx)(Typography, {
textColor: "neutral800",
children: user ? getDisplayName(user) : "-"
});
};
// node_modules/@strapi/review-workflows/dist/admin/routes/content-manager/model/constants.mjs
var REVIEW_WORKFLOW_COLUMNS = [
{
name: STAGE_ATTRIBUTE_NAME,
attribute: {
type: "relation",
relation: "oneToMany",
target: "admin::review-workflow-stage"
},
label: {
id: "review-workflows.containers.list.table-headers.reviewWorkflows.stage",
defaultMessage: "Review stage"
},
searchable: false,
sortable: true,
mainField: {
name: "name",
type: "string"
},
cellFormatter: (props) => (0, import_jsx_runtime33.jsx)(StageColumn, {
...props
})
},
{
name: ASSIGNEE_ATTRIBUTE_NAME,
attribute: {
type: "relation",
target: "admin::user",
relation: "oneToMany"
},
label: {
id: "review-workflows.containers.list.table-headers.reviewWorkflows.assignee",
defaultMessage: "Assignee"
},
searchable: false,
sortable: true,
mainField: {
name: "firstname",
type: "string"
},
cellFormatter: (props) => (0, import_jsx_runtime33.jsx)(AssigneeColumn, {
...props
})
}
];
// node_modules/@strapi/review-workflows/dist/admin/utils/cm-hooks.mjs
var addColumnToTableHook3 = ({ displayedHeaders, layout }) => {
const { options } = layout;
if (!options.reviewWorkflows) {
return {
displayedHeaders,
layout
};
}
return {
displayedHeaders: [
...displayedHeaders,
...REVIEW_WORKFLOW_COLUMNS
],
layout
};
};
// node_modules/@strapi/review-workflows/dist/admin/utils/translations.mjs
var prefixPluginTranslations6 = (trad, pluginId5) => {
return Object.keys(trad).reduce((acc, current) => {
acc[`${pluginId5}.${current}`] = trad[current];
return acc;
}, {});
};
// node_modules/@strapi/review-workflows/dist/admin/index.mjs
function __variableDynamicImportRuntime2__2(path) {
switch (path) {
case "./translations/en.json":
return import("./en.json-ACWIBMGZ.js");
case "./translations/uk.json":
return import("./uk.json-AEVQXBJA.js");
default:
return new Promise(function(resolve, reject) {
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
reject.bind(null, new Error("Unknown variable dynamic import: " + path))
);
});
}
}
var admin4 = {
register(app) {
var _a, _b;
if (window.strapi.features.isEnabled(FEATURE_ID)) {
app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook3);
const contentManagerPluginApis = app.getPlugin("content-manager").apis;
if ("addEditViewSidePanel" in contentManagerPluginApis && typeof contentManagerPluginApis.addEditViewSidePanel === "function") {
contentManagerPluginApis.addEditViewSidePanel([
Panel2
]);
}
app.addSettingsLink("global", {
id: PLUGIN_ID,
to: `review-workflows`,
intlLabel: {
id: `${PLUGIN_ID}.plugin.name`,
defaultMessage: "Review Workflows"
},
permissions: [],
async Component() {
const { Router } = await import("./router-SO7MOG4C.js");
return {
default: Router
};
}
});
} else if (!window.strapi.features.isEnabled(FEATURE_ID) && ((_b = (_a = window.strapi) == null ? void 0 : _a.flags) == null ? void 0 : _b.promoteEE)) {
app.addSettingsLink("global", {
id: PLUGIN_ID,
to: `purchase-review-workflows`,
intlLabel: {
id: `${PLUGIN_ID}.plugin.name`,
defaultMessage: "Review Workflows"
},
licenseOnly: true,
permissions: [],
async Component() {
const { PurchaseReviewWorkflows } = await import("./purchase-review-workflows-NMDWJIC4.js");
return {
default: PurchaseReviewWorkflows
};
}
});
}
},
bootstrap(app) {
if (window.strapi.features.isEnabled(FEATURE_ID)) {
app.getPlugin("content-manager").injectComponent("preview", "actions", {
name: "review-workflows-assignee",
Component: Header
});
}
},
async registerTrads({ locales }) {
const importedTrads = await Promise.all(locales.map((locale) => {
return __variableDynamicImportRuntime2__2(`./translations/${locale}.json`).then(({ default: data }) => {
return {
data: prefixPluginTranslations6(data, PLUGIN_ID),
locale
};
}).catch(() => {
return {
data: {},
locale
};
});
}));
return Promise.resolve(importedTrads);
}
};
// node_modules/@strapi/strapi/dist/admin.mjs
var render = (mountNode, { plugins, ...restArgs }) => {
return renderAdmin(mountNode, {
...restArgs,
plugins: {
"content-manager": index,
"content-type-builder": index2,
email: admin,
upload: admin2,
contentReleases: admin3,
i18n: index3,
reviewWorkflows: admin4,
...plugins
}
});
};
export {
render
};
//# sourceMappingURL=chunk-AOWI4JYR.js.map