@baklavue/ui 1.0.0 → 1.0.1
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/accordion/Accordion.vue.d.ts +51 -0
- package/dist/accordion/Accordion.vue.d.ts.map +1 -0
- package/dist/accordion/accordion.types.d.ts +97 -0
- package/dist/accordion/accordion.types.d.ts.map +1 -0
- package/dist/accordion/index.d.ts +3 -0
- package/dist/accordion/index.d.ts.map +1 -0
- package/dist/alert/Alert.vue.d.ts +49 -0
- package/dist/alert/Alert.vue.d.ts.map +1 -0
- package/dist/alert/alert.types.d.ts +52 -0
- package/dist/alert/alert.types.d.ts.map +1 -0
- package/dist/alert/index.d.ts +3 -0
- package/dist/alert/index.d.ts.map +1 -0
- package/dist/badge/Badge.vue.d.ts +22 -0
- package/dist/badge/Badge.vue.d.ts.map +1 -0
- package/dist/badge/badge.types.d.ts +7 -0
- package/dist/badge/badge.types.d.ts.map +1 -0
- package/dist/badge/index.d.ts +3 -0
- package/dist/badge/index.d.ts.map +1 -0
- package/dist/banner/Banner.vue.d.ts +36 -0
- package/dist/banner/Banner.vue.d.ts.map +1 -0
- package/dist/banner/banner.types.d.ts +70 -0
- package/dist/banner/banner.types.d.ts.map +1 -0
- package/dist/banner/index.d.ts +3 -0
- package/dist/banner/index.d.ts.map +1 -0
- package/dist/button/Button.vue.d.ts +36 -0
- package/dist/button/Button.vue.d.ts.map +1 -0
- package/dist/button/button.types.d.ts +24 -0
- package/dist/button/button.types.d.ts.map +1 -0
- package/dist/button/index.d.ts +3 -0
- package/dist/button/index.d.ts.map +1 -0
- package/dist/checkbox/Checkbox.vue.d.ts +39 -0
- package/dist/checkbox/Checkbox.vue.d.ts.map +1 -0
- package/dist/checkbox/checkbox.types.d.ts +95 -0
- package/dist/checkbox/checkbox.types.d.ts.map +1 -0
- package/dist/checkbox/index.d.ts +3 -0
- package/dist/checkbox/index.d.ts.map +1 -0
- package/dist/chip/Chip.vue.d.ts +29 -0
- package/dist/chip/Chip.vue.d.ts.map +1 -0
- package/dist/chip/chip.types.d.ts +59 -0
- package/dist/chip/chip.types.d.ts.map +1 -0
- package/dist/chip/index.d.ts +3 -0
- package/dist/chip/index.d.ts.map +1 -0
- package/dist/datepicker/Datepicker.vue.d.ts +41 -0
- package/dist/datepicker/Datepicker.vue.d.ts.map +1 -0
- package/dist/datepicker/datepicker.types.d.ts +38 -0
- package/dist/datepicker/datepicker.types.d.ts.map +1 -0
- package/dist/datepicker/index.d.ts +3 -0
- package/dist/datepicker/index.d.ts.map +1 -0
- package/dist/dialog/Dialog.vue.d.ts +44 -0
- package/dist/dialog/Dialog.vue.d.ts.map +1 -0
- package/dist/dialog/dialog.types.d.ts +18 -0
- package/dist/dialog/dialog.types.d.ts.map +1 -0
- package/dist/dialog/index.d.ts +3 -0
- package/dist/dialog/index.d.ts.map +1 -0
- package/dist/drawer/Drawer.vue.d.ts +42 -0
- package/dist/drawer/Drawer.vue.d.ts.map +1 -0
- package/dist/drawer/drawer.types.d.ts +18 -0
- package/dist/drawer/drawer.types.d.ts.map +1 -0
- package/dist/drawer/index.d.ts +3 -0
- package/dist/drawer/index.d.ts.map +1 -0
- package/dist/dropdown/Dropdown.vue.d.ts +59 -0
- package/dist/dropdown/Dropdown.vue.d.ts.map +1 -0
- package/dist/dropdown/dropdown.types.d.ts +92 -0
- package/dist/dropdown/dropdown.types.d.ts.map +1 -0
- package/dist/dropdown/index.d.ts +3 -0
- package/dist/dropdown/index.d.ts.map +1 -0
- package/dist/file-upload/FileUpload.vue.d.ts +44 -0
- package/dist/file-upload/FileUpload.vue.d.ts.map +1 -0
- package/dist/file-upload/file-upload.types.d.ts +76 -0
- package/dist/file-upload/file-upload.types.d.ts.map +1 -0
- package/dist/file-upload/index.d.ts +3 -0
- package/dist/file-upload/index.d.ts.map +1 -0
- package/dist/icon/Icon.vue.d.ts +29 -0
- package/dist/icon/Icon.vue.d.ts.map +1 -0
- package/dist/icon/icon.types.d.ts +23 -0
- package/dist/icon/icon.types.d.ts.map +1 -0
- package/dist/icon/index.d.ts +3 -0
- package/dist/icon/index.d.ts.map +1 -0
- package/dist/image/Image.vue.d.ts +30 -0
- package/dist/image/Image.vue.d.ts.map +1 -0
- package/dist/image/image.types.d.ts +48 -0
- package/dist/image/image.types.d.ts.map +1 -0
- package/dist/image/index.d.ts +3 -0
- package/dist/image/index.d.ts.map +1 -0
- package/dist/index.css +474 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2404 -0
- package/dist/index.js.map +1 -0
- package/dist/input/Input.vue.d.ts +39 -0
- package/dist/input/Input.vue.d.ts.map +1 -0
- package/dist/input/index.d.ts +3 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/input.types.d.ts +122 -0
- package/dist/input/input.types.d.ts.map +1 -0
- package/dist/link/Link.vue.d.ts +38 -0
- package/dist/link/Link.vue.d.ts.map +1 -0
- package/dist/link/index.d.ts +3 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/link.types.d.ts +40 -0
- package/dist/link/link.types.d.ts.map +1 -0
- package/dist/notification/Notification.vue.d.ts +7 -0
- package/dist/notification/Notification.vue.d.ts.map +1 -0
- package/dist/notification/index.d.ts +3 -0
- package/dist/notification/index.d.ts.map +1 -0
- package/dist/notification/notification.types.d.ts +25 -0
- package/dist/notification/notification.types.d.ts.map +1 -0
- package/dist/pagination/Pagination.vue.d.ts +34 -0
- package/dist/pagination/Pagination.vue.d.ts.map +1 -0
- package/dist/pagination/index.d.ts +3 -0
- package/dist/pagination/index.d.ts.map +1 -0
- package/dist/pagination/pagination.types.d.ts +54 -0
- package/dist/pagination/pagination.types.d.ts.map +1 -0
- package/dist/radio/Radio.vue.d.ts +42 -0
- package/dist/radio/Radio.vue.d.ts.map +1 -0
- package/dist/radio/index.d.ts +3 -0
- package/dist/radio/index.d.ts.map +1 -0
- package/dist/radio/radio.types.d.ts +84 -0
- package/dist/radio/radio.types.d.ts.map +1 -0
- package/dist/scroll-to-top/ScrollToTop.vue.d.ts +14 -0
- package/dist/scroll-to-top/ScrollToTop.vue.d.ts.map +1 -0
- package/dist/scroll-to-top/index.d.ts +3 -0
- package/dist/scroll-to-top/index.d.ts.map +1 -0
- package/dist/scroll-to-top/scroll-to-top.types.d.ts +33 -0
- package/dist/scroll-to-top/scroll-to-top.types.d.ts.map +1 -0
- package/dist/select/Select.vue.d.ts +42 -0
- package/dist/select/Select.vue.d.ts.map +1 -0
- package/dist/select/index.d.ts +3 -0
- package/dist/select/index.d.ts.map +1 -0
- package/dist/select/select.types.d.ts +52 -0
- package/dist/select/select.types.d.ts.map +1 -0
- package/dist/skeleton/Skeleton.vue.d.ts +9 -0
- package/dist/skeleton/Skeleton.vue.d.ts.map +1 -0
- package/dist/skeleton/index.d.ts +3 -0
- package/dist/skeleton/index.d.ts.map +1 -0
- package/dist/skeleton/skeleton.types.d.ts +30 -0
- package/dist/skeleton/skeleton.types.d.ts.map +1 -0
- package/dist/spinner/Spinner.vue.d.ts +8 -0
- package/dist/spinner/Spinner.vue.d.ts.map +1 -0
- package/dist/spinner/index.d.ts +3 -0
- package/dist/spinner/index.d.ts.map +1 -0
- package/dist/spinner/spinner.types.d.ts +12 -0
- package/dist/spinner/spinner.types.d.ts.map +1 -0
- package/dist/split-button/SplitButton.vue.d.ts +25 -0
- package/dist/split-button/SplitButton.vue.d.ts.map +1 -0
- package/dist/split-button/index.d.ts +3 -0
- package/dist/split-button/index.d.ts.map +1 -0
- package/dist/split-button/split-button.types.d.ts +19 -0
- package/dist/split-button/split-button.types.d.ts.map +1 -0
- package/dist/stepper/Stepper.vue.d.ts +30 -0
- package/dist/stepper/Stepper.vue.d.ts.map +1 -0
- package/dist/stepper/index.d.ts +3 -0
- package/dist/stepper/index.d.ts.map +1 -0
- package/dist/stepper/stepper.types.d.ts +29 -0
- package/dist/stepper/stepper.types.d.ts.map +1 -0
- package/dist/switch/Switch.vue.d.ts +32 -0
- package/dist/switch/Switch.vue.d.ts.map +1 -0
- package/dist/switch/index.d.ts +3 -0
- package/dist/switch/index.d.ts.map +1 -0
- package/dist/switch/switch.types.d.ts +14 -0
- package/dist/switch/switch.types.d.ts.map +1 -0
- package/dist/tab/Tab.vue.d.ts +31 -0
- package/dist/tab/Tab.vue.d.ts.map +1 -0
- package/dist/tab/index.d.ts +3 -0
- package/dist/tab/index.d.ts.map +1 -0
- package/dist/tab/tab.types.d.ts +17 -0
- package/dist/tab/tab.types.d.ts.map +1 -0
- package/dist/table/Table.vue.d.ts +181 -0
- package/dist/table/Table.vue.d.ts.map +1 -0
- package/dist/table/index.d.ts +3 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/table.types.d.ts +61 -0
- package/dist/table/table.types.d.ts.map +1 -0
- package/dist/tag/Tag.vue.d.ts +31 -0
- package/dist/tag/Tag.vue.d.ts.map +1 -0
- package/dist/tag/index.d.ts +3 -0
- package/dist/tag/index.d.ts.map +1 -0
- package/dist/tag/tag.types.d.ts +22 -0
- package/dist/tag/tag.types.d.ts.map +1 -0
- package/dist/textarea/Textarea.vue.d.ts +35 -0
- package/dist/textarea/Textarea.vue.d.ts.map +1 -0
- package/dist/textarea/index.d.ts +3 -0
- package/dist/textarea/index.d.ts.map +1 -0
- package/dist/textarea/textarea.types.d.ts +37 -0
- package/dist/textarea/textarea.types.d.ts.map +1 -0
- package/dist/tooltip/Tooltip.vue.d.ts +33 -0
- package/dist/tooltip/Tooltip.vue.d.ts.map +1 -0
- package/dist/tooltip/index.d.ts +3 -0
- package/dist/tooltip/index.d.ts.map +1 -0
- package/dist/tooltip/tooltip.types.d.ts +17 -0
- package/dist/tooltip/tooltip.types.d.ts.map +1 -0
- package/dist/utils/loadBaklavaResources.d.ts +2 -0
- package/dist/utils/loadBaklavaResources.d.ts.map +1 -0
- package/package.json +18 -2
- package/.releaserc.json +0 -14
- package/CHANGELOG.md +0 -88
- package/env.d.ts +0 -5
- package/index.ts +0 -1
- package/src/accordion/Accordion.spec.ts +0 -75
- package/src/accordion/Accordion.vue +0 -206
- package/src/accordion/accordion.types.ts +0 -109
- package/src/accordion/index.ts +0 -3
- package/src/alert/Alert.spec.ts +0 -38
- package/src/alert/Alert.vue +0 -199
- package/src/alert/alert.types.ts +0 -58
- package/src/alert/index.ts +0 -2
- package/src/badge/Badge.spec.ts +0 -28
- package/src/badge/Badge.vue +0 -20
- package/src/badge/badge.types.ts +0 -7
- package/src/badge/index.ts +0 -2
- package/src/banner/Banner.spec.ts +0 -111
- package/src/banner/Banner.vue +0 -265
- package/src/banner/banner.types.ts +0 -86
- package/src/banner/index.ts +0 -2
- package/src/button/Button.spec.ts +0 -51
- package/src/button/Button.vue +0 -45
- package/src/button/button.types.ts +0 -30
- package/src/button/index.ts +0 -3
- package/src/checkbox/Checkbox.spec.ts +0 -216
- package/src/checkbox/Checkbox.vue +0 -148
- package/src/checkbox/checkbox.types.ts +0 -108
- package/src/checkbox/index.ts +0 -2
- package/src/chip/Chip.spec.ts +0 -49
- package/src/chip/Chip.vue +0 -237
- package/src/chip/chip.types.ts +0 -77
- package/src/chip/index.ts +0 -2
- package/src/datepicker/Datepicker.spec.ts +0 -129
- package/src/datepicker/Datepicker.vue +0 -172
- package/src/datepicker/datepicker.types.ts +0 -39
- package/src/datepicker/index.ts +0 -2
- package/src/dialog/Dialog.spec.ts +0 -111
- package/src/dialog/Dialog.vue +0 -178
- package/src/dialog/dialog.types.ts +0 -17
- package/src/dialog/index.ts +0 -2
- package/src/drawer/Drawer.spec.ts +0 -102
- package/src/drawer/Drawer.vue +0 -162
- package/src/drawer/drawer.types.ts +0 -17
- package/src/drawer/index.ts +0 -2
- package/src/dropdown/Dropdown.spec.ts +0 -207
- package/src/dropdown/Dropdown.vue +0 -231
- package/src/dropdown/dropdown.types.ts +0 -110
- package/src/dropdown/index.ts +0 -2
- package/src/file-upload/FileUpload.spec.ts +0 -359
- package/src/file-upload/FileUpload.vue +0 -440
- package/src/file-upload/file-upload.types.ts +0 -89
- package/src/file-upload/index.ts +0 -7
- package/src/icon/Icon.spec.ts +0 -40
- package/src/icon/Icon.vue +0 -102
- package/src/icon/icon.types.ts +0 -25
- package/src/icon/index.ts +0 -2
- package/src/image/Image.spec.ts +0 -23
- package/src/image/Image.vue +0 -144
- package/src/image/image.types.ts +0 -57
- package/src/image/index.ts +0 -3
- package/src/index.ts +0 -43
- package/src/input/Input.spec.ts +0 -69
- package/src/input/Input.vue +0 -148
- package/src/input/index.ts +0 -3
- package/src/input/input.types.ts +0 -156
- package/src/link/Link.spec.ts +0 -69
- package/src/link/Link.vue +0 -133
- package/src/link/index.ts +0 -2
- package/src/link/link.types.ts +0 -42
- package/src/notification/Notification.spec.ts +0 -18
- package/src/notification/Notification.vue +0 -57
- package/src/notification/index.ts +0 -2
- package/src/notification/notification.types.ts +0 -25
- package/src/pagination/Pagination.spec.ts +0 -39
- package/src/pagination/Pagination.vue +0 -137
- package/src/pagination/index.ts +0 -2
- package/src/pagination/pagination.types.ts +0 -61
- package/src/radio/Radio.spec.ts +0 -149
- package/src/radio/Radio.vue +0 -205
- package/src/radio/index.ts +0 -2
- package/src/radio/radio.types.ts +0 -95
- package/src/scroll-to-top/ScrollToTop.spec.ts +0 -119
- package/src/scroll-to-top/ScrollToTop.vue +0 -130
- package/src/scroll-to-top/index.ts +0 -2
- package/src/scroll-to-top/scroll-to-top.types.ts +0 -42
- package/src/select/Select.spec.ts +0 -47
- package/src/select/Select.vue +0 -147
- package/src/select/index.ts +0 -2
- package/src/select/select.types.ts +0 -53
- package/src/skeleton/Skeleton.spec.ts +0 -28
- package/src/skeleton/Skeleton.vue +0 -115
- package/src/skeleton/index.ts +0 -2
- package/src/skeleton/skeleton.types.ts +0 -33
- package/src/spinner/Spinner.spec.ts +0 -28
- package/src/spinner/Spinner.vue +0 -49
- package/src/spinner/index.ts +0 -2
- package/src/spinner/spinner.types.ts +0 -11
- package/src/split-button/SplitButton.spec.ts +0 -24
- package/src/split-button/SplitButton.vue +0 -73
- package/src/split-button/index.ts +0 -2
- package/src/split-button/split-button.types.ts +0 -19
- package/src/stepper/Stepper.spec.ts +0 -37
- package/src/stepper/Stepper.vue +0 -100
- package/src/stepper/index.ts +0 -2
- package/src/stepper/stepper.types.ts +0 -29
- package/src/switch/Switch.spec.ts +0 -30
- package/src/switch/Switch.vue +0 -80
- package/src/switch/index.ts +0 -2
- package/src/switch/switch.types.ts +0 -13
- package/src/tab/Tab.spec.ts +0 -87
- package/src/tab/Tab.vue +0 -99
- package/src/tab/index.ts +0 -2
- package/src/tab/tab.types.ts +0 -17
- package/src/table/Table.spec.ts +0 -185
- package/src/table/Table.vue +0 -264
- package/src/table/index.ts +0 -7
- package/src/table/table.types.ts +0 -62
- package/src/tag/Tag.spec.ts +0 -84
- package/src/tag/Tag.vue +0 -83
- package/src/tag/index.ts +0 -2
- package/src/tag/tag.types.ts +0 -24
- package/src/textarea/Textarea.spec.ts +0 -105
- package/src/textarea/Textarea.vue +0 -84
- package/src/textarea/index.ts +0 -2
- package/src/textarea/textarea.types.ts +0 -37
- package/src/tooltip/Tooltip.spec.ts +0 -46
- package/src/tooltip/Tooltip.vue +0 -81
- package/src/tooltip/index.ts +0 -3
- package/src/tooltip/tooltip.types.ts +0 -29
- package/src/utils/loadBaklavaResources.ts +0 -24
- package/tests/setup.ts +0 -352
- package/tsconfig.json +0 -29
- package/vitest.config.ts +0 -32
package/src/table/Table.spec.ts
DELETED
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { mount } from "@vue/test-utils";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import BvTable from "./Table.vue";
|
|
4
|
-
|
|
5
|
-
describe("BvTable", () => {
|
|
6
|
-
const columns = [
|
|
7
|
-
{ key: "name", label: "Name" },
|
|
8
|
-
{ key: "age", label: "Age" },
|
|
9
|
-
];
|
|
10
|
-
const data = [
|
|
11
|
-
{ id: 1, name: "Alice", age: 30 },
|
|
12
|
-
{ id: 2, name: "Bob", age: 25 },
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
it("renders table with columns and data", () => {
|
|
16
|
-
const wrapper = mount(BvTable, {
|
|
17
|
-
props: { columns, data },
|
|
18
|
-
});
|
|
19
|
-
expect(wrapper.find("bl-table").exists()).toBe(true);
|
|
20
|
-
expect(wrapper.text()).toContain("Alice");
|
|
21
|
-
expect(wrapper.text()).toContain("Bob");
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it("shows loading state when isLoading is true", () => {
|
|
25
|
-
const wrapper = mount(BvTable, {
|
|
26
|
-
props: { columns, data, isLoading: true },
|
|
27
|
-
});
|
|
28
|
-
expect(wrapper.find("bl-table").exists()).toBe(true);
|
|
29
|
-
expect(wrapper.text()).toContain("Loading");
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("shows empty state when data is empty", () => {
|
|
33
|
-
const wrapper = mount(BvTable, {
|
|
34
|
-
props: { columns, data: [] },
|
|
35
|
-
slots: { "empty-state": "No data found" },
|
|
36
|
-
});
|
|
37
|
-
expect(wrapper.text()).toContain("No data found");
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("renders title and header-actions slot", () => {
|
|
41
|
-
const wrapper = mount(BvTable, {
|
|
42
|
-
props: { columns, data, title: "My Table" },
|
|
43
|
-
slots: { "header-actions": "<button>Action</button>" },
|
|
44
|
-
});
|
|
45
|
-
expect(wrapper.find(".header").exists()).toBe(true);
|
|
46
|
-
expect(wrapper.find(".--title").text()).toBe("My Table");
|
|
47
|
-
expect(wrapper.text()).toContain("Action");
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("shows custom loadingText", () => {
|
|
51
|
-
const wrapper = mount(BvTable, {
|
|
52
|
-
props: { columns, data, isLoading: true, loadingText: "Please wait" },
|
|
53
|
-
});
|
|
54
|
-
expect(wrapper.text()).toContain("Please wait");
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("selectable with selected array maps ids to strings", () => {
|
|
58
|
-
const wrapper = mount(BvTable, {
|
|
59
|
-
props: { columns, data, selectable: true, selected: [1, 2] },
|
|
60
|
-
});
|
|
61
|
-
const blTable = wrapper.find("bl-table");
|
|
62
|
-
expect(blTable.exists()).toBe(true);
|
|
63
|
-
// selectable attribute should be set
|
|
64
|
-
expect(blTable.attributes("selectable")).toBeDefined();
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("selectable without selected prop returns empty (s == null branch)", () => {
|
|
68
|
-
const wrapper = mount(BvTable, {
|
|
69
|
-
props: { columns, data, selectable: true },
|
|
70
|
-
});
|
|
71
|
-
const blTable = wrapper.find("bl-table");
|
|
72
|
-
expect(blTable.exists()).toBe(true);
|
|
73
|
-
expect(blTable.attributes("selectable")).toBeDefined();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it("emits sort on bl-sort event", async () => {
|
|
77
|
-
const wrapper = mount(BvTable, {
|
|
78
|
-
props: { columns, data, sortable: true },
|
|
79
|
-
});
|
|
80
|
-
wrapper.find("bl-table").element.dispatchEvent(
|
|
81
|
-
new CustomEvent("bl-sort", { bubbles: true, detail: { sortKey: "name", sortDirection: "asc" } }),
|
|
82
|
-
);
|
|
83
|
-
await wrapper.vm.$nextTick();
|
|
84
|
-
expect(wrapper.emitted("sort")).toHaveLength(1);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it("emits select on bl-row-select event", async () => {
|
|
88
|
-
const wrapper = mount(BvTable, {
|
|
89
|
-
props: { columns, data, selectable: true, selected: [1] },
|
|
90
|
-
});
|
|
91
|
-
wrapper.find("bl-table").element.dispatchEvent(
|
|
92
|
-
new CustomEvent("bl-row-select", { bubbles: true, detail: { selectedRows: [1, 2] } }),
|
|
93
|
-
);
|
|
94
|
-
await wrapper.vm.$nextTick();
|
|
95
|
-
expect(wrapper.emitted("select")).toHaveLength(1);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("renders pagination and emits change on bl-change", async () => {
|
|
99
|
-
const wrapper = mount(BvTable, {
|
|
100
|
-
props: {
|
|
101
|
-
columns,
|
|
102
|
-
data,
|
|
103
|
-
pagination: {
|
|
104
|
-
currentPage: 1,
|
|
105
|
-
totalItems: 50,
|
|
106
|
-
itemsPerPage: 10,
|
|
107
|
-
hasJumper: true,
|
|
108
|
-
jumperLabel: "Jump",
|
|
109
|
-
hasSelect: true,
|
|
110
|
-
selectLabel: "Per page",
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
});
|
|
114
|
-
expect(wrapper.find(".pagination-wrapper").exists()).toBe(true);
|
|
115
|
-
const blPagination = wrapper.find("bl-pagination");
|
|
116
|
-
expect(blPagination.exists()).toBe(true);
|
|
117
|
-
blPagination.element.dispatchEvent(
|
|
118
|
-
new CustomEvent("bl-change", { bubbles: true, detail: { selectedPage: 2 } }),
|
|
119
|
-
);
|
|
120
|
-
await wrapper.vm.$nextTick();
|
|
121
|
-
expect(wrapper.emitted("change")).toHaveLength(1);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it("uses getColumnLabel fallbacks: name > label > key", () => {
|
|
125
|
-
const mixedColumns = [
|
|
126
|
-
{ key: "a", name: "ColName" },
|
|
127
|
-
{ key: "b", label: "ColLabel" },
|
|
128
|
-
{ key: "c" },
|
|
129
|
-
];
|
|
130
|
-
const mixedData = [{ id: 1, a: "v1", b: "v2", c: "v3" }];
|
|
131
|
-
const wrapper = mount(BvTable, {
|
|
132
|
-
props: { columns: mixedColumns, data: mixedData },
|
|
133
|
-
});
|
|
134
|
-
expect(wrapper.text()).toContain("ColName");
|
|
135
|
-
expect(wrapper.text()).toContain("ColLabel");
|
|
136
|
-
expect(wrapper.text()).toContain("c");
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it("uses index as row key when row has no id", () => {
|
|
140
|
-
const noIdData = [
|
|
141
|
-
{ name: "NoId1", age: 20 },
|
|
142
|
-
{ name: "NoId2", age: 22 },
|
|
143
|
-
];
|
|
144
|
-
const wrapper = mount(BvTable, {
|
|
145
|
-
props: { columns, data: noIdData },
|
|
146
|
-
});
|
|
147
|
-
expect(wrapper.text()).toContain("NoId1");
|
|
148
|
-
expect(wrapper.text()).toContain("NoId2");
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it("sortable table with column.sortable false omits sort-key", () => {
|
|
152
|
-
const sortColumns = [
|
|
153
|
-
{ key: "name", label: "Name", sortable: true },
|
|
154
|
-
{ key: "age", label: "Age", sortable: false },
|
|
155
|
-
];
|
|
156
|
-
const wrapper = mount(BvTable, {
|
|
157
|
-
props: { columns: sortColumns, data, sortable: true },
|
|
158
|
-
});
|
|
159
|
-
const headerCells = wrapper.findAll("bl-table-header-cell");
|
|
160
|
-
expect(headerCells[0].attributes("sort-key")).toBe("name");
|
|
161
|
-
expect(headerCells[1].attributes("sort-key")).toBeUndefined();
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it("applies headerOptions sticky and minCellWidth", () => {
|
|
165
|
-
const wrapper = mount(BvTable, {
|
|
166
|
-
props: {
|
|
167
|
-
columns,
|
|
168
|
-
data,
|
|
169
|
-
headerOptions: { sticky: true, minCellWidth: "150px" },
|
|
170
|
-
},
|
|
171
|
-
});
|
|
172
|
-
const header = wrapper.find("bl-table-header");
|
|
173
|
-
expect(header.attributes("sticky")).toBeDefined();
|
|
174
|
-
const cell = wrapper.find("bl-table-header-cell");
|
|
175
|
-
expect(cell.attributes("style")).toContain("150px");
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it("renders with multiple prop", () => {
|
|
179
|
-
const wrapper = mount(BvTable, {
|
|
180
|
-
props: { columns, data, selectable: true, multiple: true, selected: [1] },
|
|
181
|
-
});
|
|
182
|
-
const blTable = wrapper.find("bl-table");
|
|
183
|
-
expect(blTable.attributes("multiple")).toBeDefined();
|
|
184
|
-
});
|
|
185
|
-
});
|
package/src/table/Table.vue
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* Table Component
|
|
4
|
-
*
|
|
5
|
-
* A Vue UI kit component for Baklava's `bl-table` web component for displaying tabular data.
|
|
6
|
-
* Supports columns, data, sorting, row selection, loading/empty states, pagination,
|
|
7
|
-
* and custom slots for header actions, empty state, and per-column cell content.
|
|
8
|
-
*
|
|
9
|
-
* @component
|
|
10
|
-
* @example
|
|
11
|
-
* ```vue
|
|
12
|
-
* <!-- Basic usage -->
|
|
13
|
-
* <template>
|
|
14
|
-
* <BvTable :columns="columns" :data="tableData" />
|
|
15
|
-
* </template>
|
|
16
|
-
* ```
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```vue
|
|
20
|
-
* <!-- With loading and empty states -->
|
|
21
|
-
* <template>
|
|
22
|
-
* <BvTable
|
|
23
|
-
* :columns="columns"
|
|
24
|
-
* :data="tableData"
|
|
25
|
-
* :is-loading="isLoading"
|
|
26
|
-
* >
|
|
27
|
-
* <template #empty-state>
|
|
28
|
-
* <span>No data found</span>
|
|
29
|
-
* </template>
|
|
30
|
-
* </BvTable>
|
|
31
|
-
* </template>
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
import { computed, onMounted, type PropType } from "vue";
|
|
35
|
-
import { loadBaklavaResources } from "../utils/loadBaklavaResources";
|
|
36
|
-
import BvSpinner from "../spinner/Spinner.vue";
|
|
37
|
-
import type {
|
|
38
|
-
TableColumn,
|
|
39
|
-
TableRow,
|
|
40
|
-
TablePaginationProps,
|
|
41
|
-
} from "./table.types";
|
|
42
|
-
|
|
43
|
-
defineOptions({ inheritAttrs: false });
|
|
44
|
-
|
|
45
|
-
const props = defineProps({
|
|
46
|
-
title: { type: String, default: undefined },
|
|
47
|
-
headerOptions: {
|
|
48
|
-
type: Object as PropType<{ sticky?: boolean; minCellWidth?: string }>,
|
|
49
|
-
default: undefined,
|
|
50
|
-
},
|
|
51
|
-
data: { type: Array as PropType<TableRow[]>, default: () => [] },
|
|
52
|
-
columns: { type: Array as PropType<TableColumn[]>, default: undefined },
|
|
53
|
-
sortable: { type: Boolean, default: undefined },
|
|
54
|
-
selectable: { type: Boolean, default: undefined },
|
|
55
|
-
multiple: { type: Boolean, default: undefined },
|
|
56
|
-
selected: {
|
|
57
|
-
type: Array as PropType<(string | number)[]>,
|
|
58
|
-
default: undefined,
|
|
59
|
-
},
|
|
60
|
-
sortKey: { type: String, default: undefined },
|
|
61
|
-
sortDirection: { type: String, default: undefined },
|
|
62
|
-
stickyFirstColumn: { type: Boolean, default: undefined },
|
|
63
|
-
stickyLastColumn: { type: Boolean, default: undefined },
|
|
64
|
-
isLoading: { type: Boolean, default: undefined },
|
|
65
|
-
pagination: {
|
|
66
|
-
type: Object as PropType<TablePaginationProps>,
|
|
67
|
-
default: undefined,
|
|
68
|
-
},
|
|
69
|
-
loadingText: { type: String, default: "Loading..." },
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
const emit = defineEmits<{
|
|
73
|
-
/**
|
|
74
|
-
* Emitted when a row is clicked.
|
|
75
|
-
* @param {CustomEvent} event - The bl-row-click event.
|
|
76
|
-
*/
|
|
77
|
-
"row-click": [event: CustomEvent];
|
|
78
|
-
/**
|
|
79
|
-
* Emitted when table sort options change.
|
|
80
|
-
* @param {CustomEvent} event - The bl-sort event.
|
|
81
|
-
*/
|
|
82
|
-
sort: [event: CustomEvent];
|
|
83
|
-
/**
|
|
84
|
-
* Emitted when selected rows change.
|
|
85
|
-
* @param {CustomEvent} event - The bl-row-select event.
|
|
86
|
-
*/
|
|
87
|
-
select: [event: CustomEvent];
|
|
88
|
-
/**
|
|
89
|
-
* Emitted when pagination changes.
|
|
90
|
-
* @param {CustomEvent} event - The bl-change event with selectedPage, prevPage, itemsPerPage.
|
|
91
|
-
*/
|
|
92
|
-
change: [event: CustomEvent];
|
|
93
|
-
}>();
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Baklava table expects selected IDs to always be strings,
|
|
97
|
-
* even when the actual data IDs might be numbers.
|
|
98
|
-
*/
|
|
99
|
-
const selectedIdsAsStrings = computed(() => {
|
|
100
|
-
const s = props.selected;
|
|
101
|
-
if (s == null || !Array.isArray(s)) return [];
|
|
102
|
-
return s.map((id) => String(id));
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
/** Column header text: prefer name, then label, then key */
|
|
106
|
-
const getColumnLabel = (col: { key: string; label?: string; name?: string }) =>
|
|
107
|
-
col.name ?? col.label ?? col.key;
|
|
108
|
-
|
|
109
|
-
/** Row key for :key and selection-key: prefer row.id, fallback to index */
|
|
110
|
-
const getRowKey = (row: Record<string, unknown> & { id?: string | number }, index: number) =>
|
|
111
|
-
row.id != null ? String(row.id) : String(index);
|
|
112
|
-
|
|
113
|
-
onMounted(() => {
|
|
114
|
-
loadBaklavaResources();
|
|
115
|
-
});
|
|
116
|
-
</script>
|
|
117
|
-
|
|
118
|
-
<template>
|
|
119
|
-
<div class="table">
|
|
120
|
-
<div v-if="props.title" class="header">
|
|
121
|
-
<span class="--title">{{ props.title }}</span>
|
|
122
|
-
<slot name="header-actions" />
|
|
123
|
-
</div>
|
|
124
|
-
|
|
125
|
-
<div class="table-content">
|
|
126
|
-
<!-- Loading state -->
|
|
127
|
-
<bl-table v-if="props.isLoading">
|
|
128
|
-
<div class="loading-state">
|
|
129
|
-
<BvSpinner />
|
|
130
|
-
<span>{{ props.loadingText }}</span>
|
|
131
|
-
</div>
|
|
132
|
-
</bl-table>
|
|
133
|
-
|
|
134
|
-
<!-- Empty state -->
|
|
135
|
-
<bl-table v-else-if="!props.data?.length">
|
|
136
|
-
<div class="empty-state">
|
|
137
|
-
<slot name="empty-state" />
|
|
138
|
-
</div>
|
|
139
|
-
</bl-table>
|
|
140
|
-
|
|
141
|
-
<!-- Data table -->
|
|
142
|
-
<bl-table
|
|
143
|
-
v-else
|
|
144
|
-
v-bind="{
|
|
145
|
-
sortable: props.sortable === true ? true : undefined,
|
|
146
|
-
selectable: props.selectable === true ? true : undefined,
|
|
147
|
-
multiple: props.multiple === true ? true : undefined,
|
|
148
|
-
...(props.selectable && { selected: selectedIdsAsStrings }),
|
|
149
|
-
sortKey: props.sortKey,
|
|
150
|
-
sortDirection: props.sortDirection,
|
|
151
|
-
stickyFirstColumn: props.stickyFirstColumn,
|
|
152
|
-
stickyLastColumn: props.stickyLastColumn,
|
|
153
|
-
}"
|
|
154
|
-
@bl-sort="emit('sort', $event)"
|
|
155
|
-
@bl-row-select="emit('select', $event)"
|
|
156
|
-
>
|
|
157
|
-
<bl-table-header :sticky="props.headerOptions?.sticky">
|
|
158
|
-
<bl-table-row>
|
|
159
|
-
<bl-table-header-cell
|
|
160
|
-
v-for="column in props.columns"
|
|
161
|
-
:key="column.key"
|
|
162
|
-
:sort-key="
|
|
163
|
-
props.sortable && column.sortable !== false ? column.key : undefined
|
|
164
|
-
"
|
|
165
|
-
:style="{
|
|
166
|
-
'--bl-table-header-cell-min-width':
|
|
167
|
-
props.headerOptions?.minCellWidth || '100px',
|
|
168
|
-
}"
|
|
169
|
-
>
|
|
170
|
-
{{ getColumnLabel(column) }}
|
|
171
|
-
</bl-table-header-cell>
|
|
172
|
-
</bl-table-row>
|
|
173
|
-
</bl-table-header>
|
|
174
|
-
|
|
175
|
-
<bl-table-body>
|
|
176
|
-
<bl-table-row
|
|
177
|
-
v-for="(row, index) in props.data"
|
|
178
|
-
:key="getRowKey(row, index)"
|
|
179
|
-
:selection-key="props.selectable ? getRowKey(row, index) : undefined"
|
|
180
|
-
>
|
|
181
|
-
<bl-table-cell v-for="column in props.columns" :key="column.key">
|
|
182
|
-
<slot
|
|
183
|
-
:name="column.key"
|
|
184
|
-
:row="row"
|
|
185
|
-
:value="row[column.key]"
|
|
186
|
-
>
|
|
187
|
-
{{ row[column.key] }}
|
|
188
|
-
</slot>
|
|
189
|
-
</bl-table-cell>
|
|
190
|
-
</bl-table-row>
|
|
191
|
-
</bl-table-body>
|
|
192
|
-
</bl-table>
|
|
193
|
-
</div>
|
|
194
|
-
|
|
195
|
-
<div v-if="props.pagination" class="pagination-wrapper">
|
|
196
|
-
<bl-pagination
|
|
197
|
-
:current-page="props.pagination!.currentPage"
|
|
198
|
-
:total-items="props.pagination!.totalItems"
|
|
199
|
-
:items-per-page="props.pagination!.itemsPerPage"
|
|
200
|
-
:has-jumper="props.pagination!.hasJumper ?? undefined"
|
|
201
|
-
:has-select="props.pagination!.hasSelect ?? undefined"
|
|
202
|
-
:jumper-label="props.pagination!.jumperLabel ?? 'Go to page'"
|
|
203
|
-
:select-label="props.pagination!.selectLabel ?? 'Items per page'"
|
|
204
|
-
:items-per-page-options="props.pagination!.itemsPerPageOptions"
|
|
205
|
-
@bl-change="emit('change', $event)"
|
|
206
|
-
/>
|
|
207
|
-
</div>
|
|
208
|
-
</div>
|
|
209
|
-
</template>
|
|
210
|
-
|
|
211
|
-
<style lang="css" scoped>
|
|
212
|
-
.table {
|
|
213
|
-
display: flex;
|
|
214
|
-
flex-direction: column;
|
|
215
|
-
gap: 24px;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
.header {
|
|
219
|
-
display: flex;
|
|
220
|
-
align-items: center;
|
|
221
|
-
justify-content: space-between;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
.--title {
|
|
225
|
-
font: var(--bl-font-title-1-medium);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
.table-content {
|
|
229
|
-
width: 100%;
|
|
230
|
-
overflow-x: auto;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
.table-content > bl-table {
|
|
234
|
-
min-width: max-content;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
.loading-state {
|
|
238
|
-
display: flex;
|
|
239
|
-
flex-direction: column;
|
|
240
|
-
align-items: center;
|
|
241
|
-
justify-content: center;
|
|
242
|
-
padding: 48px;
|
|
243
|
-
gap: 16px;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
.loading-state span {
|
|
247
|
-
font: var(--bl-font-body-2-regular);
|
|
248
|
-
color: var(--bl-color-primary);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
.empty-state {
|
|
252
|
-
display: flex;
|
|
253
|
-
flex-direction: column;
|
|
254
|
-
align-items: center;
|
|
255
|
-
justify-content: center;
|
|
256
|
-
padding: 48px;
|
|
257
|
-
gap: 12px;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
.pagination-wrapper {
|
|
261
|
-
display: flex;
|
|
262
|
-
justify-content: flex-end;
|
|
263
|
-
}
|
|
264
|
-
</style>
|
package/src/table/index.ts
DELETED
package/src/table/table.types.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { ItemsPerPageOption } from "../pagination/pagination.types";
|
|
2
|
-
|
|
3
|
-
/** Table column definition */
|
|
4
|
-
export interface TableColumn {
|
|
5
|
-
key: string;
|
|
6
|
-
/** Column header text (alias: use `name` or `label`) */
|
|
7
|
-
label?: string;
|
|
8
|
-
/** Column header text (alias: use `name` or `label`) */
|
|
9
|
-
name?: string;
|
|
10
|
-
sortable?: boolean;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/** Table row data (record of column keys to values). When selectable, rows should have `id`. */
|
|
14
|
-
export type TableRow = Record<string, unknown> & { id?: string | number };
|
|
15
|
-
|
|
16
|
-
/** Pagination props for table integration */
|
|
17
|
-
export interface TablePaginationProps {
|
|
18
|
-
currentPage: number;
|
|
19
|
-
totalItems: number;
|
|
20
|
-
itemsPerPage: number;
|
|
21
|
-
hasJumper?: boolean;
|
|
22
|
-
jumperLabel?: string;
|
|
23
|
-
hasSelect?: boolean;
|
|
24
|
-
selectLabel?: string;
|
|
25
|
-
itemsPerPageOptions?: ItemsPerPageOption[];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface TableProps {
|
|
29
|
-
/** Optional title displayed above the table */
|
|
30
|
-
title?: string;
|
|
31
|
-
/** Header options: sticky, minCellWidth */
|
|
32
|
-
headerOptions?: {
|
|
33
|
-
sticky?: boolean;
|
|
34
|
-
minCellWidth?: string;
|
|
35
|
-
};
|
|
36
|
-
/** Table data rows */
|
|
37
|
-
data?: TableRow[];
|
|
38
|
-
/** Column definitions */
|
|
39
|
-
columns?: TableColumn[];
|
|
40
|
-
/** Enable column sorting */
|
|
41
|
-
sortable?: boolean;
|
|
42
|
-
/** Enable row selection */
|
|
43
|
-
selectable?: boolean;
|
|
44
|
-
/** Enable multiple row selection */
|
|
45
|
-
multiple?: boolean;
|
|
46
|
-
/** Selected row selection keys (use with v-model:selected when selectable). Accepts string or number ids. */
|
|
47
|
-
selected?: (string | number)[];
|
|
48
|
-
/** Sort key for the sorted column */
|
|
49
|
-
sortKey?: string;
|
|
50
|
-
/** Sort direction: '' | 'asc' | 'desc' */
|
|
51
|
-
sortDirection?: string;
|
|
52
|
-
/** Make first column sticky */
|
|
53
|
-
stickyFirstColumn?: boolean;
|
|
54
|
-
/** Make last column sticky */
|
|
55
|
-
stickyLastColumn?: boolean;
|
|
56
|
-
/** Show loading state */
|
|
57
|
-
isLoading?: boolean;
|
|
58
|
-
/** Pagination configuration */
|
|
59
|
-
pagination?: TablePaginationProps;
|
|
60
|
-
/** Text shown in loading state */
|
|
61
|
-
loadingText?: string;
|
|
62
|
-
}
|
package/src/tag/Tag.spec.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { mount } from "@vue/test-utils";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import BvTag from "./Tag.vue";
|
|
4
|
-
|
|
5
|
-
describe("BvTag", () => {
|
|
6
|
-
it("renders with default props", () => {
|
|
7
|
-
const wrapper = mount(BvTag);
|
|
8
|
-
expect(wrapper.find("bl-tag").exists()).toBe(true);
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it("passes variant and size to bl-tag", () => {
|
|
12
|
-
const wrapper = mount(BvTag, {
|
|
13
|
-
props: { variant: "selectable", size: "small" },
|
|
14
|
-
});
|
|
15
|
-
const el = wrapper.find("bl-tag").element;
|
|
16
|
-
expect(el.getAttribute("variant")).toBe("selectable");
|
|
17
|
-
expect(el.getAttribute("size")).toBe("small");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it("emits close when closable tag receives bl-tag-click", async () => {
|
|
21
|
-
const wrapper = mount(BvTag, { props: { closable: true } });
|
|
22
|
-
wrapper.find("bl-tag").element.dispatchEvent(
|
|
23
|
-
new CustomEvent("bl-tag-click", {
|
|
24
|
-
bubbles: true,
|
|
25
|
-
detail: { value: null, selected: false },
|
|
26
|
-
}),
|
|
27
|
-
);
|
|
28
|
-
await wrapper.vm.$nextTick();
|
|
29
|
-
expect(wrapper.emitted("close")).toHaveLength(1);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("renders slot content", () => {
|
|
33
|
-
const wrapper = mount(BvTag, { slots: { default: "Tag label" } });
|
|
34
|
-
expect(wrapper.text()).toContain("Tag label");
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("maps closable prop to variant='removable' on bl-tag", () => {
|
|
38
|
-
const wrapper = mount(BvTag, { props: { closable: true } });
|
|
39
|
-
const el = wrapper.find("bl-tag").element;
|
|
40
|
-
expect(el.getAttribute("variant")).toBe("removable");
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it("emits update:selected when selectable tag receives bl-tag-click", async () => {
|
|
44
|
-
const wrapper = mount(BvTag, { props: { variant: "selectable" } });
|
|
45
|
-
wrapper.find("bl-tag").element.dispatchEvent(
|
|
46
|
-
new CustomEvent("bl-tag-click", {
|
|
47
|
-
bubbles: true,
|
|
48
|
-
detail: { value: "tag1", selected: true },
|
|
49
|
-
}),
|
|
50
|
-
);
|
|
51
|
-
await wrapper.vm.$nextTick();
|
|
52
|
-
expect(wrapper.emitted("update:selected")).toEqual([[true]]);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("does not emit close or update:selected for non-closable non-selectable tag click", async () => {
|
|
56
|
-
const wrapper = mount(BvTag);
|
|
57
|
-
wrapper.find("bl-tag").element.dispatchEvent(
|
|
58
|
-
new CustomEvent("bl-tag-click", {
|
|
59
|
-
bubbles: true,
|
|
60
|
-
detail: { value: null, selected: false },
|
|
61
|
-
}),
|
|
62
|
-
);
|
|
63
|
-
await wrapper.vm.$nextTick();
|
|
64
|
-
expect(wrapper.emitted("close")).toBeUndefined();
|
|
65
|
-
expect(wrapper.emitted("update:selected")).toBeUndefined();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("renders icon slot when provided", () => {
|
|
69
|
-
const wrapper = mount(BvTag, {
|
|
70
|
-
slots: { icon: "<span class=\"test-icon\">icon</span>", default: "Label" },
|
|
71
|
-
});
|
|
72
|
-
expect(wrapper.find(".test-icon").exists()).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("passes disabled, selected, and value props through to bl-tag", () => {
|
|
76
|
-
const wrapper = mount(BvTag, {
|
|
77
|
-
props: { disabled: true, selected: true, value: "my-val" },
|
|
78
|
-
});
|
|
79
|
-
const el = wrapper.find("bl-tag").element;
|
|
80
|
-
expect(el.getAttribute("disabled")).toBe("true");
|
|
81
|
-
expect(el.getAttribute("selected")).toBe("true");
|
|
82
|
-
expect(el.getAttribute("value")).toBe("my-val");
|
|
83
|
-
});
|
|
84
|
-
});
|
package/src/tag/Tag.vue
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* Tag Component
|
|
4
|
-
*
|
|
5
|
-
* A Vue UI kit component for Baklava's `bl-tag` web component for displaying tags or labels.
|
|
6
|
-
* Supports selectable and removable (closable) variants, sizes, and icons.
|
|
7
|
-
*
|
|
8
|
-
* @component
|
|
9
|
-
* @example
|
|
10
|
-
* ```vue
|
|
11
|
-
* <!-- Basic usage -->
|
|
12
|
-
* <template>
|
|
13
|
-
* <BvTag>Label</BvTag>
|
|
14
|
-
* </template>
|
|
15
|
-
* ```
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```vue
|
|
19
|
-
* <!-- Closable tag -->
|
|
20
|
-
* <template>
|
|
21
|
-
* <BvTag closable @close="removeTag">Removable</BvTag>
|
|
22
|
-
* </template>
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```vue
|
|
27
|
-
* <!-- With icon -->
|
|
28
|
-
* <template>
|
|
29
|
-
* <BvTag icon="info">With icon</BvTag>
|
|
30
|
-
* </template>
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
import { onMounted } from "vue";
|
|
34
|
-
import { loadBaklavaResources } from "../utils/loadBaklavaResources";
|
|
35
|
-
import type { TagProps } from "./tag.types";
|
|
36
|
-
|
|
37
|
-
const props = withDefaults(defineProps<TagProps>(), {
|
|
38
|
-
variant: undefined,
|
|
39
|
-
size: undefined,
|
|
40
|
-
closable: undefined,
|
|
41
|
-
icon: undefined,
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
const emit = defineEmits<{
|
|
45
|
-
/**
|
|
46
|
-
* Emitted when the close button is clicked (removable/closable variant only).
|
|
47
|
-
*/
|
|
48
|
-
close: [];
|
|
49
|
-
/**
|
|
50
|
-
* Emitted when a selectable tag is clicked. Payload contains the new selected state.
|
|
51
|
-
*/
|
|
52
|
-
"update:selected": [selected: boolean];
|
|
53
|
-
}>();
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Handles bl-tag-click. For removable variant, emit 'close'. For selectable, emit 'update:selected'.
|
|
57
|
-
*/
|
|
58
|
-
const handleTagClick = (event: CustomEvent<{ value: string | null; selected: boolean }>) => {
|
|
59
|
-
if (props.closable) {
|
|
60
|
-
emit("close");
|
|
61
|
-
} else if (props.variant === "selectable" && event.detail) {
|
|
62
|
-
emit("update:selected", event.detail.selected);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
onMounted(() => {
|
|
67
|
-
loadBaklavaResources();
|
|
68
|
-
});
|
|
69
|
-
</script>
|
|
70
|
-
|
|
71
|
-
<template>
|
|
72
|
-
<bl-tag
|
|
73
|
-
v-bind="{
|
|
74
|
-
...props,
|
|
75
|
-
variant: props.closable ? 'removable' : props.variant,
|
|
76
|
-
closable: undefined,
|
|
77
|
-
}"
|
|
78
|
-
@bl-tag-click="handleTagClick"
|
|
79
|
-
>
|
|
80
|
-
<slot v-if="$slots['icon']" name="icon" />
|
|
81
|
-
<slot />
|
|
82
|
-
</bl-tag>
|
|
83
|
-
</template>
|
package/src/tag/index.ts
DELETED