@consilioweb/admin-nav 0.4.3
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.
Potentially problematic release.
This version of @consilioweb/admin-nav might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/README.md +774 -0
- package/dist/client.cjs +6119 -0
- package/dist/client.d.cts +147 -0
- package/dist/client.d.ts +147 -0
- package/dist/client.js +6102 -0
- package/dist/index.cjs +587 -0
- package/dist/index.d.cts +164 -0
- package/dist/index.d.ts +164 -0
- package/dist/index.js +575 -0
- package/dist/views.cjs +32 -0
- package/dist/views.d.cts +11 -0
- package/dist/views.d.ts +11 -0
- package/dist/views.js +30 -0
- package/package.json +128 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as payload from 'payload';
|
|
3
|
+
import * as _payloadcms_translations from '@payloadcms/translations';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* AdminNav — The main sidebar navigation component.
|
|
7
|
+
* Replaces the default Payload admin nav with the plugin's customizable navigation.
|
|
8
|
+
* Reads per-user preferences from the API, falls back to the defaultNav config.
|
|
9
|
+
*/
|
|
10
|
+
declare const AdminNav: React.FC;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* NavCustomizer — Full drag & drop navigation editor.
|
|
14
|
+
* Allows reordering groups and items, toggling visibility,
|
|
15
|
+
* editing labels/icons/URLs, creating new groups/items.
|
|
16
|
+
*/
|
|
17
|
+
declare const NavCustomizer: React.FC;
|
|
18
|
+
|
|
19
|
+
/** Localizable string — plain string or per-language record */
|
|
20
|
+
type LocalizedString = string | Record<string, string>;
|
|
21
|
+
/** A single navigation item */
|
|
22
|
+
interface NavItemConfig {
|
|
23
|
+
/** Unique item ID (e.g. 'pages', 'posts', 'seo-dashboard') */
|
|
24
|
+
id: string;
|
|
25
|
+
/** Admin URL path (e.g. '/admin/collections/pages') */
|
|
26
|
+
href: string;
|
|
27
|
+
/** Display label (string or { fr: '...', en: '...' }) */
|
|
28
|
+
label: LocalizedString;
|
|
29
|
+
/** Icon name from the built-in icon registry */
|
|
30
|
+
icon: string;
|
|
31
|
+
/** If true, pathname.startsWith(href) activates the item */
|
|
32
|
+
matchPrefix?: boolean;
|
|
33
|
+
/** Nested child items (e.g. ticket status filters) */
|
|
34
|
+
children?: NavItemConfig[];
|
|
35
|
+
/** Whether this item is visible (default: true) */
|
|
36
|
+
visible?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** A navigation group (section with a title) */
|
|
39
|
+
interface NavGroupConfig {
|
|
40
|
+
/** Unique group ID */
|
|
41
|
+
id: string;
|
|
42
|
+
/** Group title displayed as section header (string or { fr: '...', en: '...' }) */
|
|
43
|
+
title: LocalizedString;
|
|
44
|
+
/** Items in this group */
|
|
45
|
+
items: NavItemConfig[];
|
|
46
|
+
/** Whether this group is visible (default: true) */
|
|
47
|
+
visible?: boolean;
|
|
48
|
+
/** Whether this group starts collapsed (default: false) */
|
|
49
|
+
defaultCollapsed?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface SortableGroupProps {
|
|
53
|
+
group: NavGroupConfig;
|
|
54
|
+
children: React.ReactNode;
|
|
55
|
+
onToggleVisibility: (groupId: string) => void;
|
|
56
|
+
onEdit: (group: NavGroupConfig) => void;
|
|
57
|
+
onDelete: (groupId: string) => void;
|
|
58
|
+
}
|
|
59
|
+
declare const SortableGroup: React.FC<SortableGroupProps>;
|
|
60
|
+
|
|
61
|
+
interface SortableItemProps {
|
|
62
|
+
item: NavItemConfig;
|
|
63
|
+
groupId: string;
|
|
64
|
+
onToggleVisibility: (groupId: string, itemId: string) => void;
|
|
65
|
+
onEdit: (item: NavItemConfig, groupId: string) => void;
|
|
66
|
+
onDelete: (groupId: string, itemId: string) => void;
|
|
67
|
+
}
|
|
68
|
+
declare const SortableItem: React.FC<SortableItemProps>;
|
|
69
|
+
|
|
70
|
+
interface GroupEditorProps {
|
|
71
|
+
group?: NavGroupConfig;
|
|
72
|
+
onSave: (group: NavGroupConfig) => void;
|
|
73
|
+
onCancel: () => void;
|
|
74
|
+
}
|
|
75
|
+
declare const GroupEditor: React.FC<GroupEditorProps>;
|
|
76
|
+
|
|
77
|
+
interface NavItemEditorProps {
|
|
78
|
+
item: NavItemConfig;
|
|
79
|
+
onSave: (item: NavItemConfig) => void;
|
|
80
|
+
onCancel: () => void;
|
|
81
|
+
}
|
|
82
|
+
declare const NavItemEditor: React.FC<NavItemEditorProps>;
|
|
83
|
+
|
|
84
|
+
interface IconPickerProps {
|
|
85
|
+
value: string;
|
|
86
|
+
onChange: (icon: string) => void;
|
|
87
|
+
onClose: () => void;
|
|
88
|
+
}
|
|
89
|
+
declare const IconPicker: React.FC<IconPickerProps>;
|
|
90
|
+
|
|
91
|
+
interface UseNavPreferencesReturn {
|
|
92
|
+
/** Current nav layout (user's custom or default) */
|
|
93
|
+
layout: NavGroupConfig[];
|
|
94
|
+
/** Whether the layout is loaded */
|
|
95
|
+
isLoaded: boolean;
|
|
96
|
+
/** Whether a save/reset operation is in progress */
|
|
97
|
+
isSaving: boolean;
|
|
98
|
+
/** Whether the current layout differs from default */
|
|
99
|
+
isCustom: boolean;
|
|
100
|
+
/** Save the current layout to the server */
|
|
101
|
+
save: (groups: NavGroupConfig[]) => Promise<boolean>;
|
|
102
|
+
/** Reset to default layout */
|
|
103
|
+
reset: () => Promise<boolean>;
|
|
104
|
+
/** Reload preferences from server */
|
|
105
|
+
reload: () => Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Hook to fetch, save, and reset nav preferences for the current user.
|
|
109
|
+
* Falls back to the default nav from the plugin config endpoint.
|
|
110
|
+
*
|
|
111
|
+
* Uses a two-tier cache for instant rendering:
|
|
112
|
+
* 1. Module-level variables — survive component re-mounts during SPA
|
|
113
|
+
* navigation (the common case). Available immediately in useState.
|
|
114
|
+
* 2. sessionStorage — survives full page reloads. Read in useEffect
|
|
115
|
+
* (post-hydration) to avoid React hydration mismatch #418.
|
|
116
|
+
*
|
|
117
|
+
* On the server, module vars are null → layout=[] → matches client
|
|
118
|
+
* first render. After the first fetch, module vars are populated →
|
|
119
|
+
* subsequent mounts get instant data (no flash).
|
|
120
|
+
*/
|
|
121
|
+
declare function useNavPreferences(basePath?: string): UseNavPreferencesReturn;
|
|
122
|
+
|
|
123
|
+
/** All translation keys for the plugin-admin-nav namespace */
|
|
124
|
+
type PluginAdminNavTranslationKeys = 'plugin-admin-nav:save' | 'plugin-admin-nav:cancel' | 'plugin-admin-nav:reset' | 'plugin-admin-nav:create' | 'plugin-admin-nav:ok' | 'plugin-admin-nav:close' | 'plugin-admin-nav:show' | 'plugin-admin-nav:hide' | 'plugin-admin-nav:edit' | 'plugin-admin-nav:delete' | 'plugin-admin-nav:addItem' | 'plugin-admin-nav:addGroup' | 'plugin-admin-nav:addSubmenu' | 'plugin-admin-nav:moveUp' | 'plugin-admin-nav:moveDown' | 'plugin-admin-nav:labelField' | 'plugin-admin-nav:urlField' | 'plugin-admin-nav:iconField' | 'plugin-admin-nav:titleField' | 'plugin-admin-nav:idField' | 'plugin-admin-nav:editItem' | 'plugin-admin-nav:editGroup' | 'plugin-admin-nav:newGroup' | 'plugin-admin-nav:customizeTitle' | 'plugin-admin-nav:loading' | 'plugin-admin-nav:saving' | 'plugin-admin-nav:savedSuccess' | 'plugin-admin-nav:saveError' | 'plugin-admin-nav:resetSuccess' | 'plugin-admin-nav:resetError' | 'plugin-admin-nav:dndHint' | 'plugin-admin-nav:deleteGroupConfirm' | 'plugin-admin-nav:resetConfirm' | 'plugin-admin-nav:submenus' | 'plugin-admin-nav:noSubmenus' | 'plugin-admin-nav:noLabel' | 'plugin-admin-nav:newLink' | 'plugin-admin-nav:dashboard' | 'plugin-admin-nav:customize' | 'plugin-admin-nav:matchPrefix' | 'plugin-admin-nav:defaultCollapsed' | 'plugin-admin-nav:searchIcon' | 'plugin-admin-nav:dotColor' | 'plugin-admin-nav:noIconFound' | 'plugin-admin-nav:multiLang' | 'plugin-admin-nav:titlePlaceholder' | 'plugin-admin-nav:idPlaceholder' | 'plugin-admin-nav:childLabelPlaceholder' | 'plugin-admin-nav:childUrlPlaceholder' | 'plugin-admin-nav:childIconPlaceholder' | 'plugin-admin-nav:childIconLabel';
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Typed wrapper around Payload's useTranslation that includes
|
|
128
|
+
* the plugin-admin-nav translation keys.
|
|
129
|
+
*/
|
|
130
|
+
declare const usePluginTranslation: () => {
|
|
131
|
+
i18n: _payloadcms_translations.I18nClient<Record<string, never>, PluginAdminNavTranslationKeys>;
|
|
132
|
+
languageOptions: payload.LanguageOptions;
|
|
133
|
+
switchLanguage?: (lang: _payloadcms_translations.AcceptedLanguages) => Promise<void>;
|
|
134
|
+
t: _payloadcms_translations.TFunction<PluginAdminNavTranslationKeys | "authentication:account" | "authentication:accountOfCurrentUser" | "authentication:accountVerified" | "authentication:alreadyActivated" | "authentication:alreadyLoggedIn" | "authentication:apiKey" | "authentication:authenticated" | "authentication:backToLogin" | "authentication:beginCreateFirstUser" | "authentication:changePassword" | "authentication:checkYourEmailForPasswordReset" | "authentication:confirmGeneration" | "authentication:confirmPassword" | "authentication:createFirstUser" | "authentication:emailNotValid" | "authentication:emailOrUsername" | "authentication:emailSent" | "authentication:emailVerified" | "authentication:enableAPIKey" | "authentication:failedToUnlock" | "authentication:forceUnlock" | "authentication:forgotPassword" | "authentication:forgotPasswordEmailInstructions" | "authentication:forgotPasswordUsernameInstructions" | "authentication:usernameNotValid" | "authentication:forgotPasswordQuestion" | "authentication:generate" | "authentication:generateNewAPIKey" | "authentication:generatingNewAPIKeyWillInvalidate" | "authentication:logBackIn" | "authentication:loggedIn" | "authentication:loggedInChangePassword" | "authentication:loggedOutInactivity" | "authentication:loggedOutSuccessfully" | "authentication:loggingOut" | "authentication:login" | "authentication:logOut" | "authentication:logout" | "authentication:logoutSuccessful" | "authentication:logoutUser" | "authentication:newAPIKeyGenerated" | "authentication:newPassword" | "authentication:passed" | "authentication:passwordResetSuccessfully" | "authentication:resetPassword" | "authentication:stayLoggedIn" | "authentication:successfullyRegisteredFirstUser" | "authentication:successfullyUnlocked" | "authentication:tokenRefreshSuccessful" | "authentication:unableToVerify" | "authentication:username" | "authentication:verified" | "authentication:verifiedSuccessfully" | "authentication:verify" | "authentication:verifyUser" | "authentication:youAreInactive" | "dashboard:addWidget" | "dashboard:deleteWidget" | "dashboard:searchWidgets" | "error:autosaving" | "error:correctInvalidFields" | "error:deletingTitle" | "error:documentNotFound" | "error:emailOrPasswordIncorrect" | "error:insufficientClipboardPermissions" | "error:invalidClipboardData" | "error:invalidFileType" | "error:invalidRequestArgs" | "error:loadingDocument" | "error:logoutFailed" | "error:noMatchedField" | "error:notAllowedToAccessPage" | "error:notAllowedToPerformAction" | "error:previewing" | "error:problemUploadingFile" | "error:restoringTitle" | "error:revertingDocument" | "error:tokenNotProvided" | "error:unableToCopy" | "error:unableToDeleteCount" | "error:unableToReindexCollection" | "error:unableToUpdateCount" | "error:unauthorized" | "error:unauthorizedAdmin" | "error:unknown" | "error:unPublishingDocument" | "error:unspecific" | "error:unverifiedEmail" | "error:userEmailAlreadyRegistered" | "error:usernameAlreadyRegistered" | "error:usernameOrPasswordIncorrect" | "fields:blocks" | "fields:addLabel" | "fields:addLink" | "fields:addNew" | "fields:addNewLabel" | "fields:addRelationship" | "fields:addUpload" | "fields:block" | "fields:blockType" | "fields:chooseBetweenCustomTextOrDocument" | "fields:chooseDocumentToLink" | "fields:chooseFromExisting" | "fields:collapseAll" | "fields:customURL" | "fields:editLink" | "fields:editRelationship" | "fields:enterURL" | "fields:internalLink" | "fields:itemsAndMore" | "fields:labelRelationship" | "fields:latitude" | "fields:linkedTo" | "fields:linkType" | "fields:longitude" | "fields:openInNewTab" | "fields:passwordsDoNotMatch" | "fields:removeRelationship" | "fields:removeUpload" | "fields:saveChanges" | "fields:searchForBlock" | "fields:searchForLanguage" | "fields:selectFieldsToEdit" | "fields:showAll" | "fields:swapRelationship" | "fields:swapUpload" | "fields:textToDisplay" | "fields:toggleBlock" | "fields:uploadNewLabel" | "folder:browseByFolder" | "folder:byFolder" | "folder:deleteFolder" | "folder:folderName" | "folder:folders" | "folder:folderTypeDescription" | "folder:itemHasBeenMoved" | "folder:itemHasBeenMovedToRoot" | "folder:itemsMovedToFolder" | "folder:itemsMovedToRoot" | "folder:moveFolder" | "folder:moveItemsToFolderConfirmation" | "folder:moveItemsToRootConfirmation" | "folder:moveItemToFolderConfirmation" | "folder:moveItemToRootConfirmation" | "folder:movingFromFolder" | "folder:newFolder" | "folder:noFolder" | "folder:renameFolder" | "folder:searchByNameInFolder" | "folder:selectFolderForItem" | "general:items" | "general:of" | "general:language" | "general:dashboard" | "general:error" | "general:username" | "general:notFound" | "general:unauthorized" | "general:newLabel" | "general:saveChanges" | "general:name" | "general:aboutToDelete" | "general:aboutToPermanentlyDelete" | "general:aboutToPermanentlyDeleteTrash" | "general:aboutToRestore" | "general:aboutToRestoreAsDraft" | "general:aboutToRestoreAsDraftCount" | "general:aboutToRestoreCount" | "general:aboutToTrash" | "general:aboutToTrashCount" | "general:addBelow" | "general:addFilter" | "general:adminTheme" | "general:all" | "general:allCollections" | "general:allLocales" | "general:and" | "general:anotherUser" | "general:anotherUserTakenOver" | "general:applyChanges" | "general:ascending" | "general:automatic" | "general:backToDashboard" | "general:cancel" | "general:changesNotSaved" | "general:clear" | "general:clearAll" | "general:close" | "general:collapse" | "general:collections" | "general:columns" | "general:columnToSort" | "general:confirm" | "general:confirmCopy" | "general:confirmDeletion" | "general:confirmDuplication" | "general:confirmMove" | "general:confirmReindex" | "general:confirmReindexAll" | "general:confirmReindexDescription" | "general:confirmReindexDescriptionAll" | "general:confirmRestoration" | "general:copied" | "general:copy" | "general:copyField" | "general:copying" | "general:copyRow" | "general:copyWarning" | "general:create" | "general:created" | "general:createdAt" | "general:createNew" | "general:createNewLabel" | "general:creating" | "general:creatingNewLabel" | "general:currentlyEditing" | "general:custom" | "general:dark" | "general:delete" | "general:deleted" | "general:deletedAt" | "general:deletedCountSuccessfully" | "general:deletedSuccessfully" | "general:deleteLabel" | "general:deletePermanently" | "general:deleting" | "general:depth" | "general:descending" | "general:deselectAllRows" | "general:document" | "general:documentIsTrashed" | "general:documentLocked" | "general:documents" | "general:duplicate" | "general:duplicateWithoutSaving" | "general:edit" | "general:editAll" | "general:editedSince" | "general:editing" | "general:editingTakenOver" | "general:editLabel" | "general:email" | "general:emailAddress" | "general:emptyTrash" | "general:emptyTrashLabel" | "general:enterAValue" | "general:errors" | "general:exitLivePreview" | "general:export" | "general:fallbackToDefaultLocale" | "general:false" | "general:filters" | "general:filterWhere" | "general:globals" | "general:goBack" | "general:groupByLabel" | "general:import" | "general:isEditing" | "general:item" | "general:lastModified" | "general:layout" | "general:leaveAnyway" | "general:leaveWithoutSaving" | "general:light" | "general:livePreview" | "general:loading" | "general:locale" | "general:locales" | "general:lock" | "general:menu" | "general:moreOptions" | "general:move" | "general:moveConfirm" | "general:moveCount" | "general:moveDown" | "general:moveUp" | "general:moving" | "general:movingCount" | "general:next" | "general:no" | "general:noDateSelected" | "general:noFiltersSet" | "general:noLabel" | "general:none" | "general:noOptions" | "general:noResults" | "general:noResultsDescription" | "general:noResultsFound" | "general:nothingFound" | "general:noTrashResults" | "general:noUpcomingEventsScheduled" | "general:noValue" | "general:only" | "general:open" | "general:or" | "general:order" | "general:overwriteExistingData" | "general:pageNotFound" | "general:password" | "general:pasteField" | "general:pasteRow" | "general:payloadSettings" | "general:permanentlyDelete" | "general:permanentlyDeletedCountSuccessfully" | "general:perPage" | "general:previous" | "general:reindex" | "general:reindexingAll" | "general:remove" | "general:rename" | "general:reset" | "general:resetPreferences" | "general:resetPreferencesDescription" | "general:resettingPreferences" | "general:restore" | "general:restoreAsPublished" | "general:restoredCountSuccessfully" | "general:restoring" | "general:row" | "general:rows" | "general:save" | "general:saving" | "general:schedulePublishFor" | "general:searchBy" | "general:select" | "general:selectAll" | "general:selectAllRows" | "general:selectedCount" | "general:selectLabel" | "general:selectValue" | "general:showAllLabel" | "general:sorryNotFound" | "general:sort" | "general:sortByLabelDirection" | "general:stayOnThisPage" | "general:submissionSuccessful" | "general:submit" | "general:submitting" | "general:success" | "general:successfullyCreated" | "general:successfullyDuplicated" | "general:successfullyReindexed" | "general:takeOver" | "general:thisLanguage" | "general:time" | "general:timezone" | "general:titleDeleted" | "general:titleRestored" | "general:titleTrashed" | "general:trash" | "general:trashedCountSuccessfully" | "general:true" | "general:unlock" | "general:unsavedChanges" | "general:unsavedChangesDuplicate" | "general:untitled" | "general:upcomingEvents" | "general:updatedAt" | "general:updatedCountSuccessfully" | "general:updatedLabelSuccessfully" | "general:updatedSuccessfully" | "general:updateForEveryone" | "general:updating" | "general:uploading" | "general:uploadingBulk" | "general:user" | "general:users" | "general:value" | "general:viewing" | "general:viewReadOnly" | "general:welcome" | "general:yes" | "localization:cannotCopySameLocale" | "localization:copyFrom" | "localization:copyFromTo" | "localization:copyTo" | "localization:copyToLocale" | "localization:localeToPublish" | "localization:selectedLocales" | "localization:selectLocaleToCopy" | "localization:selectLocaleToDuplicate" | "operators:contains" | "operators:equals" | "operators:exists" | "operators:intersects" | "operators:near" | "operators:within" | "operators:isGreaterThan" | "operators:isGreaterThanOrEqualTo" | "operators:isIn" | "operators:isLessThan" | "operators:isLessThanOrEqualTo" | "operators:isLike" | "operators:isNotEqualTo" | "operators:isNotIn" | "operators:isNotLike" | "upload:addFile" | "upload:addFiles" | "upload:bulkUpload" | "upload:crop" | "upload:cropToolDescription" | "upload:download" | "upload:dragAndDrop" | "upload:editImage" | "upload:fileName" | "upload:fileSize" | "upload:filesToUpload" | "upload:fileToUpload" | "upload:focalPoint" | "upload:focalPointDescription" | "upload:height" | "upload:noFile" | "upload:pasteURL" | "upload:previewSizes" | "upload:selectCollectionToBrowse" | "upload:selectFile" | "upload:setCropArea" | "upload:setFocalPoint" | "upload:sizes" | "upload:sizesFor" | "upload:width" | "validation:username" | "validation:emailAddress" | "validation:enterNumber" | "validation:fieldHasNo" | "validation:greaterThanMax" | "validation:invalidBlock" | "validation:invalidBlocks" | "validation:invalidInput" | "validation:invalidSelection" | "validation:invalidSelections" | "validation:latitudeOutOfBounds" | "validation:lessThanMin" | "validation:limitReached" | "validation:longerThanMin" | "validation:longitudeOutOfBounds" | "validation:notValidDate" | "validation:required" | "validation:requiresAtLeast" | "validation:requiresNoMoreThan" | "validation:requiresTwoNumbers" | "validation:shorterThanMax" | "validation:timezoneRequired" | "validation:trueOrFalse" | "validation:validUploadID" | "version:version" | "version:aboutToRestore" | "version:restoring" | "version:type" | "version:aboutToPublishSelection" | "version:aboutToRestoreGlobal" | "version:aboutToRevertToPublished" | "version:aboutToUnpublish" | "version:aboutToUnpublishIn" | "version:aboutToUnpublishSelection" | "version:autosave" | "version:autosavedSuccessfully" | "version:autosavedVersion" | "version:changed" | "version:compareVersions" | "version:comparingAgainst" | "version:confirmPublish" | "version:confirmRevertToSaved" | "version:confirmUnpublish" | "version:confirmVersionRestoration" | "version:currentDraft" | "version:currentlyPublished" | "version:currentlyViewing" | "version:currentPublishedVersion" | "version:draft" | "version:draftHasPublishedVersion" | "version:draftSavedSuccessfully" | "version:lastSavedAgo" | "version:modifiedOnly" | "version:moreVersions" | "version:noFurtherVersionsFound" | "version:noLabelGroup" | "version:noRowsFound" | "version:noRowsSelected" | "version:preview" | "version:previouslyDraft" | "version:previouslyPublished" | "version:previousVersion" | "version:problemRestoringVersion" | "version:publish" | "version:publishAllLocales" | "version:publishChanges" | "version:published" | "version:publishIn" | "version:publishing" | "version:restoreAsDraft" | "version:restoredSuccessfully" | "version:restoreThisVersion" | "version:reverting" | "version:revertToPublished" | "version:revertUnsuccessful" | "version:saveDraft" | "version:scheduledSuccessfully" | "version:schedulePublish" | "version:selectLocales" | "version:selectVersionToCompare" | "version:showLocales" | "version:specificVersion" | "version:status" | "version:unpublish" | "version:unpublished" | "version:unpublishedSuccessfully" | "version:unpublishIn" | "version:unpublishing" | "version:versionAgo" | "version:versionID" | "version:versions" | "version:viewingVersion" | "version:viewingVersionGlobal" | "version:viewingVersions" | "version:viewingVersionsGlobal" | "general:aboutToDeleteCount" | "general:editingLabel" | "version:changedFieldsCount">;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Check if a label is a multi-language record.
|
|
139
|
+
*/
|
|
140
|
+
declare function isMultiLang(label: string | Record<string, string>): label is Record<string, string>;
|
|
141
|
+
/**
|
|
142
|
+
* Resolve a potentially multi-language label to a string.
|
|
143
|
+
* Falls back to: lang → fallback → first available value → empty string.
|
|
144
|
+
*/
|
|
145
|
+
declare function resolveLabel(label: string | Record<string, string>, lang: string, fallback?: string): string;
|
|
146
|
+
|
|
147
|
+
export { AdminNav, GroupEditor, IconPicker, NavCustomizer, NavItemEditor, type PluginAdminNavTranslationKeys, SortableGroup, SortableItem, isMultiLang, resolveLabel, useNavPreferences, usePluginTranslation };
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as payload from 'payload';
|
|
3
|
+
import * as _payloadcms_translations from '@payloadcms/translations';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* AdminNav — The main sidebar navigation component.
|
|
7
|
+
* Replaces the default Payload admin nav with the plugin's customizable navigation.
|
|
8
|
+
* Reads per-user preferences from the API, falls back to the defaultNav config.
|
|
9
|
+
*/
|
|
10
|
+
declare const AdminNav: React.FC;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* NavCustomizer — Full drag & drop navigation editor.
|
|
14
|
+
* Allows reordering groups and items, toggling visibility,
|
|
15
|
+
* editing labels/icons/URLs, creating new groups/items.
|
|
16
|
+
*/
|
|
17
|
+
declare const NavCustomizer: React.FC;
|
|
18
|
+
|
|
19
|
+
/** Localizable string — plain string or per-language record */
|
|
20
|
+
type LocalizedString = string | Record<string, string>;
|
|
21
|
+
/** A single navigation item */
|
|
22
|
+
interface NavItemConfig {
|
|
23
|
+
/** Unique item ID (e.g. 'pages', 'posts', 'seo-dashboard') */
|
|
24
|
+
id: string;
|
|
25
|
+
/** Admin URL path (e.g. '/admin/collections/pages') */
|
|
26
|
+
href: string;
|
|
27
|
+
/** Display label (string or { fr: '...', en: '...' }) */
|
|
28
|
+
label: LocalizedString;
|
|
29
|
+
/** Icon name from the built-in icon registry */
|
|
30
|
+
icon: string;
|
|
31
|
+
/** If true, pathname.startsWith(href) activates the item */
|
|
32
|
+
matchPrefix?: boolean;
|
|
33
|
+
/** Nested child items (e.g. ticket status filters) */
|
|
34
|
+
children?: NavItemConfig[];
|
|
35
|
+
/** Whether this item is visible (default: true) */
|
|
36
|
+
visible?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** A navigation group (section with a title) */
|
|
39
|
+
interface NavGroupConfig {
|
|
40
|
+
/** Unique group ID */
|
|
41
|
+
id: string;
|
|
42
|
+
/** Group title displayed as section header (string or { fr: '...', en: '...' }) */
|
|
43
|
+
title: LocalizedString;
|
|
44
|
+
/** Items in this group */
|
|
45
|
+
items: NavItemConfig[];
|
|
46
|
+
/** Whether this group is visible (default: true) */
|
|
47
|
+
visible?: boolean;
|
|
48
|
+
/** Whether this group starts collapsed (default: false) */
|
|
49
|
+
defaultCollapsed?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface SortableGroupProps {
|
|
53
|
+
group: NavGroupConfig;
|
|
54
|
+
children: React.ReactNode;
|
|
55
|
+
onToggleVisibility: (groupId: string) => void;
|
|
56
|
+
onEdit: (group: NavGroupConfig) => void;
|
|
57
|
+
onDelete: (groupId: string) => void;
|
|
58
|
+
}
|
|
59
|
+
declare const SortableGroup: React.FC<SortableGroupProps>;
|
|
60
|
+
|
|
61
|
+
interface SortableItemProps {
|
|
62
|
+
item: NavItemConfig;
|
|
63
|
+
groupId: string;
|
|
64
|
+
onToggleVisibility: (groupId: string, itemId: string) => void;
|
|
65
|
+
onEdit: (item: NavItemConfig, groupId: string) => void;
|
|
66
|
+
onDelete: (groupId: string, itemId: string) => void;
|
|
67
|
+
}
|
|
68
|
+
declare const SortableItem: React.FC<SortableItemProps>;
|
|
69
|
+
|
|
70
|
+
interface GroupEditorProps {
|
|
71
|
+
group?: NavGroupConfig;
|
|
72
|
+
onSave: (group: NavGroupConfig) => void;
|
|
73
|
+
onCancel: () => void;
|
|
74
|
+
}
|
|
75
|
+
declare const GroupEditor: React.FC<GroupEditorProps>;
|
|
76
|
+
|
|
77
|
+
interface NavItemEditorProps {
|
|
78
|
+
item: NavItemConfig;
|
|
79
|
+
onSave: (item: NavItemConfig) => void;
|
|
80
|
+
onCancel: () => void;
|
|
81
|
+
}
|
|
82
|
+
declare const NavItemEditor: React.FC<NavItemEditorProps>;
|
|
83
|
+
|
|
84
|
+
interface IconPickerProps {
|
|
85
|
+
value: string;
|
|
86
|
+
onChange: (icon: string) => void;
|
|
87
|
+
onClose: () => void;
|
|
88
|
+
}
|
|
89
|
+
declare const IconPicker: React.FC<IconPickerProps>;
|
|
90
|
+
|
|
91
|
+
interface UseNavPreferencesReturn {
|
|
92
|
+
/** Current nav layout (user's custom or default) */
|
|
93
|
+
layout: NavGroupConfig[];
|
|
94
|
+
/** Whether the layout is loaded */
|
|
95
|
+
isLoaded: boolean;
|
|
96
|
+
/** Whether a save/reset operation is in progress */
|
|
97
|
+
isSaving: boolean;
|
|
98
|
+
/** Whether the current layout differs from default */
|
|
99
|
+
isCustom: boolean;
|
|
100
|
+
/** Save the current layout to the server */
|
|
101
|
+
save: (groups: NavGroupConfig[]) => Promise<boolean>;
|
|
102
|
+
/** Reset to default layout */
|
|
103
|
+
reset: () => Promise<boolean>;
|
|
104
|
+
/** Reload preferences from server */
|
|
105
|
+
reload: () => Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Hook to fetch, save, and reset nav preferences for the current user.
|
|
109
|
+
* Falls back to the default nav from the plugin config endpoint.
|
|
110
|
+
*
|
|
111
|
+
* Uses a two-tier cache for instant rendering:
|
|
112
|
+
* 1. Module-level variables — survive component re-mounts during SPA
|
|
113
|
+
* navigation (the common case). Available immediately in useState.
|
|
114
|
+
* 2. sessionStorage — survives full page reloads. Read in useEffect
|
|
115
|
+
* (post-hydration) to avoid React hydration mismatch #418.
|
|
116
|
+
*
|
|
117
|
+
* On the server, module vars are null → layout=[] → matches client
|
|
118
|
+
* first render. After the first fetch, module vars are populated →
|
|
119
|
+
* subsequent mounts get instant data (no flash).
|
|
120
|
+
*/
|
|
121
|
+
declare function useNavPreferences(basePath?: string): UseNavPreferencesReturn;
|
|
122
|
+
|
|
123
|
+
/** All translation keys for the plugin-admin-nav namespace */
|
|
124
|
+
type PluginAdminNavTranslationKeys = 'plugin-admin-nav:save' | 'plugin-admin-nav:cancel' | 'plugin-admin-nav:reset' | 'plugin-admin-nav:create' | 'plugin-admin-nav:ok' | 'plugin-admin-nav:close' | 'plugin-admin-nav:show' | 'plugin-admin-nav:hide' | 'plugin-admin-nav:edit' | 'plugin-admin-nav:delete' | 'plugin-admin-nav:addItem' | 'plugin-admin-nav:addGroup' | 'plugin-admin-nav:addSubmenu' | 'plugin-admin-nav:moveUp' | 'plugin-admin-nav:moveDown' | 'plugin-admin-nav:labelField' | 'plugin-admin-nav:urlField' | 'plugin-admin-nav:iconField' | 'plugin-admin-nav:titleField' | 'plugin-admin-nav:idField' | 'plugin-admin-nav:editItem' | 'plugin-admin-nav:editGroup' | 'plugin-admin-nav:newGroup' | 'plugin-admin-nav:customizeTitle' | 'plugin-admin-nav:loading' | 'plugin-admin-nav:saving' | 'plugin-admin-nav:savedSuccess' | 'plugin-admin-nav:saveError' | 'plugin-admin-nav:resetSuccess' | 'plugin-admin-nav:resetError' | 'plugin-admin-nav:dndHint' | 'plugin-admin-nav:deleteGroupConfirm' | 'plugin-admin-nav:resetConfirm' | 'plugin-admin-nav:submenus' | 'plugin-admin-nav:noSubmenus' | 'plugin-admin-nav:noLabel' | 'plugin-admin-nav:newLink' | 'plugin-admin-nav:dashboard' | 'plugin-admin-nav:customize' | 'plugin-admin-nav:matchPrefix' | 'plugin-admin-nav:defaultCollapsed' | 'plugin-admin-nav:searchIcon' | 'plugin-admin-nav:dotColor' | 'plugin-admin-nav:noIconFound' | 'plugin-admin-nav:multiLang' | 'plugin-admin-nav:titlePlaceholder' | 'plugin-admin-nav:idPlaceholder' | 'plugin-admin-nav:childLabelPlaceholder' | 'plugin-admin-nav:childUrlPlaceholder' | 'plugin-admin-nav:childIconPlaceholder' | 'plugin-admin-nav:childIconLabel';
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Typed wrapper around Payload's useTranslation that includes
|
|
128
|
+
* the plugin-admin-nav translation keys.
|
|
129
|
+
*/
|
|
130
|
+
declare const usePluginTranslation: () => {
|
|
131
|
+
i18n: _payloadcms_translations.I18nClient<Record<string, never>, PluginAdminNavTranslationKeys>;
|
|
132
|
+
languageOptions: payload.LanguageOptions;
|
|
133
|
+
switchLanguage?: (lang: _payloadcms_translations.AcceptedLanguages) => Promise<void>;
|
|
134
|
+
t: _payloadcms_translations.TFunction<PluginAdminNavTranslationKeys | "authentication:account" | "authentication:accountOfCurrentUser" | "authentication:accountVerified" | "authentication:alreadyActivated" | "authentication:alreadyLoggedIn" | "authentication:apiKey" | "authentication:authenticated" | "authentication:backToLogin" | "authentication:beginCreateFirstUser" | "authentication:changePassword" | "authentication:checkYourEmailForPasswordReset" | "authentication:confirmGeneration" | "authentication:confirmPassword" | "authentication:createFirstUser" | "authentication:emailNotValid" | "authentication:emailOrUsername" | "authentication:emailSent" | "authentication:emailVerified" | "authentication:enableAPIKey" | "authentication:failedToUnlock" | "authentication:forceUnlock" | "authentication:forgotPassword" | "authentication:forgotPasswordEmailInstructions" | "authentication:forgotPasswordUsernameInstructions" | "authentication:usernameNotValid" | "authentication:forgotPasswordQuestion" | "authentication:generate" | "authentication:generateNewAPIKey" | "authentication:generatingNewAPIKeyWillInvalidate" | "authentication:logBackIn" | "authentication:loggedIn" | "authentication:loggedInChangePassword" | "authentication:loggedOutInactivity" | "authentication:loggedOutSuccessfully" | "authentication:loggingOut" | "authentication:login" | "authentication:logOut" | "authentication:logout" | "authentication:logoutSuccessful" | "authentication:logoutUser" | "authentication:newAPIKeyGenerated" | "authentication:newPassword" | "authentication:passed" | "authentication:passwordResetSuccessfully" | "authentication:resetPassword" | "authentication:stayLoggedIn" | "authentication:successfullyRegisteredFirstUser" | "authentication:successfullyUnlocked" | "authentication:tokenRefreshSuccessful" | "authentication:unableToVerify" | "authentication:username" | "authentication:verified" | "authentication:verifiedSuccessfully" | "authentication:verify" | "authentication:verifyUser" | "authentication:youAreInactive" | "dashboard:addWidget" | "dashboard:deleteWidget" | "dashboard:searchWidgets" | "error:autosaving" | "error:correctInvalidFields" | "error:deletingTitle" | "error:documentNotFound" | "error:emailOrPasswordIncorrect" | "error:insufficientClipboardPermissions" | "error:invalidClipboardData" | "error:invalidFileType" | "error:invalidRequestArgs" | "error:loadingDocument" | "error:logoutFailed" | "error:noMatchedField" | "error:notAllowedToAccessPage" | "error:notAllowedToPerformAction" | "error:previewing" | "error:problemUploadingFile" | "error:restoringTitle" | "error:revertingDocument" | "error:tokenNotProvided" | "error:unableToCopy" | "error:unableToDeleteCount" | "error:unableToReindexCollection" | "error:unableToUpdateCount" | "error:unauthorized" | "error:unauthorizedAdmin" | "error:unknown" | "error:unPublishingDocument" | "error:unspecific" | "error:unverifiedEmail" | "error:userEmailAlreadyRegistered" | "error:usernameAlreadyRegistered" | "error:usernameOrPasswordIncorrect" | "fields:blocks" | "fields:addLabel" | "fields:addLink" | "fields:addNew" | "fields:addNewLabel" | "fields:addRelationship" | "fields:addUpload" | "fields:block" | "fields:blockType" | "fields:chooseBetweenCustomTextOrDocument" | "fields:chooseDocumentToLink" | "fields:chooseFromExisting" | "fields:collapseAll" | "fields:customURL" | "fields:editLink" | "fields:editRelationship" | "fields:enterURL" | "fields:internalLink" | "fields:itemsAndMore" | "fields:labelRelationship" | "fields:latitude" | "fields:linkedTo" | "fields:linkType" | "fields:longitude" | "fields:openInNewTab" | "fields:passwordsDoNotMatch" | "fields:removeRelationship" | "fields:removeUpload" | "fields:saveChanges" | "fields:searchForBlock" | "fields:searchForLanguage" | "fields:selectFieldsToEdit" | "fields:showAll" | "fields:swapRelationship" | "fields:swapUpload" | "fields:textToDisplay" | "fields:toggleBlock" | "fields:uploadNewLabel" | "folder:browseByFolder" | "folder:byFolder" | "folder:deleteFolder" | "folder:folderName" | "folder:folders" | "folder:folderTypeDescription" | "folder:itemHasBeenMoved" | "folder:itemHasBeenMovedToRoot" | "folder:itemsMovedToFolder" | "folder:itemsMovedToRoot" | "folder:moveFolder" | "folder:moveItemsToFolderConfirmation" | "folder:moveItemsToRootConfirmation" | "folder:moveItemToFolderConfirmation" | "folder:moveItemToRootConfirmation" | "folder:movingFromFolder" | "folder:newFolder" | "folder:noFolder" | "folder:renameFolder" | "folder:searchByNameInFolder" | "folder:selectFolderForItem" | "general:items" | "general:of" | "general:language" | "general:dashboard" | "general:error" | "general:username" | "general:notFound" | "general:unauthorized" | "general:newLabel" | "general:saveChanges" | "general:name" | "general:aboutToDelete" | "general:aboutToPermanentlyDelete" | "general:aboutToPermanentlyDeleteTrash" | "general:aboutToRestore" | "general:aboutToRestoreAsDraft" | "general:aboutToRestoreAsDraftCount" | "general:aboutToRestoreCount" | "general:aboutToTrash" | "general:aboutToTrashCount" | "general:addBelow" | "general:addFilter" | "general:adminTheme" | "general:all" | "general:allCollections" | "general:allLocales" | "general:and" | "general:anotherUser" | "general:anotherUserTakenOver" | "general:applyChanges" | "general:ascending" | "general:automatic" | "general:backToDashboard" | "general:cancel" | "general:changesNotSaved" | "general:clear" | "general:clearAll" | "general:close" | "general:collapse" | "general:collections" | "general:columns" | "general:columnToSort" | "general:confirm" | "general:confirmCopy" | "general:confirmDeletion" | "general:confirmDuplication" | "general:confirmMove" | "general:confirmReindex" | "general:confirmReindexAll" | "general:confirmReindexDescription" | "general:confirmReindexDescriptionAll" | "general:confirmRestoration" | "general:copied" | "general:copy" | "general:copyField" | "general:copying" | "general:copyRow" | "general:copyWarning" | "general:create" | "general:created" | "general:createdAt" | "general:createNew" | "general:createNewLabel" | "general:creating" | "general:creatingNewLabel" | "general:currentlyEditing" | "general:custom" | "general:dark" | "general:delete" | "general:deleted" | "general:deletedAt" | "general:deletedCountSuccessfully" | "general:deletedSuccessfully" | "general:deleteLabel" | "general:deletePermanently" | "general:deleting" | "general:depth" | "general:descending" | "general:deselectAllRows" | "general:document" | "general:documentIsTrashed" | "general:documentLocked" | "general:documents" | "general:duplicate" | "general:duplicateWithoutSaving" | "general:edit" | "general:editAll" | "general:editedSince" | "general:editing" | "general:editingTakenOver" | "general:editLabel" | "general:email" | "general:emailAddress" | "general:emptyTrash" | "general:emptyTrashLabel" | "general:enterAValue" | "general:errors" | "general:exitLivePreview" | "general:export" | "general:fallbackToDefaultLocale" | "general:false" | "general:filters" | "general:filterWhere" | "general:globals" | "general:goBack" | "general:groupByLabel" | "general:import" | "general:isEditing" | "general:item" | "general:lastModified" | "general:layout" | "general:leaveAnyway" | "general:leaveWithoutSaving" | "general:light" | "general:livePreview" | "general:loading" | "general:locale" | "general:locales" | "general:lock" | "general:menu" | "general:moreOptions" | "general:move" | "general:moveConfirm" | "general:moveCount" | "general:moveDown" | "general:moveUp" | "general:moving" | "general:movingCount" | "general:next" | "general:no" | "general:noDateSelected" | "general:noFiltersSet" | "general:noLabel" | "general:none" | "general:noOptions" | "general:noResults" | "general:noResultsDescription" | "general:noResultsFound" | "general:nothingFound" | "general:noTrashResults" | "general:noUpcomingEventsScheduled" | "general:noValue" | "general:only" | "general:open" | "general:or" | "general:order" | "general:overwriteExistingData" | "general:pageNotFound" | "general:password" | "general:pasteField" | "general:pasteRow" | "general:payloadSettings" | "general:permanentlyDelete" | "general:permanentlyDeletedCountSuccessfully" | "general:perPage" | "general:previous" | "general:reindex" | "general:reindexingAll" | "general:remove" | "general:rename" | "general:reset" | "general:resetPreferences" | "general:resetPreferencesDescription" | "general:resettingPreferences" | "general:restore" | "general:restoreAsPublished" | "general:restoredCountSuccessfully" | "general:restoring" | "general:row" | "general:rows" | "general:save" | "general:saving" | "general:schedulePublishFor" | "general:searchBy" | "general:select" | "general:selectAll" | "general:selectAllRows" | "general:selectedCount" | "general:selectLabel" | "general:selectValue" | "general:showAllLabel" | "general:sorryNotFound" | "general:sort" | "general:sortByLabelDirection" | "general:stayOnThisPage" | "general:submissionSuccessful" | "general:submit" | "general:submitting" | "general:success" | "general:successfullyCreated" | "general:successfullyDuplicated" | "general:successfullyReindexed" | "general:takeOver" | "general:thisLanguage" | "general:time" | "general:timezone" | "general:titleDeleted" | "general:titleRestored" | "general:titleTrashed" | "general:trash" | "general:trashedCountSuccessfully" | "general:true" | "general:unlock" | "general:unsavedChanges" | "general:unsavedChangesDuplicate" | "general:untitled" | "general:upcomingEvents" | "general:updatedAt" | "general:updatedCountSuccessfully" | "general:updatedLabelSuccessfully" | "general:updatedSuccessfully" | "general:updateForEveryone" | "general:updating" | "general:uploading" | "general:uploadingBulk" | "general:user" | "general:users" | "general:value" | "general:viewing" | "general:viewReadOnly" | "general:welcome" | "general:yes" | "localization:cannotCopySameLocale" | "localization:copyFrom" | "localization:copyFromTo" | "localization:copyTo" | "localization:copyToLocale" | "localization:localeToPublish" | "localization:selectedLocales" | "localization:selectLocaleToCopy" | "localization:selectLocaleToDuplicate" | "operators:contains" | "operators:equals" | "operators:exists" | "operators:intersects" | "operators:near" | "operators:within" | "operators:isGreaterThan" | "operators:isGreaterThanOrEqualTo" | "operators:isIn" | "operators:isLessThan" | "operators:isLessThanOrEqualTo" | "operators:isLike" | "operators:isNotEqualTo" | "operators:isNotIn" | "operators:isNotLike" | "upload:addFile" | "upload:addFiles" | "upload:bulkUpload" | "upload:crop" | "upload:cropToolDescription" | "upload:download" | "upload:dragAndDrop" | "upload:editImage" | "upload:fileName" | "upload:fileSize" | "upload:filesToUpload" | "upload:fileToUpload" | "upload:focalPoint" | "upload:focalPointDescription" | "upload:height" | "upload:noFile" | "upload:pasteURL" | "upload:previewSizes" | "upload:selectCollectionToBrowse" | "upload:selectFile" | "upload:setCropArea" | "upload:setFocalPoint" | "upload:sizes" | "upload:sizesFor" | "upload:width" | "validation:username" | "validation:emailAddress" | "validation:enterNumber" | "validation:fieldHasNo" | "validation:greaterThanMax" | "validation:invalidBlock" | "validation:invalidBlocks" | "validation:invalidInput" | "validation:invalidSelection" | "validation:invalidSelections" | "validation:latitudeOutOfBounds" | "validation:lessThanMin" | "validation:limitReached" | "validation:longerThanMin" | "validation:longitudeOutOfBounds" | "validation:notValidDate" | "validation:required" | "validation:requiresAtLeast" | "validation:requiresNoMoreThan" | "validation:requiresTwoNumbers" | "validation:shorterThanMax" | "validation:timezoneRequired" | "validation:trueOrFalse" | "validation:validUploadID" | "version:version" | "version:aboutToRestore" | "version:restoring" | "version:type" | "version:aboutToPublishSelection" | "version:aboutToRestoreGlobal" | "version:aboutToRevertToPublished" | "version:aboutToUnpublish" | "version:aboutToUnpublishIn" | "version:aboutToUnpublishSelection" | "version:autosave" | "version:autosavedSuccessfully" | "version:autosavedVersion" | "version:changed" | "version:compareVersions" | "version:comparingAgainst" | "version:confirmPublish" | "version:confirmRevertToSaved" | "version:confirmUnpublish" | "version:confirmVersionRestoration" | "version:currentDraft" | "version:currentlyPublished" | "version:currentlyViewing" | "version:currentPublishedVersion" | "version:draft" | "version:draftHasPublishedVersion" | "version:draftSavedSuccessfully" | "version:lastSavedAgo" | "version:modifiedOnly" | "version:moreVersions" | "version:noFurtherVersionsFound" | "version:noLabelGroup" | "version:noRowsFound" | "version:noRowsSelected" | "version:preview" | "version:previouslyDraft" | "version:previouslyPublished" | "version:previousVersion" | "version:problemRestoringVersion" | "version:publish" | "version:publishAllLocales" | "version:publishChanges" | "version:published" | "version:publishIn" | "version:publishing" | "version:restoreAsDraft" | "version:restoredSuccessfully" | "version:restoreThisVersion" | "version:reverting" | "version:revertToPublished" | "version:revertUnsuccessful" | "version:saveDraft" | "version:scheduledSuccessfully" | "version:schedulePublish" | "version:selectLocales" | "version:selectVersionToCompare" | "version:showLocales" | "version:specificVersion" | "version:status" | "version:unpublish" | "version:unpublished" | "version:unpublishedSuccessfully" | "version:unpublishIn" | "version:unpublishing" | "version:versionAgo" | "version:versionID" | "version:versions" | "version:viewingVersion" | "version:viewingVersionGlobal" | "version:viewingVersions" | "version:viewingVersionsGlobal" | "general:aboutToDeleteCount" | "general:editingLabel" | "version:changedFieldsCount">;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Check if a label is a multi-language record.
|
|
139
|
+
*/
|
|
140
|
+
declare function isMultiLang(label: string | Record<string, string>): label is Record<string, string>;
|
|
141
|
+
/**
|
|
142
|
+
* Resolve a potentially multi-language label to a string.
|
|
143
|
+
* Falls back to: lang → fallback → first available value → empty string.
|
|
144
|
+
*/
|
|
145
|
+
declare function resolveLabel(label: string | Record<string, string>, lang: string, fallback?: string): string;
|
|
146
|
+
|
|
147
|
+
export { AdminNav, GroupEditor, IconPicker, NavCustomizer, NavItemEditor, type PluginAdminNavTranslationKeys, SortableGroup, SortableItem, isMultiLang, resolveLabel, useNavPreferences, usePluginTranslation };
|