strapi-plugin-bulk-updater 1.3.9 → 1.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{BulkUpdater-DPEJQYYa.js → BulkUpdater-DRHQBZZV.js} +20 -4
- package/dist/_chunks/BulkUpdater-DRHQBZZV.js.map +1 -0
- package/dist/_chunks/{BulkUpdater-CtEymixf.mjs → BulkUpdater-J21ZgJWx.mjs} +20 -4
- package/dist/_chunks/BulkUpdater-J21ZgJWx.mjs.map +1 -0
- package/dist/_chunks/{ScopedQuotaSelectInput-CyGlYa9x.js → ScopedQuotaSelectInput-BsBpmwun.js} +79 -11
- package/dist/_chunks/ScopedQuotaSelectInput-BsBpmwun.js.map +1 -0
- package/dist/_chunks/{ScopedQuotaSelectInput-Cy3eEj9-.mjs → ScopedQuotaSelectInput-YKdQgrPt.mjs} +79 -11
- package/dist/_chunks/ScopedQuotaSelectInput-YKdQgrPt.mjs.map +1 -0
- package/dist/_chunks/{SettingsPage-DLCYx2s4.mjs → SettingsPage-BDObdCIY.mjs} +2 -2
- package/dist/_chunks/{SettingsPage-DLCYx2s4.mjs.map → SettingsPage-BDObdCIY.mjs.map} +1 -1
- package/dist/_chunks/{SettingsPage-BM8B-uUz.js → SettingsPage-M-HQ8Jtr.js} +2 -2
- package/dist/_chunks/{SettingsPage-BM8B-uUz.js.map → SettingsPage-M-HQ8Jtr.js.map} +1 -1
- package/dist/_chunks/{ValidationRulesTab-vr-y8ntX.js → ValidationRulesTab-DuvL-K4F.js} +3 -3
- package/dist/_chunks/ValidationRulesTab-DuvL-K4F.js.map +1 -0
- package/dist/_chunks/{ValidationRulesTab-tT4HIeey.mjs → ValidationRulesTab-VeRr-vxa.mjs} +3 -3
- package/dist/_chunks/ValidationRulesTab-VeRr-vxa.mjs.map +1 -0
- package/dist/admin/index.js +3 -3
- package/dist/admin/index.mjs +3 -3
- package/dist/server/index.js +204 -35
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +204 -35
- package/dist/server/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/_chunks/BulkUpdater-CtEymixf.mjs.map +0 -1
- package/dist/_chunks/BulkUpdater-DPEJQYYa.js.map +0 -1
- package/dist/_chunks/ScopedQuotaSelectInput-Cy3eEj9-.mjs.map +0 -1
- package/dist/_chunks/ScopedQuotaSelectInput-CyGlYa9x.js.map +0 -1
- package/dist/_chunks/ValidationRulesTab-tT4HIeey.mjs.map +0 -1
- package/dist/_chunks/ValidationRulesTab-vr-y8ntX.js.map +0 -1
|
@@ -407,10 +407,10 @@ function ValidationRulesTab() {
|
|
|
407
407
|
TextInput,
|
|
408
408
|
{
|
|
409
409
|
label: "Target Field / Component Property Path",
|
|
410
|
-
placeholder: "e.g.
|
|
410
|
+
placeholder: "e.g. titleStyle, titleHeadingStyle.titleStyle, or content.titleHeadingStyle.titleStyle",
|
|
411
411
|
value: formField,
|
|
412
412
|
onChange: (e) => setFormField(e.target.value),
|
|
413
|
-
hint: "
|
|
413
|
+
hint: "Matches leaf key ('titleStyle'), component path ('titleHeadingStyle.titleStyle'), dynamic zone path ('content.titleHeadingStyle.titleStyle'), or collection-prefixed path ('st-featured.titleHeadingStyle.titleStyle').",
|
|
414
414
|
required: true
|
|
415
415
|
}
|
|
416
416
|
),
|
|
@@ -676,4 +676,4 @@ function ValidationRulesTab() {
|
|
|
676
676
|
export {
|
|
677
677
|
ValidationRulesTab as V
|
|
678
678
|
};
|
|
679
|
-
//# sourceMappingURL=ValidationRulesTab-
|
|
679
|
+
//# sourceMappingURL=ValidationRulesTab-VeRr-vxa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationRulesTab-VeRr-vxa.mjs","sources":["../../admin/src/pages/ValidationRulesTab.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { useFetchClient, useNotification } from '@strapi/strapi/admin';\nimport {\n Box,\n Flex,\n Typography,\n Button,\n TextInput,\n Textarea,\n SingleSelect,\n SingleSelectOption,\n Badge,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Alert,\n Checkbox,\n} from '@strapi/design-system';\nimport { Plus, Trash, Check, ArrowClockwise, Search, Download } from '@strapi/icons';\n\nexport interface ValidationRule {\n id: string;\n name: string;\n description?: string;\n collectionUid?: string;\n targetField: string;\n quotas: Record<string, number>;\n exceededAction: 'disable' | 'hide';\n enabled: boolean;\n scope: 'entry' | 'document';\n includeRichTextHtml?: boolean;\n richTextFields?: string[];\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport default function ValidationRulesTab() {\n const { get, post, del } = useFetchClient();\n const { toggleNotification } = useNotification();\n\n const [rules, setRules] = useState<ValidationRule[]>([]);\n const [loading, setLoading] = useState<boolean>(true);\n const [modalOpen, setModalOpen] = useState<boolean>(false);\n const [editingRule, setEditingRule] = useState<ValidationRule | null>(null);\n\n // Available collections from backend models\n const [availableCollections, setAvailableCollections] = useState<Array<{ uid: string; displayName: string }>>([]);\n\n // Form state for creating/editing a rule\n const [formName, setFormName] = useState<string>('');\n const [formDesc, setFormDesc] = useState<string>('');\n const [formCollectionUid, setFormCollectionUid] = useState<string>('*');\n const [formField, setFormField] = useState<string>('');\n const [formAction, setFormAction] = useState<'disable' | 'hide'>('disable');\n const [formIncludeRichText, setFormIncludeRichText] = useState<boolean>(true);\n const [formQuotas, setFormQuotas] = useState<Array<{ key: string; maxAllowed: number }>>([\n { key: 'h1', maxAllowed: 1 },\n { key: 'h2', maxAllowed: 3 },\n ]);\n const [saving, setSaving] = useState<boolean>(false);\n\n // Scan modal state\n const [scanModalOpen, setScanModalOpen] = useState<boolean>(false);\n const [scanningRuleId, setScanningRuleId] = useState<string | null>(null);\n const [scanReport, setScanReport] = useState<any>(null);\n\n const fetchCollections = async () => {\n try {\n const res = await get('/bulk-updater/models');\n let list: Array<{ uid: string; displayName: string }> = [];\n if (Array.isArray(res.data?.collections)) {\n list = res.data.collections.map((c: any) => ({\n uid: c.uid,\n displayName: c.displayName || c.singularName || c.uid,\n }));\n } else if (res.data?.targetUids && res.data?.metaByUid) {\n list = res.data.targetUids.map((uid: string) => ({\n uid,\n displayName: res.data.metaByUid[uid]?.displayName || uid,\n }));\n }\n setAvailableCollections(list);\n } catch {\n // Fallback silently if models not loaded\n }\n };\n\n const handleScanRule = async (rule: ValidationRule) => {\n try {\n setScanningRuleId(rule.id);\n const res = await get(`/bulk-updater/validation-rules/${rule.id}/scan`);\n if (res.data && res.data.success) {\n setScanReport(res.data);\n setScanModalOpen(true);\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: `Scan failed: ${err.message}`,\n });\n } finally {\n setScanningRuleId(null);\n }\n };\n\n const fetchRules = async () => {\n try {\n setLoading(true);\n const res = await get('/bulk-updater/validation-rules');\n if (res.data && res.data.success) {\n setRules(res.data.rules || []);\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: `Failed to load rules: ${err.message}`,\n });\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchRules();\n fetchCollections();\n }, []);\n\n const openCreateModal = () => {\n fetchCollections();\n setEditingRule(null);\n setFormName('');\n setFormDesc('');\n setFormCollectionUid('*');\n setFormField('headingLevel');\n setFormAction('disable');\n setFormIncludeRichText(true);\n setFormQuotas([\n { key: 'h1', maxAllowed: 1 },\n { key: 'h2', maxAllowed: 3 },\n ]);\n setModalOpen(true);\n };\n\n const openEditModal = (rule: ValidationRule) => {\n fetchCollections();\n setEditingRule(rule);\n setFormName(rule.name);\n setFormDesc(rule.description || '');\n setFormCollectionUid(rule.collectionUid || '*');\n setFormField(rule.targetField);\n setFormAction(rule.exceededAction || 'disable');\n setFormIncludeRichText(rule.includeRichTextHtml ?? true);\n const quotaPairs = Object.entries(rule.quotas || {}).map(([k, v]) => ({\n key: k,\n maxAllowed: v,\n }));\n setFormQuotas(quotaPairs.length > 0 ? quotaPairs : [{ key: 'h1', maxAllowed: 1 }]);\n setModalOpen(true);\n };\n\n const handleAddQuotaRow = () => {\n setFormQuotas((prev) => [...prev, { key: '', maxAllowed: 1 }]);\n };\n\n const handleRemoveQuotaRow = (idx: number) => {\n setFormQuotas((prev) => prev.filter((_, i) => i !== idx));\n };\n\n const handleQuotaChange = (idx: number, field: 'key' | 'maxAllowed', value: any) => {\n setFormQuotas((prev) =>\n prev.map((row, i) => {\n if (i === idx) {\n return {\n ...row,\n [field]: field === 'maxAllowed' ? Math.max(1, parseInt(value, 10) || 1) : String(value).trim(),\n };\n }\n return row;\n })\n );\n };\n\n const handleSave = async () => {\n if (!formName.trim() || !formField.trim()) {\n toggleNotification({\n type: 'warning',\n message: 'Rule Name and Target Field are required.',\n });\n return;\n }\n\n const quotasRecord: Record<string, number> = {};\n for (const q of formQuotas) {\n if (q.key.trim()) {\n quotasRecord[q.key.trim().toLowerCase()] = q.maxAllowed;\n }\n }\n\n if (Object.keys(quotasRecord).length === 0) {\n toggleNotification({\n type: 'warning',\n message: 'At least one quota option with a limit is required.',\n });\n return;\n }\n\n try {\n setSaving(true);\n const payload: Partial<ValidationRule> = {\n id: editingRule ? editingRule.id : undefined,\n name: formName.trim(),\n description: formDesc.trim(),\n collectionUid: formCollectionUid,\n targetField: formField.trim(),\n quotas: quotasRecord,\n exceededAction: formAction,\n enabled: editingRule ? editingRule.enabled : true,\n scope: 'entry',\n includeRichTextHtml: formIncludeRichText,\n };\n\n const res = await post('/bulk-updater/validation-rules', { rule: payload });\n if (res.data && res.data.success) {\n toggleNotification({\n type: 'success',\n message: `Rule \"${payload.name}\" saved successfully!`,\n });\n setModalOpen(false);\n fetchRules();\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: `Failed to save rule: ${err.message}`,\n });\n } finally {\n setSaving(false);\n }\n };\n\n const handleToggle = async (rule: ValidationRule) => {\n try {\n const res = await post(`/bulk-updater/validation-rules/${rule.id}/toggle`, {\n enabled: !rule.enabled,\n });\n if (res.data && res.data.success) {\n setRules((prev) =>\n prev.map((r) => (r.id === rule.id ? { ...r, enabled: !rule.enabled } : r))\n );\n toggleNotification({\n type: 'info',\n message: `Rule \"${rule.name}\" is now ${!rule.enabled ? 'ACTIVE' : 'DISABLED'}.`,\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: `Failed to update rule status: ${err.message}`,\n });\n }\n };\n\n const handleDelete = async (ruleId: string, ruleName: string) => {\n if (!window.confirm(`Are you sure you want to delete the rule \"${ruleName}\"?`)) return;\n\n try {\n const res = await del(`/bulk-updater/validation-rules/${ruleId}`);\n if (res.data && res.data.success) {\n setRules((prev) => prev.filter((r) => r.id !== ruleId));\n toggleNotification({\n type: 'success',\n message: `Rule \"${ruleName}\" deleted.`,\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: `Failed to delete rule: ${err.message}`,\n });\n }\n };\n\n return (\n <Box>\n <style>{`\n [data-radix-popper-content-wrapper] {\n z-index: 10005 !important;\n }\n `}</style>\n {/* Header Panel */}\n <Box padding={6} background=\"neutral0\" shadow=\"filterShadow\" hasRadius marginBottom={6}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3}>\n <Box>\n <Typography variant=\"delta\" tag=\"h2\" fontWeight=\"bold\">\n Scoped & Cross-Component Validation Rules\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ marginTop: 4 }}>\n Define collection-scoped rules and combined heading limits across structured components and free-form Rich Text / CKEditor HTML / Markdown content.\n </Typography>\n </Box>\n <Flex gap={2}>\n <Button\n variant=\"tertiary\"\n startIcon={<ArrowClockwise />}\n onClick={fetchRules}\n loading={loading}\n >\n Refresh\n </Button>\n <Button\n variant=\"default\"\n startIcon={<Plus />}\n onClick={openCreateModal}\n >\n Create New Rule\n </Button>\n </Flex>\n </Flex>\n </Box>\n\n {/* Rules Table */}\n <Box padding={6} background=\"neutral0\" shadow=\"filterShadow\" hasRadius>\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={3} style={{ display: 'block' }}>\n CONFIGURED RULES ({rules.length})\n </Typography>\n\n {loading ? (\n <Typography variant=\"omega\" textColor=\"neutral500\">Loading validation rules...</Typography>\n ) : rules.length === 0 ? (\n <Alert variant=\"info\" title=\"No Rules Defined\">\n Click \"Create New Rule\" above to add your first cross-component quota rule.\n </Alert>\n ) : (\n <Table colCount={7} rowCount={rules.length + 1}>\n <Thead>\n <Tr>\n <Th><Typography variant=\"sigma\">RULE NAME & TARGET FIELD</Typography></Th>\n <Th><Typography variant=\"sigma\">COLLECTION SCOPE</Typography></Th>\n <Th><Typography variant=\"sigma\">QUOTA CONSTRAINTS</Typography></Th>\n <Th><Typography variant=\"sigma\">RICH TEXT / HTML</Typography></Th>\n <Th><Typography variant=\"sigma\">EXCEEDED ACTION</Typography></Th>\n <Th><Typography variant=\"sigma\">STATUS</Typography></Th>\n <Th style={{ textAlign: 'right' }}><Typography variant=\"sigma\">ACTIONS</Typography></Th>\n </Tr>\n </Thead>\n <Tbody>\n {rules.map((rule) => {\n const quotaKeys = Object.entries(rule.quotas || {});\n const isGlobal = !rule.collectionUid || rule.collectionUid === '*';\n const collectionName = !isGlobal\n ? (availableCollections.find((c) => c.uid === rule.collectionUid)?.displayName || rule.collectionUid)\n : 'All Collections (Global)';\n\n return (\n <Tr key={rule.id}>\n <Td style={{ minWidth: 200 }}>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\" display=\"block\">\n {rule.name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Target: <code>{rule.targetField}</code>\n </Typography>\n </Td>\n <Td style={{ minWidth: 160 }}>\n <Badge\n backgroundColor={isGlobal ? 'neutral150' : 'primary100'}\n textColor={isGlobal ? 'neutral700' : 'primary700'}\n >\n {collectionName}\n </Badge>\n </Td>\n <Td style={{ minWidth: 180 }}>\n <Flex gap={1} wrap=\"wrap\">\n {quotaKeys.map(([optVal, maxVal]) => (\n <Badge key={optVal} backgroundColor=\"neutral100\" textColor=\"primary700\">\n <strong>{optVal.toUpperCase()}</strong>: max {maxVal}\n </Badge>\n ))}\n </Flex>\n </Td>\n <Td style={{ minWidth: 140 }}>\n {rule.includeRichTextHtml ? (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n HTML & Rich Text Active\n </Badge>\n ) : (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n Structured Only\n </Badge>\n )}\n </Td>\n <Td style={{ minWidth: 110 }}>\n <Badge\n backgroundColor={rule.exceededAction === 'hide' ? 'secondary100' : 'warning100'}\n textColor={rule.exceededAction === 'hide' ? 'secondary700' : 'warning700'}\n >\n {rule.exceededAction.toUpperCase()}\n </Badge>\n </Td>\n <Td style={{ minWidth: 100 }}>\n <Button\n variant={rule.enabled ? 'success-light' : 'tertiary'}\n size=\"S\"\n onClick={() => handleToggle(rule)}\n >\n {rule.enabled ? '● ACTIVE' : '○ DISABLED'}\n </Button>\n </Td>\n <Td style={{ textAlign: 'right', minWidth: 260 }}>\n <Flex gap={2} justifyContent=\"flex-end\">\n <Button\n variant=\"secondary\"\n size=\"S\"\n startIcon={<Search />}\n onClick={() => handleScanRule(rule)}\n loading={scanningRuleId === rule.id}\n >\n Scan Violations\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => openEditModal(rule)}\n >\n Edit\n </Button>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n startIcon={<Trash />}\n onClick={() => handleDelete(rule.id, rule.name)}\n >\n Delete\n </Button>\n </Flex>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n )}\n </Box>\n\n {/* Create / Edit Rule Modal */}\n {modalOpen && (\n <Box\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(33, 33, 52, 0.65)',\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"popupShadow\"\n padding={6}\n style={{ width: '90%', maxWidth: 640, maxHeight: '90vh', overflowY: 'auto' }}\n >\n <Typography variant=\"delta\" tag=\"h2\" fontWeight=\"bold\" marginBottom={1}>\n {editingRule ? 'Edit Validation Rule' : 'Create New Validation Rule'}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" marginBottom={4} style={{ display: 'block' }}>\n Configure collection-scoped quotas. Rules apply consistently to target properties and optionally scan rich text HTML content.\n </Typography>\n\n <Flex direction=\"column\" gap={4} alignItems=\"stretch\">\n <TextInput\n label=\"Rule Name\"\n placeholder=\"e.g. SEO Single H1 Page Rule\"\n value={formName}\n onChange={(e: any) => setFormName(e.target.value)}\n required\n />\n\n <SingleSelect\n label=\"Target Collection Type\"\n value={formCollectionUid}\n onChange={(val: any) => setFormCollectionUid(val)}\n hint=\"Scope this rule to a specific collection type, or select All Collections.\"\n >\n <SingleSelectOption value=\"*\">* (All Collections / Global)</SingleSelectOption>\n {availableCollections.map((c) => (\n <SingleSelectOption key={c.uid} value={c.uid}>\n {c.displayName} ({c.uid})\n </SingleSelectOption>\n ))}\n </SingleSelect>\n\n <TextInput\n label=\"Target Field / Component Property Path\"\n placeholder=\"e.g. titleStyle, titleHeadingStyle.titleStyle, or content.titleHeadingStyle.titleStyle\"\n value={formField}\n onChange={(e: any) => setFormField(e.target.value)}\n hint=\"Matches leaf key ('titleStyle'), component path ('titleHeadingStyle.titleStyle'), dynamic zone path ('content.titleHeadingStyle.titleStyle'), or collection-prefixed path ('st-featured.titleHeadingStyle.titleStyle').\"\n required\n />\n\n <Box padding={3} background=\"neutral100\" hasRadius style={{ border: '1px solid #e0e0e0' }}>\n <Checkbox\n checked={formIncludeRichText}\n onCheckedChange={(checked: boolean) => setFormIncludeRichText(checked)}\n >\n <Box marginLeft={2}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n Scan & Combine Rich Text / CKEditor HTML Headings\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" display=\"block\">\n When enabled, any <h1>..<h6> tags, Markdown headings (#), or Strapi Blocks inside rich text fields are counted together with structured component choices towards the quota.\n </Typography>\n </Box>\n </Checkbox>\n </Box>\n\n <Textarea\n label=\"Rule Description\"\n placeholder=\"Briefly explain what this constraint accomplishes...\"\n value={formDesc}\n onChange={(e: any) => setFormDesc(e.target.value)}\n />\n\n <SingleSelect\n label=\"When Quota Is Exceeded in Another Component\"\n value={formAction}\n onChange={(val: any) => setFormAction(val as 'disable' | 'hide')}\n >\n <SingleSelectOption value=\"disable\">\n Disable Option with Usage Badge [(1/1 used)]\n </SingleSelectOption>\n <SingleSelectOption value=\"hide\">\n Hide Option completely from dropdown menu\n </SingleSelectOption>\n </SingleSelect>\n\n {/* Quotas Editor */}\n <Box\n padding={4}\n background=\"neutral100\"\n hasRadius\n style={{ border: '1px solid #e0e0e0' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <Box>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\">\n Option Quotas (Max Allowed per Entry)\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ display: 'block' }}>\n Options left unlisted will have unlimited usage.\n </Typography>\n </Box>\n <Button\n variant=\"secondary\"\n size=\"S\"\n startIcon={<Plus />}\n onClick={handleAddQuotaRow}\n >\n Add Option\n </Button>\n </Flex>\n\n <Flex direction=\"column\" gap={2}>\n {formQuotas.map((q, idx) => (\n <Flex key={idx} gap={2} alignItems=\"center\">\n <Box style={{ flex: 2 }}>\n <TextInput\n placeholder=\"Option key (e.g. h1)\"\n value={q.key}\n onChange={(e: any) => handleQuotaChange(idx, 'key', e.target.value)}\n />\n </Box>\n <Box style={{ flex: 1 }}>\n <TextInput\n type=\"number\"\n placeholder=\"Max\"\n value={String(q.maxAllowed)}\n onChange={(e: any) => handleQuotaChange(idx, 'maxAllowed', e.target.value)}\n />\n </Box>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={() => handleRemoveQuotaRow(idx)}\n disabled={formQuotas.length <= 1}\n >\n ✕\n </Button>\n </Flex>\n ))}\n </Flex>\n </Box>\n </Flex>\n\n {/* Modal Actions */}\n <Flex justifyContent=\"flex-end\" gap={2} marginTop={6}>\n <Button\n variant=\"tertiary\"\n onClick={() => setModalOpen(false)}\n disabled={saving}\n >\n Cancel\n </Button>\n <Button\n variant=\"default\"\n startIcon={<Check />}\n onClick={handleSave}\n loading={saving}\n >\n Save Rule\n </Button>\n </Flex>\n </Box>\n </Box>\n )}\n\n {/* Scan Results Modal */}\n {scanModalOpen && scanReport && (\n <Box\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(33, 33, 52, 0.65)',\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"popupShadow\"\n padding={6}\n style={{ width: '90%', maxWidth: 780, maxHeight: '85vh', overflowY: 'auto' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={4}>\n <Box>\n <Typography variant=\"beta\" tag=\"h2\" fontWeight=\"bold\">\n Rule Violation Audit: {scanReport.rule?.name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Target Field: <code>{scanReport.rule?.targetField}</code> • Total Entries Scanned: {scanReport.totalScanned}\n </Typography>\n </Box>\n <Badge\n backgroundColor={scanReport.totalViolations > 0 ? 'danger100' : 'success100'}\n textColor={scanReport.totalViolations > 0 ? 'danger700' : 'success700'}\n size=\"M\"\n >\n {scanReport.totalViolations > 0\n ? `${scanReport.totalViolations} VIOLATION(S) FOUND`\n : '100% COMPLIANT'}\n </Badge>\n </Flex>\n\n {scanReport.totalViolations === 0 ? (\n <Alert variant=\"success\" title=\"No Pre-Existing Violations Detected\" marginBottom={4}>\n All existing documents across your collections adhere strictly to the configured quota limits.\n </Alert>\n ) : (\n <Box>\n <Alert variant=\"danger\" title=\"Legacy Records Found Exceeding Quota\" marginBottom={4}>\n The following {scanReport.totalViolations} record(s) contain more instances of restricted options than currently permitted by this rule.\n </Alert>\n\n <Table colCount={4} rowCount={scanReport.violations.length + 1}>\n <Thead>\n <Tr>\n <Th><Typography variant=\"sigma\">CONTENT TYPE & ENTRY</Typography></Th>\n <Th><Typography variant=\"sigma\">RESTRICTED OPTION</Typography></Th>\n <Th><Typography variant=\"sigma\">COUNT VS LIMIT</Typography></Th>\n <Th style={{ textAlign: 'right' }}><Typography variant=\"sigma\">ACTION</Typography></Th>\n </Tr>\n </Thead>\n <Tbody>\n {scanReport.violations.map((v: any, idx: number) => (\n <Tr key={idx}>\n <Td>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {v.entryLabel}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\">\n Collection: {v.collectionDisplayName}\n </Typography>\n {v.detail && (\n <Typography variant=\"pi\" textColor=\"neutral600\" display=\"block\" style={{ fontSize: 11 }}>\n Breakdown: {v.detail}\n </Typography>\n )}\n </Td>\n <Td>\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n {v.violatingOption}\n </Badge>\n </Td>\n <Td>\n <Typography variant=\"omega\" textColor=\"danger600\" fontWeight=\"bold\">\n {v.foundCount} used\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {' '}(Allowed max: {v.maxAllowed})\n </Typography>\n </Td>\n <Td style={{ textAlign: 'right' }}>\n <Button\n variant=\"secondary\"\n size=\"S\"\n onClick={() => window.open(v.editUrl, '_blank')}\n >\n Open in Editor ↗\n </Button>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n )}\n\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginTop={6}>\n {scanReport.totalViolations > 0 ? (\n <Button\n variant=\"secondary\"\n startIcon={<Download />}\n onClick={async () => {\n try {\n const res = await get(`/bulk-updater/csv/export-violations/${scanReport.rule.id}`);\n const csvStr = res.data?.csvContent || (typeof res.data === 'string' ? res.data : '');\n if (!csvStr) {\n toggleNotification({\n type: 'warning',\n message: 'No violation data to export',\n });\n return;\n }\n const safeContent = csvStr.startsWith('\\uFEFF') ? csvStr : '\\uFEFF' + csvStr;\n const blob = new Blob([safeContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', `violations_${scanReport.rule.id}.csv`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n toggleNotification({\n type: 'success',\n message: 'Violations exported to CSV successfully',\n });\n } catch (e: any) {\n toggleNotification({\n type: 'danger',\n message: e.message || 'Failed exporting violations CSV',\n });\n }\n }}\n >\n Export Violations CSV\n </Button>\n ) : (\n <Box />\n )}\n <Button variant=\"default\" onClick={() => setScanModalOpen(false)}>\n Close Report\n </Button>\n </Flex>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/admin/index.js
CHANGED
|
@@ -13,7 +13,7 @@ const index = {
|
|
|
13
13
|
id: `${PLUGIN_ID}.plugin.name`,
|
|
14
14
|
defaultMessage: "Bulk Attribute Updater"
|
|
15
15
|
},
|
|
16
|
-
Component: () => Promise.resolve().then(() => require("../_chunks/BulkUpdater-
|
|
16
|
+
Component: () => Promise.resolve().then(() => require("../_chunks/BulkUpdater-DRHQBZZV.js")),
|
|
17
17
|
permissions: [],
|
|
18
18
|
position: 3
|
|
19
19
|
});
|
|
@@ -24,7 +24,7 @@ const index = {
|
|
|
24
24
|
defaultMessage: "Bulk Updater Settings"
|
|
25
25
|
},
|
|
26
26
|
to: `${PLUGIN_ID}`,
|
|
27
|
-
Component: () => Promise.resolve().then(() => require("../_chunks/SettingsPage-
|
|
27
|
+
Component: () => Promise.resolve().then(() => require("../_chunks/SettingsPage-M-HQ8Jtr.js")),
|
|
28
28
|
permissions: []
|
|
29
29
|
});
|
|
30
30
|
app.registerPlugin({
|
|
@@ -44,7 +44,7 @@ const index = {
|
|
|
44
44
|
defaultMessage: "Dropdown with dynamic cross-component usage quota enforcement"
|
|
45
45
|
},
|
|
46
46
|
components: {
|
|
47
|
-
Input: async () => Promise.resolve().then(() => require("../_chunks/ScopedQuotaSelectInput-
|
|
47
|
+
Input: async () => Promise.resolve().then(() => require("../_chunks/ScopedQuotaSelectInput-BsBpmwun.js"))
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
50
|
},
|
package/dist/admin/index.mjs
CHANGED
|
@@ -10,7 +10,7 @@ const index = {
|
|
|
10
10
|
id: `${PLUGIN_ID}.plugin.name`,
|
|
11
11
|
defaultMessage: "Bulk Attribute Updater"
|
|
12
12
|
},
|
|
13
|
-
Component: () => import("../_chunks/BulkUpdater-
|
|
13
|
+
Component: () => import("../_chunks/BulkUpdater-J21ZgJWx.mjs"),
|
|
14
14
|
permissions: [],
|
|
15
15
|
position: 3
|
|
16
16
|
});
|
|
@@ -21,7 +21,7 @@ const index = {
|
|
|
21
21
|
defaultMessage: "Bulk Updater Settings"
|
|
22
22
|
},
|
|
23
23
|
to: `${PLUGIN_ID}`,
|
|
24
|
-
Component: () => import("../_chunks/SettingsPage-
|
|
24
|
+
Component: () => import("../_chunks/SettingsPage-BDObdCIY.mjs"),
|
|
25
25
|
permissions: []
|
|
26
26
|
});
|
|
27
27
|
app.registerPlugin({
|
|
@@ -41,7 +41,7 @@ const index = {
|
|
|
41
41
|
defaultMessage: "Dropdown with dynamic cross-component usage quota enforcement"
|
|
42
42
|
},
|
|
43
43
|
components: {
|
|
44
|
-
Input: async () => import("../_chunks/ScopedQuotaSelectInput-
|
|
44
|
+
Input: async () => import("../_chunks/ScopedQuotaSelectInput-YKdQgrPt.mjs")
|
|
45
45
|
}
|
|
46
46
|
});
|
|
47
47
|
},
|
package/dist/server/index.js
CHANGED
|
@@ -855,7 +855,9 @@ function buildDeepPopulate$1(attributes, allComponents, depth2 = 0) {
|
|
|
855
855
|
populate2[key] = true;
|
|
856
856
|
}
|
|
857
857
|
} else if (def.type === "dynamiczone") {
|
|
858
|
-
populate2[key] =
|
|
858
|
+
populate2[key] = {
|
|
859
|
+
populate: "*"
|
|
860
|
+
};
|
|
859
861
|
} else if (def.type === "relation" || def.type === "media") {
|
|
860
862
|
populate2[key] = true;
|
|
861
863
|
}
|
|
@@ -869,10 +871,28 @@ function discoverComponentAttributes(strapi2, compUid, prefix, currentDepth, max
|
|
|
869
871
|
const discoveredAttrs = [];
|
|
870
872
|
for (const [subKey, subAttr] of Object.entries(compSchema.attributes)) {
|
|
871
873
|
if (systemFields.includes(subKey)) continue;
|
|
872
|
-
if (subAttr.type === "dynamiczone") continue;
|
|
873
874
|
const fullPath = prefix ? `${prefix}.${subKey}` : subKey;
|
|
875
|
+
if (subAttr.type === "dynamiczone") {
|
|
876
|
+
const dzComps = Array.isArray(subAttr.components) ? subAttr.components : [];
|
|
877
|
+
for (const dzCompUid of dzComps) {
|
|
878
|
+
const deeper = discoverComponentAttributes(
|
|
879
|
+
strapi2,
|
|
880
|
+
dzCompUid,
|
|
881
|
+
fullPath,
|
|
882
|
+
currentDepth + 1,
|
|
883
|
+
maxDepth,
|
|
884
|
+
systemFields,
|
|
885
|
+
allContentTypes,
|
|
886
|
+
relationsByAttr,
|
|
887
|
+
allRelationsMeta,
|
|
888
|
+
attributesMeta
|
|
889
|
+
);
|
|
890
|
+
discoveredAttrs.push(...deeper);
|
|
891
|
+
}
|
|
892
|
+
continue;
|
|
893
|
+
}
|
|
874
894
|
if (subAttr.type === "component") {
|
|
875
|
-
if (
|
|
895
|
+
if (subAttr.component) {
|
|
876
896
|
const deeper = discoverComponentAttributes(
|
|
877
897
|
strapi2,
|
|
878
898
|
subAttr.component,
|
|
@@ -914,46 +934,110 @@ function discoverComponentAttributes(strapi2, compUid, prefix, currentDepth, max
|
|
|
914
934
|
function isDeepComponentField(contentType, allComponents, attribute) {
|
|
915
935
|
if (!attribute || !attribute.includes(".")) return false;
|
|
916
936
|
const parts = attribute.split(".");
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
const
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
if (
|
|
937
|
+
function checkPath(currentSchema, pathParts) {
|
|
938
|
+
if (pathParts.length === 0) return true;
|
|
939
|
+
if (!currentSchema || !currentSchema.attributes) return false;
|
|
940
|
+
const [head, ...tail] = pathParts;
|
|
941
|
+
const attrDef = currentSchema.attributes[head];
|
|
942
|
+
if (!attrDef) return false;
|
|
943
|
+
if (tail.length === 0) {
|
|
944
|
+
return true;
|
|
945
|
+
}
|
|
946
|
+
if (attrDef.type === "component" && attrDef.component) {
|
|
947
|
+
const comp = allComponents[attrDef.component];
|
|
948
|
+
return checkPath(comp, tail);
|
|
949
|
+
}
|
|
950
|
+
if (attrDef.type === "dynamiczone") {
|
|
951
|
+
const compUids = Array.isArray(attrDef.components) ? attrDef.components : [];
|
|
952
|
+
return compUids.some((compUid) => {
|
|
953
|
+
const comp = allComponents[compUid];
|
|
954
|
+
return checkPath(comp, tail);
|
|
955
|
+
});
|
|
956
|
+
}
|
|
957
|
+
return false;
|
|
924
958
|
}
|
|
925
|
-
|
|
926
|
-
return Boolean(currentSchema?.attributes?.[leafField]);
|
|
959
|
+
return checkPath(contentType, parts);
|
|
927
960
|
}
|
|
928
961
|
function getLeafAttributeSchema(contentType, allComponents, attribute) {
|
|
929
962
|
if (!attribute) return null;
|
|
930
963
|
if (!attribute.includes(".")) return contentType?.attributes?.[attribute] || null;
|
|
931
964
|
const parts = attribute.split(".");
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
const
|
|
935
|
-
const attrDef = currentSchema
|
|
936
|
-
if (!attrDef
|
|
937
|
-
|
|
938
|
-
|
|
965
|
+
function resolveLeaf(currentSchema, pathParts) {
|
|
966
|
+
if (!currentSchema || !currentSchema.attributes) return null;
|
|
967
|
+
const [head, ...tail] = pathParts;
|
|
968
|
+
const attrDef = currentSchema.attributes[head];
|
|
969
|
+
if (!attrDef) return null;
|
|
970
|
+
if (tail.length === 0) {
|
|
971
|
+
return attrDef;
|
|
972
|
+
}
|
|
973
|
+
if (attrDef.type === "component" && attrDef.component) {
|
|
974
|
+
return resolveLeaf(allComponents[attrDef.component], tail);
|
|
975
|
+
}
|
|
976
|
+
if (attrDef.type === "dynamiczone") {
|
|
977
|
+
const compUids = Array.isArray(attrDef.components) ? attrDef.components : [];
|
|
978
|
+
for (const compUid of compUids) {
|
|
979
|
+
const found = resolveLeaf(allComponents[compUid], tail);
|
|
980
|
+
if (found) return found;
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
return null;
|
|
939
984
|
}
|
|
940
|
-
return
|
|
985
|
+
return resolveLeaf(contentType, parts);
|
|
941
986
|
}
|
|
942
987
|
function setDeepProperty(obj, pathParts, value) {
|
|
943
988
|
if (pathParts.length === 0) return value;
|
|
944
|
-
const current = { ...obj || {} };
|
|
945
989
|
const [head, ...tail] = pathParts;
|
|
990
|
+
if (Array.isArray(obj)) {
|
|
991
|
+
if (/^\d+$/.test(head)) {
|
|
992
|
+
const idx = parseInt(head, 10);
|
|
993
|
+
const copy = [...obj];
|
|
994
|
+
copy[idx] = setDeepProperty(copy[idx] || {}, tail, value);
|
|
995
|
+
return copy;
|
|
996
|
+
}
|
|
997
|
+
return obj.map((item) => {
|
|
998
|
+
if (!item || typeof item !== "object") return item;
|
|
999
|
+
if (head in item || tail.length > 0 && typeof item[head] === "object") {
|
|
1000
|
+
return {
|
|
1001
|
+
...item,
|
|
1002
|
+
[head]: setDeepProperty(item[head], tail, value)
|
|
1003
|
+
};
|
|
1004
|
+
}
|
|
1005
|
+
return item;
|
|
1006
|
+
});
|
|
1007
|
+
}
|
|
1008
|
+
const current = { ...obj || {} };
|
|
946
1009
|
if (tail.length === 0) {
|
|
947
1010
|
current[head] = value;
|
|
948
1011
|
} else {
|
|
949
|
-
|
|
1012
|
+
const subTarget = current[head];
|
|
1013
|
+
if (Array.isArray(subTarget)) {
|
|
1014
|
+
current[head] = setDeepProperty(subTarget, tail, value);
|
|
1015
|
+
} else {
|
|
1016
|
+
current[head] = setDeepProperty(subTarget || {}, tail, value);
|
|
1017
|
+
}
|
|
950
1018
|
}
|
|
951
1019
|
return current;
|
|
952
1020
|
}
|
|
953
1021
|
function getDeepProperty(obj, path2) {
|
|
954
1022
|
if (!obj || !path2) return void 0;
|
|
955
|
-
|
|
956
|
-
|
|
1023
|
+
const parts = path2.split(".");
|
|
1024
|
+
function extract(current, remainingParts) {
|
|
1025
|
+
if (current === void 0 || current === null) return void 0;
|
|
1026
|
+
if (remainingParts.length === 0) return current;
|
|
1027
|
+
const [head, ...tail] = remainingParts;
|
|
1028
|
+
if (Array.isArray(current)) {
|
|
1029
|
+
if (/^\d+$/.test(head)) {
|
|
1030
|
+
return extract(current[parseInt(head, 10)], tail);
|
|
1031
|
+
}
|
|
1032
|
+
for (const item of current) {
|
|
1033
|
+
const found = extract(item?.[head], tail);
|
|
1034
|
+
if (found !== void 0 && found !== null) return found;
|
|
1035
|
+
}
|
|
1036
|
+
return void 0;
|
|
1037
|
+
}
|
|
1038
|
+
return extract(current[head], tail);
|
|
1039
|
+
}
|
|
1040
|
+
return extract(obj, parts);
|
|
957
1041
|
}
|
|
958
1042
|
function buildDeepFilter(pathParts, condition) {
|
|
959
1043
|
if (pathParts.length === 0) return condition;
|
|
@@ -1183,7 +1267,8 @@ async function executeBatchInternal(strapi2, {
|
|
|
1183
1267
|
findOneArgs.populate = populateOption;
|
|
1184
1268
|
}
|
|
1185
1269
|
const currentEntryWithPopulate = await strapi2.documents(target.uid).findOne(findOneArgs);
|
|
1186
|
-
const
|
|
1270
|
+
const isRootDz = contentType?.attributes?.[rootKey]?.type === "dynamiczone";
|
|
1271
|
+
const existingRoot = currentEntryWithPopulate?.[rootKey] || (isRootDz ? [] : {});
|
|
1187
1272
|
const currentVal2 = getDeepProperty(existingRoot, parts.slice(1).join("."));
|
|
1188
1273
|
let newValue2 = value;
|
|
1189
1274
|
if (regexObj && typeof currentVal2 === "string") {
|
|
@@ -1663,10 +1748,29 @@ const bulkUpdaterService = ({ strapi: strapi2 }) => {
|
|
|
1663
1748
|
const nestedComponentAttrs = [];
|
|
1664
1749
|
const validAttrs = Object.keys(rawAttrs).filter((attrKey) => {
|
|
1665
1750
|
if (systemFields.includes(attrKey)) return false;
|
|
1666
|
-
if (rawAttrs[attrKey].type === "dynamiczone")
|
|
1751
|
+
if (rawAttrs[attrKey].type === "dynamiczone") {
|
|
1752
|
+
const dzDef = rawAttrs[attrKey];
|
|
1753
|
+
const dzComponents = Array.isArray(dzDef.components) ? dzDef.components : [];
|
|
1754
|
+
for (const compUid of dzComponents) {
|
|
1755
|
+
const compAttrs = discoverComponentAttributes(
|
|
1756
|
+
strapi2,
|
|
1757
|
+
compUid,
|
|
1758
|
+
attrKey,
|
|
1759
|
+
1,
|
|
1760
|
+
5,
|
|
1761
|
+
systemFields,
|
|
1762
|
+
allContentTypes,
|
|
1763
|
+
relationsByAttr,
|
|
1764
|
+
allRelationsMeta,
|
|
1765
|
+
colAttributesMeta
|
|
1766
|
+
);
|
|
1767
|
+
nestedComponentAttrs.push(...compAttrs);
|
|
1768
|
+
}
|
|
1769
|
+
return false;
|
|
1770
|
+
}
|
|
1667
1771
|
if (rawAttrs[attrKey].type === "component") {
|
|
1668
1772
|
const compDef = rawAttrs[attrKey];
|
|
1669
|
-
if (
|
|
1773
|
+
if (compDef.component) {
|
|
1670
1774
|
const compAttrs = discoverComponentAttributes(
|
|
1671
1775
|
strapi2,
|
|
1672
1776
|
compDef.component,
|
|
@@ -3638,10 +3742,62 @@ function matchesPath(normalizedPath, leafKey, targetField) {
|
|
|
3638
3742
|
const pClean = cleanKey(normalizedPath);
|
|
3639
3743
|
const kClean = cleanKey(leafKey);
|
|
3640
3744
|
const tClean = cleanKey(targetField);
|
|
3641
|
-
if (
|
|
3642
|
-
|
|
3745
|
+
if (kClean === tClean || pClean === tClean) return true;
|
|
3746
|
+
const targetSegments = targetField.replace(/^api::/i, "").split(".").map(cleanKey).filter(Boolean);
|
|
3747
|
+
const pathSegments = normalizedPath.split(".").map(cleanKey).filter(Boolean);
|
|
3748
|
+
if (targetSegments.length === 0 || pathSegments.length === 0) return false;
|
|
3749
|
+
if (targetSegments.length === 1) {
|
|
3750
|
+
const single = targetSegments[0];
|
|
3751
|
+
return kClean === single || pathSegments[pathSegments.length - 1] === single;
|
|
3752
|
+
}
|
|
3753
|
+
let isSuffix = true;
|
|
3754
|
+
for (let i = 0; i < targetSegments.length; i++) {
|
|
3755
|
+
const tSeg = targetSegments[targetSegments.length - 1 - i];
|
|
3756
|
+
const pSeg = pathSegments[pathSegments.length - 1 - i];
|
|
3757
|
+
if (tSeg !== "*" && tSeg !== pSeg) {
|
|
3758
|
+
isSuffix = false;
|
|
3759
|
+
break;
|
|
3760
|
+
}
|
|
3643
3761
|
}
|
|
3644
|
-
|
|
3762
|
+
if (isSuffix) return true;
|
|
3763
|
+
for (let startIdx = 1; startIdx < targetSegments.length; startIdx++) {
|
|
3764
|
+
const subTarget = targetSegments.slice(startIdx);
|
|
3765
|
+
if (subTarget.length > pathSegments.length) continue;
|
|
3766
|
+
let subSuffix = true;
|
|
3767
|
+
for (let i = 0; i < subTarget.length; i++) {
|
|
3768
|
+
const tSeg = subTarget[subTarget.length - 1 - i];
|
|
3769
|
+
const pSeg = pathSegments[pathSegments.length - 1 - i];
|
|
3770
|
+
if (tSeg !== "*" && tSeg !== pSeg) {
|
|
3771
|
+
subSuffix = false;
|
|
3772
|
+
break;
|
|
3773
|
+
}
|
|
3774
|
+
}
|
|
3775
|
+
if (subSuffix) return true;
|
|
3776
|
+
}
|
|
3777
|
+
let pIdx = 0;
|
|
3778
|
+
let matchesInOrder = true;
|
|
3779
|
+
let tStart = 0;
|
|
3780
|
+
if (targetSegments.length > 2 && targetSegments[0] !== pathSegments[0] && targetSegments[0] !== "*") {
|
|
3781
|
+
tStart = 1;
|
|
3782
|
+
}
|
|
3783
|
+
for (let tIdx = tStart; tIdx < targetSegments.length; tIdx++) {
|
|
3784
|
+
const tSeg = targetSegments[tIdx];
|
|
3785
|
+
if (tSeg === "*") continue;
|
|
3786
|
+
let found = false;
|
|
3787
|
+
while (pIdx < pathSegments.length) {
|
|
3788
|
+
if (pathSegments[pIdx] === tSeg) {
|
|
3789
|
+
found = true;
|
|
3790
|
+
pIdx++;
|
|
3791
|
+
break;
|
|
3792
|
+
}
|
|
3793
|
+
pIdx++;
|
|
3794
|
+
}
|
|
3795
|
+
if (!found) {
|
|
3796
|
+
matchesInOrder = false;
|
|
3797
|
+
break;
|
|
3798
|
+
}
|
|
3799
|
+
}
|
|
3800
|
+
return matchesInOrder;
|
|
3645
3801
|
}
|
|
3646
3802
|
const validationRulesService = ({ strapi: strapi2 }) => ({
|
|
3647
3803
|
async getStore() {
|
|
@@ -3760,6 +3916,8 @@ const validationRulesService = ({ strapi: strapi2 }) => ({
|
|
|
3760
3916
|
if (matchesPath(attrName, attrName, targetField2) || matchesPath(`${compUid}.${attrName}`, attrName, targetField2)) return true;
|
|
3761
3917
|
if (attrDef.type === "component" && attrDef.component) {
|
|
3762
3918
|
if (componentHasField(attrDef.component, targetField2)) return true;
|
|
3919
|
+
} else if (attrDef.type === "dynamiczone" && Array.isArray(attrDef.components)) {
|
|
3920
|
+
if (attrDef.components.some((c) => componentHasField(c, targetField2))) return true;
|
|
3763
3921
|
}
|
|
3764
3922
|
}
|
|
3765
3923
|
return false;
|
|
@@ -3776,7 +3934,7 @@ const validationRulesService = ({ strapi: strapi2 }) => ({
|
|
|
3776
3934
|
if (attrDef.type === "component" && attrDef.component) {
|
|
3777
3935
|
if (componentHasField(attrDef.component, targetField)) {
|
|
3778
3936
|
hasField = true;
|
|
3779
|
-
populateAttrs[attrKey] =
|
|
3937
|
+
populateAttrs[attrKey] = { populate: "*" };
|
|
3780
3938
|
}
|
|
3781
3939
|
} else if (attrDef.type === "dynamiczone" && Array.isArray(attrDef.components)) {
|
|
3782
3940
|
const matchingComp = attrDef.components.some(
|
|
@@ -3784,7 +3942,7 @@ const validationRulesService = ({ strapi: strapi2 }) => ({
|
|
|
3784
3942
|
);
|
|
3785
3943
|
if (matchingComp) {
|
|
3786
3944
|
hasField = true;
|
|
3787
|
-
populateAttrs[attrKey] =
|
|
3945
|
+
populateAttrs[attrKey] = { populate: "*" };
|
|
3788
3946
|
}
|
|
3789
3947
|
}
|
|
3790
3948
|
}
|
|
@@ -3792,7 +3950,11 @@ const validationRulesService = ({ strapi: strapi2 }) => ({
|
|
|
3792
3950
|
}
|
|
3793
3951
|
const candidateUids = Object.keys(allContentTypes).filter((uid) => {
|
|
3794
3952
|
if (!uid.startsWith("api::") || uid.includes("bulk-updater")) return false;
|
|
3795
|
-
if (rule.collectionUid && rule.collectionUid !== "*"
|
|
3953
|
+
if (rule.collectionUid && rule.collectionUid !== "*") {
|
|
3954
|
+
if (rule.collectionUid === uid) return true;
|
|
3955
|
+
const cleanRuleCol = cleanKey(rule.collectionUid);
|
|
3956
|
+
const cleanUid = cleanKey(uid);
|
|
3957
|
+
if (cleanUid.includes(cleanRuleCol) || cleanRuleCol.includes(cleanUid)) return true;
|
|
3796
3958
|
return false;
|
|
3797
3959
|
}
|
|
3798
3960
|
return true;
|
|
@@ -3802,7 +3964,8 @@ const validationRulesService = ({ strapi: strapi2 }) => ({
|
|
|
3802
3964
|
const ct = allContentTypes[uid];
|
|
3803
3965
|
if (!ct) continue;
|
|
3804
3966
|
const { hasField, populateAttrs } = schemaHasField(ct);
|
|
3805
|
-
|
|
3967
|
+
const isTargetCol = rule.collectionUid && (rule.collectionUid === uid || cleanKey(uid).includes(cleanKey(rule.collectionUid)));
|
|
3968
|
+
if (hasField || isTargetCol) {
|
|
3806
3969
|
relevantCollections.push({
|
|
3807
3970
|
uid,
|
|
3808
3971
|
displayName: ct.info?.displayName || uid,
|
|
@@ -34213,7 +34376,13 @@ const index = {
|
|
|
34213
34376
|
strapi2.log.warn("[bulk-updater] Failed to fetch active UI validation rules:", err);
|
|
34214
34377
|
}
|
|
34215
34378
|
const effectiveRules = [
|
|
34216
|
-
...activeUiRules.filter((r) =>
|
|
34379
|
+
...activeUiRules.filter((r) => {
|
|
34380
|
+
if (!r.collectionUid || r.collectionUid === "*") return true;
|
|
34381
|
+
if (r.collectionUid === context.uid) return true;
|
|
34382
|
+
const cleanRuleCol = cleanKey(r.collectionUid);
|
|
34383
|
+
const cleanCtxCol = cleanKey(context.uid);
|
|
34384
|
+
return cleanCtxCol.includes(cleanRuleCol) || cleanRuleCol.includes(cleanCtxCol);
|
|
34385
|
+
}).map((r) => ({
|
|
34217
34386
|
id: r.id || r.targetField,
|
|
34218
34387
|
name: r.name || r.targetField,
|
|
34219
34388
|
collectionUid: r.collectionUid || "*",
|