Skip to content

Commit 5a213c3

Browse files
author
janrozic1
committed
Add option to generate breadcrumb separators dynamically
Update Breadcrumb component to accept a separator generator function as a prop, alongside existing string and slot options. Exports `SeparatorGeneratorFunc` type and refactors internal logic to handle dynamic separator generation. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 6cc5c7da-6689-4391-8349-0b45bd1c8827 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: a64ee559-eaf2-4dd6-beba-6d81591cda0a Replit-Helium-Checkpoint-Created: true
1 parent f1c9147 commit 5a213c3

File tree

3 files changed

+25
-12
lines changed

3 files changed

+25
-12
lines changed

.replit

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@ outputType = "webview"
3333
localPort = 5000
3434
externalPort = 80
3535

36-
[[ports]]
37-
localPort = 42755
38-
externalPort = 3000
39-
4036
[deployment]
4137
deploymentTarget = "static"
4238
build = ["npm", "run", "build"]

components/breadcrumb/Breadcrumb.tsx

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { PropType, ExtractPropTypes } from 'vue';
1+
import type { PropType, ExtractPropTypes, VNode } from 'vue';
22
import { cloneVNode, defineComponent } from 'vue';
33
import PropTypes from '../_util/vue-types';
44
import { flattenChildren, getPropsSlot } from '../_util/props-util';
@@ -16,11 +16,13 @@ export interface Route {
1616
children?: Omit<Route, 'children'>[];
1717
}
1818

19+
export type SeparatorGeneratorFunc = (info: { prevItem: Route | VNode | null; index: number }) => string;
20+
1921
export const breadcrumbProps = () => ({
2022
prefixCls: String,
2123
routes: { type: Array as PropType<Route[]> },
2224
params: PropTypes.any,
23-
separator: PropTypes.any,
25+
separator: [String, Function] as PropType<string | SeparatorGeneratorFunc>,
2426
itemRender: {
2527
type: Function as PropType<
2628
(opt: { route: Route; params: unknown; routes: Route[]; paths: string[] }) => VueNode
@@ -90,7 +92,7 @@ export default defineComponent({
9092
itemRender = defaultItemRender,
9193
}: any) => {
9294
const paths = [];
93-
return routes.map((route: Route) => {
95+
return routes.map((route: Route, index: number) => {
9496
const path = getPath(route.path, params);
9597

9698
if (path) {
@@ -114,7 +116,9 @@ export default defineComponent({
114116
></Menu>
115117
);
116118
}
117-
const itemProps: BreadcrumbItemProps = { separator };
119+
const prevItem = index > 0 ? routes[index - 1] : null;
120+
const itemSeparator = separator(prevItem, index);
121+
const itemProps: BreadcrumbItemProps = { separator: itemSeparator };
118122
if (overlay) {
119123
itemProps.overlay = overlay;
120124
}
@@ -131,15 +135,26 @@ export default defineComponent({
131135
const { routes, params = {} } = props;
132136

133137
const children = flattenChildren(getPropsSlot(slots, props));
134-
const separator = getPropsSlot(slots, props, 'separator') ?? '/';
138+
const separatorProp = props.separator;
139+
const isSeparatorGenerator = typeof separatorProp === 'function';
140+
const separator = isSeparatorGenerator
141+
? separatorProp
142+
: (getPropsSlot(slots, props, 'separator') ?? '/');
143+
144+
const getSeparator = (prevItem: Route | VNode | null, index: number) => {
145+
if (isSeparatorGenerator) {
146+
return (separator as SeparatorGeneratorFunc)({ prevItem, index });
147+
}
148+
return separator;
149+
};
135150

136151
const itemRender = props.itemRender || slots.itemRender || defaultItemRender;
137152
if (routes && routes.length > 0) {
138153
// generated by route
139154
crumbs = genForRoutes({
140155
routes,
141156
params,
142-
separator,
157+
separator: getSeparator,
143158
itemRender,
144159
});
145160
} else if (children.length) {
@@ -150,7 +165,9 @@ export default defineComponent({
150165
'Breadcrumb',
151166
"Only accepts Breadcrumb.Item and Breadcrumb.Separator as it's children",
152167
);
153-
return cloneVNode(element, { separator, key: index });
168+
const prevItem = index > 0 ? children[index - 1] : null;
169+
const itemSeparator = getSeparator(prevItem, index);
170+
return cloneVNode(element, { separator: itemSeparator, key: index });
154171
});
155172
}
156173

components/breadcrumb/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Breadcrumb from './Breadcrumb';
33
import BreadcrumbItem from './BreadcrumbItem';
44
import BreadcrumbSeparator from './BreadcrumbSeparator';
55

6-
export type { BreadcrumbProps } from './Breadcrumb';
6+
export type { BreadcrumbProps, SeparatorGeneratorFunc } from './Breadcrumb';
77
export type { BreadcrumbItemProps } from './BreadcrumbItem';
88
export type { BreadcrumbSeparatorProps } from './BreadcrumbSeparator';
99

0 commit comments

Comments
 (0)