Files
pole-book/server/node_modules/.strapi/vite/deps/ListViewPage-2E4R5QGQ.js

1297 lines
40 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
useTypedSelector
} from "./chunk-VE2D6HMA.js";
import {
BulkActionsRenderer,
TableActions
} from "./chunk-MLTBQQQV.js";
import {
DocumentRBAC,
InjectionZone,
PERMISSIONS,
getDisplayName,
getRelationLabel,
prefixFileUrlWithBackendUrl,
useDebounce,
useDocumentRBAC,
useGetRelationsQuery,
usePrev
} from "./chunk-GXKJFURG.js";
import {
DocumentStatus
} from "./chunk-7FUKGPNR.js";
import "./chunk-NAZM6EA4.js";
import {
CREATOR_FIELDS,
HOOKS,
buildValidParams,
checkIfAttributeIsDisplayable,
convertListLayoutToFieldLayouts,
getMainField,
useContentTypeSchema,
useDoc,
useDocumentLayout,
useGetAllDocumentsQuery,
useGetContentTypeConfigurationQuery
} from "./chunk-UATNJIHQ.js";
import "./chunk-P4VL3IHZ.js";
import {
getTranslation
} from "./chunk-HIZVCZYI.js";
import "./chunk-6LY4MOO2.js";
import "./chunk-QF6GPHA4.js";
import "./chunk-SYWYLB7I.js";
import "./chunk-S3HPKOXW.js";
import "./chunk-JRLAXHTE.js";
import "./chunk-E4IFZ6ZT.js";
import "./chunk-QLEKUQKW.js";
import "./chunk-4J3VOWQV.js";
import "./chunk-PFI4R5WA.js";
import "./chunk-B3BGMYGX.js";
import "./chunk-W6ICJ5TB.js";
import "./chunk-IHYIPMY2.js";
import "./chunk-UWHSN2C7.js";
import "./chunk-ERK7O2GM.js";
import "./chunk-FCIM6RNO.js";
import {
SearchInput
} from "./chunk-J33IXKN4.js";
import "./chunk-NP53ZCXD.js";
import "./chunk-KFLQQE5L.js";
import "./chunk-ED4XR3VQ.js";
import "./chunk-MBK4V2X7.js";
import {
require_isEmpty
} from "./chunk-YJEURQPS.js";
import "./chunk-5ESYXDTN.js";
import "./chunk-K65KIEAL.js";
import "./chunk-B7ZLODDO.js";
import "./chunk-PW7XKCYO.js";
import "./chunk-RMBEU7DO.js";
import "./chunk-RI2W2UZ6.js";
import {
BackButton
} from "./chunk-IY256CNP.js";
import "./chunk-IFOFBKTA.js";
import "./chunk-XLSIZGJF.js";
import "./chunk-EGNP2T5O.js";
import {
useTracking
} from "./chunk-GSN7U3BK.js";
import "./chunk-T3B5F2LV.js";
import "./chunk-YXDCVYVT.js";
import "./chunk-QIJGNK42.js";
import "./chunk-7PUJSL55.js";
import "./chunk-C2ZJTFO7.js";
import {
Filters
} from "./chunk-C75BZXCZ.js";
import {
Pagination
} from "./chunk-APGTER6B.js";
import {
Table,
useTable
} from "./chunk-ZM6TT53G.js";
import "./chunk-6AXVGFVQ.js";
import {
useField
} from "./chunk-BFLP6DBI.js";
import {
useRBAC
} from "./chunk-CMLQV3Z2.js";
import {
parseISO
} from "./chunk-D4WYVNVM.js";
import "./chunk-MMOBCIZG.js";
import {
useAdminUsers
} from "./chunk-IGCTEXRF.js";
import {
Layouts
} from "./chunk-TIVRAWTC.js";
import "./chunk-PQINNV4N.js";
import {
require_isEqual
} from "./chunk-VYSYYPOB.js";
import {
Page,
useAPIErrorHandler
} from "./chunk-5CAWUBTQ.js";
import {
useAuth,
useQueryParams,
useStrapiApp
} from "./chunk-W2TBR6J3.js";
import "./chunk-QEGMJR7H.js";
import {
require_lib
} from "./chunk-LCL5TIBZ.js";
import "./chunk-WOQNBAGN.js";
import "./chunk-BHLYCXQ7.js";
import "./chunk-76QM3EFM.js";
import {
require_toString
} from "./chunk-CE4VABH2.js";
import "./chunk-5VODLFKF.js";
import {
useNotification
} from "./chunk-N55RVBRV.js";
import {
Avatar,
Badge,
Button,
CheckboxImpl,
Combobox,
Flex,
IconButton,
LinkButton,
Loader,
Menu,
Option,
Popover,
TextButton,
TooltipImpl,
Typography,
useCollator,
useIntl,
useNotifyAT
} from "./chunk-7XB6XSWQ.js";
import "./chunk-5ZC4PE57.js";
import {
Link,
NavLink,
useNavigate,
useParams
} from "./chunk-TUXTO2Z5.js";
import "./chunk-FOD4ENRR.js";
import {
ForwardRef$1h,
ForwardRef$2n,
ForwardRef$4d
} from "./chunk-WRD5KPDH.js";
import {
require_jsx_runtime
} from "./chunk-NIAJZ5MX.js";
import {
dt
} from "./chunk-ACIMPXWY.js";
import {
require_react
} from "./chunk-MADUDGYZ.js";
import {
__toESM
} from "./chunk-PLDDJCW6.js";
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/ListViewPage.mjs
var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
var React3 = __toESM(require_react(), 1);
var import_isEqual = __toESM(require_isEqual(), 1);
var import_qs2 = __toESM(require_lib(), 1);
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/Filters.mjs
var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
var React = __toESM(require_react(), 1);
var NOT_ALLOWED_FILTERS = [
"json",
"component",
"media",
"richtext",
"dynamiczone",
"password",
"blocks"
];
var DEFAULT_ALLOWED_FILTERS = [
"createdAt",
"updatedAt"
];
var USER_FILTER_ATTRIBUTES = [
...CREATOR_FIELDS,
"strapi_assignee"
];
var FiltersImpl = ({ disabled, schema }) => {
var _a;
const { attributes, uid: model, options } = schema;
const { formatMessage, locale } = useIntl();
const { trackUsage } = useTracking();
const allPermissions = useAuth("FiltersImpl", (state) => state.permissions);
const [{ query }] = useQueryParams();
const { schemas } = useContentTypeSchema();
const canReadAdminUsers = React.useMemo(() => allPermissions.filter((permission) => permission.action === "admin::users.read" && permission.subject === null).length > 0, [
allPermissions
]);
const selectedUserIds = (((_a = query == null ? void 0 : query.filters) == null ? void 0 : _a.$and) ?? []).reduce((acc, filter) => {
const [key, value] = Object.entries(filter)[0];
if (typeof value.id !== "object") {
return acc;
}
const id = value.id.$eq || value.id.$ne;
if (id && USER_FILTER_ATTRIBUTES.includes(key) && !acc.includes(id)) {
acc.push(id);
}
return acc;
}, []);
const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers({
filters: {
id: {
$in: selectedUserIds
}
}
}, {
// fetch the list of admin users only if the filter contains users and the
// current user has permissions to display users
skip: selectedUserIds.length === 0 || !canReadAdminUsers
});
const { users = [] } = userData ?? {};
const { metadata } = useGetContentTypeConfigurationQuery(model, {
selectFromResult: ({ data }) => ({
metadata: (data == null ? void 0 : data.contentType.metadatas) ?? {}
})
});
const formatter = useCollator(locale, {
sensitivity: "base"
});
const displayedFilters = React.useMemo(() => {
const [{ properties: { fields = [] } = {
fields: []
} }] = allPermissions.filter((permission) => permission.action === "plugin::content-manager.explorer.read" && permission.subject === model);
const allowedFields = fields.filter((field) => {
const attribute = attributes[field] ?? {};
return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);
});
return [
"id",
...allowedFields,
...DEFAULT_ALLOWED_FILTERS,
...canReadAdminUsers ? CREATOR_FIELDS : []
].map((name) => {
const attribute = attributes[name];
if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {
return null;
}
const { mainField: mainFieldName = "", label } = metadata[name].list;
let filter = {
name,
label: label ?? "",
mainField: getMainField(attribute, mainFieldName, {
schemas,
components: {}
}),
// @ts-expect-error TODO: this is filtered out above in the `allowedFields` call but TS complains, is there a better way to solve this?
type: attribute.type
};
if (attribute.type === "relation" && "target" in attribute && attribute.target === "admin::user") {
filter = {
...filter,
input: AdminUsersFilter,
options: users.map((user) => ({
label: getDisplayName(user),
value: user.id.toString()
})),
operators: [
{
label: formatMessage({
id: "components.FilterOptions.FILTER_TYPES.$eq",
defaultMessage: "is"
}),
value: "$eq"
},
{
label: formatMessage({
id: "components.FilterOptions.FILTER_TYPES.$ne",
defaultMessage: "is not"
}),
value: "$ne"
}
],
mainField: {
name: "id",
type: "integer"
}
};
}
if (attribute.type === "enumeration") {
filter = {
...filter,
options: attribute.enum.map((value) => ({
label: value,
value
}))
};
}
return filter;
}).filter(Boolean).toSorted((a, b) => formatter.compare(a.label, b.label));
}, [
allPermissions,
canReadAdminUsers,
model,
attributes,
metadata,
schemas,
users,
formatMessage,
formatter
]);
const onOpenChange = (isOpen) => {
if (isOpen) {
trackUsage("willFilterEntries");
}
};
const handleFilterChange = (data) => {
const attribute = attributes[data.name];
if (attribute) {
trackUsage("didFilterEntries", {
useRelation: attribute.type === "relation"
});
}
};
return (0, import_jsx_runtime.jsxs)(Filters.Root, {
disabled,
options: displayedFilters,
onOpenChange,
onChange: handleFilterChange,
children: [
(0, import_jsx_runtime.jsx)(Filters.Trigger, {}),
(0, import_jsx_runtime.jsx)(Filters.Popover, {}),
(0, import_jsx_runtime.jsx)(Filters.List, {})
]
});
};
var AdminUsersFilter = ({ name }) => {
const [pageSize, setPageSize] = React.useState(10);
const [search, setSearch] = React.useState("");
const { formatMessage } = useIntl();
const debouncedSearch = useDebounce(search, 300);
const { data, isLoading } = useAdminUsers({
pageSize,
_q: debouncedSearch
});
const field = useField(name);
const handleOpenChange = (isOpen) => {
if (!isOpen) {
setPageSize(10);
}
};
const { users = [], pagination } = data ?? {};
const { pageCount = 1, page = 1 } = pagination ?? {};
return (0, import_jsx_runtime.jsx)(Combobox, {
value: field.value,
"aria-label": formatMessage({
id: "content-manager.components.Filters.usersSelect.label",
defaultMessage: "Search and select a user to filter"
}),
onOpenChange: handleOpenChange,
onChange: (value) => field.onChange(name, value),
loading: isLoading,
onLoadMore: () => setPageSize(pageSize + 10),
hasMoreItems: page < pageCount,
onInputChange: (e) => {
setSearch(e.currentTarget.value);
},
children: users.map((user) => {
return (0, import_jsx_runtime.jsx)(Option, {
value: user.id.toString(),
children: getDisplayName(user)
}, user.id);
})
});
};
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/TableCells/CellContent.mjs
var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
var import_isEmpty = __toESM(require_isEmpty(), 1);
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/TableCells/CellValue.mjs
var import_toString = __toESM(require_toString(), 1);
var CellValue = ({ type, value }) => {
const { formatDate, formatTime, formatNumber } = useIntl();
let formattedValue = value;
if (type === "date") {
formattedValue = formatDate(parseISO(value), {
dateStyle: "full"
});
}
if (type === "datetime") {
formattedValue = formatDate(value, {
dateStyle: "full",
timeStyle: "short"
});
}
if (type === "time") {
const [hour, minute, second] = value.split(":");
const date = /* @__PURE__ */ new Date();
date.setHours(hour);
date.setMinutes(minute);
date.setSeconds(second);
formattedValue = formatTime(date, {
timeStyle: "short"
});
}
if ([
"float",
"decimal"
].includes(type)) {
formattedValue = formatNumber(value, {
// Should be kept in sync with the corresponding value
// in the design-system/NumberInput: https://github.com/strapi/design-system/blob/main/packages/strapi-design-system/src/NumberInput/NumberInput.js#L53
maximumFractionDigits: 20
});
}
if ([
"integer",
"biginteger"
].includes(type)) {
formattedValue = formatNumber(value, {
maximumFractionDigits: 0
});
}
return (0, import_toString.default)(formattedValue);
};
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/TableCells/Components.mjs
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
var SingleComponent = ({ content, mainField }) => {
if (!mainField) {
return null;
}
return (0, import_jsx_runtime2.jsx)(TooltipImpl, {
label: content[mainField.name],
children: (0, import_jsx_runtime2.jsx)(Typography, {
maxWidth: "25rem",
textColor: "neutral800",
ellipsis: true,
children: (0, import_jsx_runtime2.jsx)(CellValue, {
type: mainField.type,
value: content[mainField.name]
})
})
});
};
var RepeatableComponent = ({ content, mainField }) => {
const { formatMessage } = useIntl();
if (!mainField) {
return null;
}
return (0, import_jsx_runtime2.jsxs)(Menu.Root, {
children: [
(0, import_jsx_runtime2.jsxs)(Menu.Trigger, {
onClick: (e) => e.stopPropagation(),
children: [
(0, import_jsx_runtime2.jsx)(Badge, {
children: content.length
}),
formatMessage({
id: "content-manager.containers.list.items",
defaultMessage: "{number, plural, =0 {items} one {item} other {items}}"
}, {
number: content.length
})
]
}),
(0, import_jsx_runtime2.jsx)(Menu.Content, {
children: content.map((item) => (0, import_jsx_runtime2.jsx)(Menu.Item, {
disabled: true,
children: (0, import_jsx_runtime2.jsx)(Typography, {
maxWidth: "50rem",
ellipsis: true,
children: (0, import_jsx_runtime2.jsx)(CellValue, {
type: mainField.type,
value: item[mainField.name]
})
})
}, item.id))
})
]
});
};
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/TableCells/Media.mjs
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
var import_react = __toESM(require_react(), 1);
var getFileExtension = (ext) => ext && ext[0] === "." ? ext.substring(1) : ext;
var MediaSingle = ({ url, mime, alternativeText, name, ext, formats }) => {
var _a;
const fileURL = prefixFileUrlWithBackendUrl(url);
if (mime.includes("image")) {
const thumbnail = (_a = formats == null ? void 0 : formats.thumbnail) == null ? void 0 : _a.url;
const mediaURL = prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
return (0, import_jsx_runtime3.jsx)(Avatar.Item, {
src: mediaURL,
alt: alternativeText || name,
fallback: alternativeText || name,
preview: true
});
}
const fileExtension = getFileExtension(ext);
const fileName = name.length > 100 ? `${name.substring(0, 100)}...` : name;
return (0, import_jsx_runtime3.jsx)(TooltipImpl, {
description: fileName,
children: (0, import_jsx_runtime3.jsx)(FileWrapper, {
children: fileExtension
})
});
};
var FileWrapper = ({ children }) => {
return (0, import_jsx_runtime3.jsx)(Flex, {
tag: "span",
position: "relative",
borderRadius: "50%",
width: "26px",
height: "26px",
borderColor: "neutral200",
background: "neutral150",
paddingLeft: "1px",
justifyContent: "center",
alignItems: "center",
children: (0, import_jsx_runtime3.jsx)(FileTypography, {
variant: "sigma",
textColor: "neutral600",
children
})
});
};
var FileTypography = dt(Typography)`
font-size: 0.9rem;
line-height: 0.9rem;
`;
var MediaMultiple = ({ content }) => {
return (0, import_jsx_runtime3.jsx)(Avatar.Group, {
children: content.map((file, index) => {
const key = `${file.id}${index}`;
if (index === 3) {
const remainingFiles = `+${content.length - 3}`;
return (0, import_jsx_runtime3.jsx)(FileWrapper, {
children: remainingFiles
}, key);
}
if (index > 3) {
return null;
}
return (0, import_jsx_runtime3.jsx)(MediaSingle, {
...file
}, key);
})
});
};
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/TableCells/Relations.mjs
var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
var React2 = __toESM(require_react(), 1);
var RelationSingle = ({ mainField, content }) => {
return (0, import_jsx_runtime4.jsx)(Typography, {
maxWidth: "50rem",
textColor: "neutral800",
ellipsis: true,
children: getRelationLabel(content, mainField)
});
};
var RelationMultiple = ({ mainField, content, rowId, name }) => {
const { model } = useDoc();
const { formatMessage } = useIntl();
const { notifyStatus } = useNotifyAT();
const [isOpen, setIsOpen] = React2.useState(false);
const [targetField] = name.split(".");
const { data, isLoading } = useGetRelationsQuery({
model,
id: rowId,
targetField
}, {
skip: !isOpen,
refetchOnMountOrArgChange: true
});
const contentCount = Array.isArray(content) ? content.length : content.count;
React2.useEffect(() => {
if (data) {
notifyStatus(formatMessage({
id: getTranslation("DynamicTable.relation-loaded"),
defaultMessage: "Relations have been loaded"
}));
}
}, [
data,
formatMessage,
notifyStatus
]);
return (0, import_jsx_runtime4.jsxs)(Menu.Root, {
onOpenChange: (isOpen2) => setIsOpen(isOpen2),
children: [
(0, import_jsx_runtime4.jsx)(Menu.Trigger, {
onClick: (e) => e.stopPropagation(),
children: (0, import_jsx_runtime4.jsx)(Typography, {
style: {
cursor: "pointer"
},
textColor: "neutral800",
fontWeight: "regular",
children: contentCount > 0 ? formatMessage({
id: "content-manager.containers.list.items",
defaultMessage: "{number} {number, plural, =0 {items} one {item} other {items}}"
}, {
number: contentCount
}) : "-"
})
}),
(0, import_jsx_runtime4.jsxs)(Menu.Content, {
children: [
isLoading && (0, import_jsx_runtime4.jsx)(Menu.Item, {
disabled: true,
children: (0, import_jsx_runtime4.jsx)(Loader, {
small: true,
children: formatMessage({
id: getTranslation("ListViewTable.relation-loading"),
defaultMessage: "Relations are loading"
})
})
}),
(data == null ? void 0 : data.results) && (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, {
children: [
data.results.map((entry) => (0, import_jsx_runtime4.jsx)(Menu.Item, {
children: (0, import_jsx_runtime4.jsx)(Typography, {
maxWidth: "50rem",
ellipsis: true,
children: getRelationLabel(entry, mainField)
})
}, entry.documentId)),
(data == null ? void 0 : data.pagination) && (data == null ? void 0 : data.pagination.total) > 10 && (0, import_jsx_runtime4.jsx)(Menu.Item, {
"aria-disabled": true,
"aria-label": formatMessage({
id: getTranslation("ListViewTable.relation-more"),
defaultMessage: "This relation contains more entities than displayed"
}),
children: (0, import_jsx_runtime4.jsx)(Typography, {
children: "…"
})
})
]
})
]
})
]
});
};
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/TableCells/CellContent.mjs
var CellContent = ({ content, mainField, attribute, rowId, name }) => {
if (!hasContent(content, mainField, attribute)) {
return (0, import_jsx_runtime5.jsx)(Typography, {
textColor: "neutral800",
paddingLeft: attribute.type === "relation" ? "1.6rem" : 0,
paddingRight: attribute.type === "relation" ? "1.6rem" : 0,
children: "-"
});
}
switch (attribute.type) {
case "media":
if (!attribute.multiple) {
return (0, import_jsx_runtime5.jsx)(MediaSingle, {
...content
});
}
return (0, import_jsx_runtime5.jsx)(MediaMultiple, {
content
});
case "relation": {
if (isSingleRelation(attribute.relation)) {
return (0, import_jsx_runtime5.jsx)(RelationSingle, {
mainField,
content
});
}
return (0, import_jsx_runtime5.jsx)(RelationMultiple, {
rowId,
mainField,
content,
name
});
}
case "component":
if (attribute.repeatable) {
return (0, import_jsx_runtime5.jsx)(RepeatableComponent, {
mainField,
content
});
}
return (0, import_jsx_runtime5.jsx)(SingleComponent, {
mainField,
content
});
case "string":
return (0, import_jsx_runtime5.jsx)(TooltipImpl, {
description: content,
children: (0, import_jsx_runtime5.jsx)(Typography, {
maxWidth: "30rem",
ellipsis: true,
textColor: "neutral800",
children: (0, import_jsx_runtime5.jsx)(CellValue, {
type: attribute.type,
value: content
})
})
});
default:
return (0, import_jsx_runtime5.jsx)(Typography, {
maxWidth: "30rem",
ellipsis: true,
textColor: "neutral800",
children: (0, import_jsx_runtime5.jsx)(CellValue, {
type: attribute.type,
value: content
})
});
}
};
var hasContent = (content, mainField, attribute) => {
if (attribute.type === "component") {
if (attribute.repeatable || !mainField) {
return (content == null ? void 0 : content.length) > 0;
}
const value = content == null ? void 0 : content[mainField.name];
if (mainField.name === "id" && ![
void 0,
null
].includes(value)) {
return true;
}
return !(0, import_isEmpty.default)(value);
}
if (attribute.type === "relation") {
if (isSingleRelation(attribute.relation)) {
return !(0, import_isEmpty.default)(content);
}
if (Array.isArray(content)) {
return content.length > 0;
}
return (content == null ? void 0 : content.count) > 0;
}
if ([
"integer",
"decimal",
"float",
"number"
].includes(attribute.type)) {
return typeof content === "number";
}
if (attribute.type === "boolean") {
return content !== null;
}
return !(0, import_isEmpty.default)(content);
};
var isSingleRelation = (type) => [
"oneToOne",
"manyToOne",
"oneToOneMorph"
].includes(type);
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs
var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
var import_react2 = __toESM(require_react(), 1);
var import_qs = __toESM(require_lib(), 1);
var ViewSettingsMenu = (props) => {
const permissions = useTypedSelector((state) => {
var _a;
return ((_a = state.admin_app.permissions.contentManager) == null ? void 0 : _a.collectionTypesConfigurations) ?? [];
});
const [{ query }] = useQueryParams();
const { formatMessage } = useIntl();
const { allowedActions: { canConfigureView } } = useRBAC(permissions);
return (0, import_jsx_runtime6.jsxs)(Popover.Root, {
children: [
(0, import_jsx_runtime6.jsx)(Popover.Trigger, {
children: (0, import_jsx_runtime6.jsx)(IconButton, {
label: formatMessage({
id: "components.ViewSettings.tooltip",
defaultMessage: "View Settings"
}),
children: (0, import_jsx_runtime6.jsx)(ForwardRef$4d, {})
})
}),
(0, import_jsx_runtime6.jsx)(Popover.Content, {
side: "bottom",
align: "end",
sideOffset: 4,
children: (0, import_jsx_runtime6.jsxs)(Flex, {
alignItems: "stretch",
direction: "column",
padding: 3,
gap: 3,
children: [
canConfigureView ? (0, import_jsx_runtime6.jsx)(LinkButton, {
size: "S",
startIcon: (0, import_jsx_runtime6.jsx)(ForwardRef$2n, {}),
variant: "secondary",
tag: NavLink,
to: {
pathname: "configurations/list",
search: query.plugins ? (0, import_qs.stringify)({
plugins: query.plugins
}, {
encode: false
}) : ""
},
children: formatMessage({
id: "app.links.configure-view",
defaultMessage: "Configure the view"
})
}) : null,
(0, import_jsx_runtime6.jsx)(FieldPicker, {
...props
})
]
})
})
]
});
};
var FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
const { trackUsage } = useTracking();
const { formatMessage, locale } = useIntl();
const { schema, model } = useDoc();
const { list } = useDocumentLayout(model);
const formatter = useCollator(locale, {
sensitivity: "base"
});
const attributes = (schema == null ? void 0 : schema.attributes) ?? {};
const columns = Object.keys(attributes).filter((name) => checkIfAttributeIsDisplayable(attributes[name])).map((name) => {
var _a;
return {
name,
label: ((_a = list.metadatas[name]) == null ? void 0 : _a.label) ?? ""
};
}).sort((a, b) => formatter.compare(a.label, b.label));
const handleChange = (name) => {
trackUsage("didChangeDisplayedFields");
const newHeaders = headers.includes(name) ? headers.filter((header) => header !== name) : [
...headers,
name
];
setHeaders(newHeaders);
};
const handleReset = () => {
resetHeaders();
};
return (0, import_jsx_runtime6.jsxs)(Flex, {
tag: "fieldset",
direction: "column",
alignItems: "stretch",
gap: 3,
borderWidth: 0,
maxHeight: "240px",
overflow: "scroll",
children: [
(0, import_jsx_runtime6.jsxs)(Flex, {
justifyContent: "space-between",
children: [
(0, import_jsx_runtime6.jsx)(Typography, {
tag: "legend",
variant: "pi",
fontWeight: "bold",
children: formatMessage({
id: "containers.list.displayedFields",
defaultMessage: "Displayed fields"
})
}),
(0, import_jsx_runtime6.jsx)(TextButton, {
onClick: handleReset,
children: formatMessage({
id: "app.components.Button.reset",
defaultMessage: "Reset"
})
})
]
}),
(0, import_jsx_runtime6.jsx)(Flex, {
direction: "column",
alignItems: "stretch",
children: columns.map((header) => {
const isActive = headers.includes(header.name);
return (0, import_jsx_runtime6.jsx)(Flex, {
wrap: "wrap",
gap: 2,
background: isActive ? "primary100" : "transparent",
hasRadius: true,
padding: 2,
children: (0, import_jsx_runtime6.jsx)(CheckboxImpl, {
onCheckedChange: () => handleChange(header.name),
checked: isActive,
name: header.name,
children: (0, import_jsx_runtime6.jsx)(Typography, {
fontSize: 1,
children: header.label
})
})
}, header.name);
})
})
]
});
};
// node_modules/@strapi/content-manager/dist/admin/pages/ListView/ListViewPage.mjs
var { INJECT_COLUMN_IN_TABLE } = HOOKS;
var LayoutsHeaderCustom = dt(Layouts.Header)`
overflow-wrap: anywhere;
`;
var ListViewPage = () => {
var _a;
const { trackUsage } = useTracking();
const navigate = useNavigate();
const { formatMessage } = useIntl();
const { toggleNotification } = useNotification();
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);
const { collectionType, model, schema } = useDoc();
const { list } = useDocumentLayout(model);
const [displayedHeaders, setDisplayedHeaders] = React3.useState([]);
const listLayout = usePrev(list.layout);
React3.useEffect(() => {
if (!(0, import_isEqual.default)(listLayout, list.layout)) {
setDisplayedHeaders(list.layout);
}
}, [
list.layout,
listLayout
]);
const handleSetHeaders = (headers) => {
setDisplayedHeaders(convertListLayoutToFieldLayouts(headers, schema.attributes, list.metadatas));
};
const [{ query }] = useQueryParams({
page: "1",
pageSize: list.settings.pageSize.toString(),
sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ""
});
const params = React3.useMemo(() => buildValidParams(query), [
query
]);
const { data, error, isFetching } = useGetAllDocumentsQuery({
model,
params
});
React3.useEffect(() => {
if (error) {
toggleNotification({
type: "danger",
message: formatAPIError(error)
});
}
}, [
error,
formatAPIError,
toggleNotification
]);
const { results = [], pagination } = data ?? {};
React3.useEffect(() => {
if (pagination && pagination.pageCount > 0 && pagination.page > pagination.pageCount) {
navigate({
search: (0, import_qs2.stringify)({
...query,
page: pagination.pageCount
})
}, {
replace: true
});
}
}, [
pagination,
formatMessage,
query,
navigate
]);
const { canCreate } = useDocumentRBAC("ListViewPage", ({ canCreate: canCreate2 }) => ({
canCreate: canCreate2
}));
const runHookWaterfall = useStrapiApp("ListViewPage", ({ runHookWaterfall: runHookWaterfall2 }) => runHookWaterfall2);
const tableHeaders = React3.useMemo(() => {
var _a2;
const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, {
displayedHeaders,
layout: list
});
const formattedHeaders = headers.displayedHeaders.map((header) => {
var _a3;
const translation = typeof header.label === "string" ? {
id: `content-manager.content-types.${model}.${header.name}`,
defaultMessage: header.label
} : header.label;
return {
...header,
label: formatMessage(translation),
name: `${header.name}${((_a3 = header.mainField) == null ? void 0 : _a3.name) ? `.${header.mainField.name}` : ""}`
};
});
if ((_a2 = schema == null ? void 0 : schema.options) == null ? void 0 : _a2.draftAndPublish) {
formattedHeaders.push({
attribute: {
type: "custom"
},
name: "status",
label: formatMessage({
id: getTranslation(`containers.list.table-headers.status`),
defaultMessage: "status"
}),
searchable: false,
sortable: false
});
}
return formattedHeaders;
}, [
displayedHeaders,
formatMessage,
list,
runHookWaterfall,
(_a = schema == null ? void 0 : schema.options) == null ? void 0 : _a.draftAndPublish,
model
]);
if (isFetching) {
return (0, import_jsx_runtime7.jsx)(Page.Loading, {});
}
if (error) {
return (0, import_jsx_runtime7.jsx)(Page.Error, {});
}
const contentTypeTitle = (schema == null ? void 0 : schema.info.displayName) ? formatMessage({
id: schema.info.displayName,
defaultMessage: schema.info.displayName
}) : formatMessage({
id: "content-manager.containers.untitled",
defaultMessage: "Untitled"
});
const handleRowClick = (id) => () => {
trackUsage("willEditEntryFromList");
navigate({
pathname: id.toString(),
search: (0, import_qs2.stringify)({
plugins: query.plugins
})
});
};
return (0, import_jsx_runtime7.jsxs)(Page.Main, {
children: [
(0, import_jsx_runtime7.jsx)(Page.Title, {
children: `${contentTypeTitle}`
}),
(0, import_jsx_runtime7.jsx)(LayoutsHeaderCustom, {
primaryAction: canCreate ? (0, import_jsx_runtime7.jsx)(CreateButton, {}) : null,
subtitle: formatMessage({
id: getTranslation("pages.ListView.header-subtitle"),
defaultMessage: "{number, plural, =0 {# entries} one {# entry} other {# entries}} found"
}, {
number: pagination == null ? void 0 : pagination.total
}),
title: contentTypeTitle,
navigationAction: (0, import_jsx_runtime7.jsx)(BackButton, {})
}),
(0, import_jsx_runtime7.jsx)(Layouts.Action, {
endActions: (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, {
children: [
(0, import_jsx_runtime7.jsx)(InjectionZone, {
area: "listView.actions"
}),
(0, import_jsx_runtime7.jsx)(ViewSettingsMenu, {
setHeaders: handleSetHeaders,
resetHeaders: () => setDisplayedHeaders(list.layout),
headers: displayedHeaders.map((header) => header.name)
})
]
}),
startActions: (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, {
children: [
list.settings.searchable && (0, import_jsx_runtime7.jsx)(SearchInput, {
disabled: results.length === 0,
label: formatMessage({
id: "app.component.search.label",
defaultMessage: "Search for {target}"
}, {
target: contentTypeTitle
}),
placeholder: formatMessage({
id: "global.search",
defaultMessage: "Search"
}),
trackedEvent: "didSearch"
}),
list.settings.filterable && schema ? (0, import_jsx_runtime7.jsx)(FiltersImpl, {
disabled: results.length === 0,
schema
}) : null
]
})
}),
(0, import_jsx_runtime7.jsx)(Layouts.Content, {
children: (0, import_jsx_runtime7.jsxs)(Flex, {
gap: 4,
direction: "column",
alignItems: "stretch",
children: [
(0, import_jsx_runtime7.jsxs)(Table.Root, {
rows: results,
headers: tableHeaders,
isLoading: isFetching,
children: [
(0, import_jsx_runtime7.jsx)(TableActionsBar, {}),
(0, import_jsx_runtime7.jsxs)(Table.Content, {
children: [
(0, import_jsx_runtime7.jsxs)(Table.Head, {
children: [
(0, import_jsx_runtime7.jsx)(Table.HeaderCheckboxCell, {}),
tableHeaders.map((header) => (0, import_jsx_runtime7.jsx)(Table.HeaderCell, {
...header
}, header.name))
]
}),
(0, import_jsx_runtime7.jsx)(Table.Loading, {}),
(0, import_jsx_runtime7.jsx)(Table.Empty, {
action: canCreate ? (0, import_jsx_runtime7.jsx)(CreateButton, {
variant: "secondary"
}) : null
}),
(0, import_jsx_runtime7.jsx)(Table.Body, {
children: results.map((row) => {
return (0, import_jsx_runtime7.jsxs)(Table.Row, {
cursor: "pointer",
onClick: handleRowClick(row.documentId),
children: [
(0, import_jsx_runtime7.jsx)(Table.CheckboxCell, {
id: row.id
}),
tableHeaders.map(({ cellFormatter, ...header }) => {
if (header.name === "status") {
const { status } = row;
return (0, import_jsx_runtime7.jsx)(Table.Cell, {
children: (0, import_jsx_runtime7.jsx)(DocumentStatus, {
status,
maxWidth: "min-content"
})
}, header.name);
}
if ([
"createdBy",
"updatedBy"
].includes(header.name.split(".")[0])) {
return (0, import_jsx_runtime7.jsx)(Table.Cell, {
children: (0, import_jsx_runtime7.jsx)(Typography, {
textColor: "neutral800",
children: row[header.name.split(".")[0]] ? getDisplayName(row[header.name.split(".")[0]]) : "-"
})
}, header.name);
}
if (typeof cellFormatter === "function") {
return (0, import_jsx_runtime7.jsx)(Table.Cell, {
children: cellFormatter(row, header, {
collectionType,
model
})
}, header.name);
}
return (0, import_jsx_runtime7.jsx)(Table.Cell, {
children: (0, import_jsx_runtime7.jsx)(CellContent, {
content: row[header.name.split(".")[0]],
rowId: row.documentId,
...header
})
}, header.name);
}),
(0, import_jsx_runtime7.jsx)(ActionsCell, {
onClick: (e) => e.stopPropagation(),
children: (0, import_jsx_runtime7.jsx)(TableActions, {
document: row
})
})
]
}, row.id);
})
})
]
})
]
}),
(0, import_jsx_runtime7.jsxs)(Pagination.Root, {
...pagination,
onPageSizeChange: () => trackUsage("willChangeNumberOfEntriesPerPage"),
children: [
(0, import_jsx_runtime7.jsx)(Pagination.PageSize, {}),
(0, import_jsx_runtime7.jsx)(Pagination.Links, {})
]
})
]
})
})
]
});
};
var ActionsCell = dt(Table.Cell)`
display: flex;
justify-content: flex-end;
`;
var TableActionsBar = () => {
var _a, _b;
const selectRow = useTable("TableActionsBar", (state) => state.selectRow);
const [{ query }] = useQueryParams();
const locale = (_b = (_a = query == null ? void 0 : query.plugins) == null ? void 0 : _a.i18n) == null ? void 0 : _b.locale;
const prevLocale = usePrev(locale);
React3.useEffect(() => {
if (prevLocale !== locale) {
selectRow([]);
}
}, [
selectRow,
prevLocale,
locale
]);
return (0, import_jsx_runtime7.jsx)(Table.ActionBar, {
children: (0, import_jsx_runtime7.jsx)(BulkActionsRenderer, {})
});
};
var CreateButton = ({ variant }) => {
const { formatMessage } = useIntl();
const { trackUsage } = useTracking();
const [{ query }] = useQueryParams();
return (0, import_jsx_runtime7.jsx)(Button, {
variant,
tag: Link,
onClick: () => {
trackUsage("willCreateEntry", {
status: "draft"
});
},
startIcon: (0, import_jsx_runtime7.jsx)(ForwardRef$1h, {}),
style: {
textDecoration: "none"
},
to: {
pathname: "create",
search: (0, import_qs2.stringify)({
plugins: query.plugins
})
},
minWidth: "max-content",
marginLeft: 2,
children: formatMessage({
id: getTranslation("HeaderLayout.button.label-add-entry"),
defaultMessage: "Create new entry"
})
});
};
var ProtectedListViewPage = () => {
const { slug = "" } = useParams();
const { permissions = [], isLoading, error } = useRBAC(PERMISSIONS.map((action) => ({
action,
subject: slug
})));
if (isLoading) {
return (0, import_jsx_runtime7.jsx)(Page.Loading, {});
}
if (error || !slug) {
return (0, import_jsx_runtime7.jsx)(Page.Error, {});
}
return (0, import_jsx_runtime7.jsx)(Page.Protect, {
permissions,
children: ({ permissions: permissions2 }) => (0, import_jsx_runtime7.jsx)(DocumentRBAC, {
permissions: permissions2,
children: (0, import_jsx_runtime7.jsx)(ListViewPage, {})
})
});
};
export {
ListViewPage,
ProtectedListViewPage
};
//# sourceMappingURL=ListViewPage-2E4R5QGQ.js.map