@leaflink/stash 52.0.2 → 53.0.0
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/README.md +50 -49
- package/dist/Accordion.js +16 -16
- package/dist/Accordion.js.map +1 -1
- package/dist/AccordionGroup.js +7 -7
- package/dist/AccordionGroup.js.map +1 -1
- package/dist/ActionsDropdown.js +16 -16
- package/dist/ActionsDropdown.js.map +1 -1
- package/dist/AddressSelect.js.map +1 -1
- package/dist/AddressSelect.vue.d.ts +1 -1
- package/dist/Alert.js +34 -34
- package/dist/Alert.js.map +1 -1
- package/dist/AppNavigationItem.js +31 -31
- package/dist/AppNavigationItem.js.map +1 -1
- package/dist/AppSidebar.js +19 -19
- package/dist/AppSidebar.js.map +1 -1
- package/dist/AppTopbar.js +32 -32
- package/dist/AppTopbar.js.map +1 -1
- package/dist/Avatar.js +18 -18
- package/dist/Avatar.js.map +1 -1
- package/dist/Backdrop.js +5 -5
- package/dist/Backdrop.js.map +1 -1
- package/dist/Badge.js +38 -38
- package/dist/Badge.js.map +1 -1
- package/dist/Box.js +1 -1
- package/dist/{Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js → Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js} +6 -6
- package/dist/{Box.vue_vue_type_script_setup_true_lang-rFnvwLVY.js.map → Box.vue_vue_type_script_setup_true_lang-dFFZN40_.js.map} +1 -1
- package/dist/Button.js +21 -21
- package/dist/Button.js.map +1 -1
- package/dist/ButtonGroup.js +26 -26
- package/dist/ButtonGroup.js.map +1 -1
- package/dist/Card.js +14 -14
- package/dist/Card.js.map +1 -1
- package/dist/CardContent.js +1 -1
- package/dist/CardContent.js.map +1 -1
- package/dist/CardFooter.js +1 -1
- package/dist/CardFooter.js.map +1 -1
- package/dist/CardHeader.js +4 -4
- package/dist/CardHeader.js.map +1 -1
- package/dist/CardMedia.js +20 -20
- package/dist/CardMedia.js.map +1 -1
- package/dist/Carousel.js +88 -93
- package/dist/Carousel.js.map +1 -1
- package/dist/Checkbox.js +30 -30
- package/dist/Checkbox.js.map +1 -1
- package/dist/Checkbox.vue.d.ts +0 -3
- package/dist/Chip.js +33 -33
- package/dist/Chip.js.map +1 -1
- package/dist/ConfirmationCodeInput.js +72 -72
- package/dist/ConfirmationCodeInput.js.map +1 -1
- package/dist/ContextSwitcher.js +27 -27
- package/dist/ContextSwitcher.js.map +1 -1
- package/dist/Copy.js +47 -48
- package/dist/Copy.js.map +1 -1
- package/dist/CurrencyInput.js +1 -1
- package/dist/CurrencyInput.js.map +1 -1
- package/dist/CurrencyInput.vue.d.ts +5 -5
- package/dist/DataView.js +23 -23
- package/dist/DataView.js.map +1 -1
- package/dist/DataViewFilters.js +26 -26
- package/dist/DataViewFilters.js.map +1 -1
- package/dist/DataViewSortButton.js +22 -22
- package/dist/DataViewSortButton.js.map +1 -1
- package/dist/DataViewToolbar.js +52 -52
- package/dist/DataViewToolbar.js.map +1 -1
- package/dist/DatePicker.js +10 -10
- package/dist/DatePicker.js.map +1 -1
- package/dist/DescriptionList.js +2 -2
- package/dist/DescriptionList.js.map +1 -1
- package/dist/DescriptionListDetail.js +2 -2
- package/dist/DescriptionListDetail.js.map +1 -1
- package/dist/DescriptionListGroup.js +9 -9
- package/dist/DescriptionListGroup.js.map +1 -1
- package/dist/DescriptionListTerm.js +8 -8
- package/dist/DescriptionListTerm.js.map +1 -1
- package/dist/Dialog.js +47 -47
- package/dist/Dialog.js.map +1 -1
- package/dist/Divider.js +6 -6
- package/dist/Divider.js.map +1 -1
- package/dist/Dropdown.js +20 -20
- package/dist/Dropdown.js.map +1 -1
- package/dist/EmptyState.js +26 -26
- package/dist/EmptyState.js.map +1 -1
- package/dist/Field.js +1 -1
- package/dist/{Field.vue_vue_type_script_setup_true_lang-DI6z3AE9.js → Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js} +17 -17
- package/dist/Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js.map +1 -0
- package/dist/FileUpload.js +47 -49
- package/dist/FileUpload.js.map +1 -1
- package/dist/FilterChip.js +20 -20
- package/dist/FilterChip.js.map +1 -1
- package/dist/FilterDrawerItem.js +13 -13
- package/dist/FilterDrawerItem.js.map +1 -1
- package/dist/FilterDropdown.js +27 -27
- package/dist/FilterDropdown.js.map +1 -1
- package/dist/FilterSelect.js +33 -33
- package/dist/FilterSelect.js.map +1 -1
- package/dist/Filters.js +29 -29
- package/dist/Filters.js.map +1 -1
- package/dist/Filters.vue.d.ts +2 -8
- package/dist/HttpError.js +29 -29
- package/dist/HttpError.js.map +1 -1
- package/dist/HttpError.vue.d.ts +0 -3
- package/dist/Icon.js +12 -12
- package/dist/Icon.js.map +1 -1
- package/dist/IconLabel.js +19 -19
- package/dist/IconLabel.js.map +1 -1
- package/dist/IconLabel.vue.d.ts +1 -1
- package/dist/Illustration.js +2 -2
- package/dist/{Illustration.vue_vue_type_script_setup_true_lang-BrqEF8xe.js → Illustration.vue_vue_type_script_setup_true_lang-C1bPkWZZ.js} +4 -4
- package/dist/{Illustration.vue_vue_type_script_setup_true_lang-BrqEF8xe.js.map → Illustration.vue_vue_type_script_setup_true_lang-C1bPkWZZ.js.map} +1 -1
- package/dist/Image.js +2 -2
- package/dist/Image.vue.d.ts +0 -3
- package/dist/{Image.vue_vue_type_script_setup_true_lang-D5u4av0_.js → Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js} +11 -11
- package/dist/Image.vue_vue_type_script_setup_true_lang-CAj0FH9h.js.map +1 -0
- package/dist/InlineEdit.js +8 -8
- package/dist/InlineEdit.js.map +1 -1
- package/dist/Input.js +29 -29
- package/dist/Input.js.map +1 -1
- package/dist/InputOptions.js +87 -84
- package/dist/InputOptions.js.map +1 -1
- package/dist/InputOptions.vue.d.ts +2 -2
- package/dist/IntegrationIcon.js +11 -11
- package/dist/IntegrationIcon.js.map +1 -1
- package/dist/Label.js +1 -1
- package/dist/{Label.vue_vue_type_script_setup_true_lang-CNquF3AP.js → Label.vue_vue_type_script_setup_true_lang-xwY3X-iV.js} +16 -16
- package/dist/{Label.vue_vue_type_script_setup_true_lang-CNquF3AP.js.map → Label.vue_vue_type_script_setup_true_lang-xwY3X-iV.js.map} +1 -1
- package/dist/ListItem.js +14 -14
- package/dist/ListItem.js.map +1 -1
- package/dist/ListItem.vue.d.ts +0 -6
- package/dist/ListItemCell.js +9 -9
- package/dist/ListItemCell.js.map +1 -1
- package/dist/ListView.js +138 -141
- package/dist/ListView.js.map +1 -1
- package/dist/ListView.vue.d.ts +2 -26
- package/dist/Loading.js +8 -8
- package/dist/Loading.js.map +1 -1
- package/dist/Logo.js +1 -1
- package/dist/{Logo.vue_vue_type_script_setup_true_lang-Dz8c98sc.js → Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js} +3 -3
- package/dist/{Logo.vue_vue_type_script_setup_true_lang-Dz8c98sc.js.map → Logo.vue_vue_type_script_setup_true_lang-DghNC_k6.js.map} +1 -1
- package/dist/Menu.js +5 -5
- package/dist/Menu.js.map +1 -1
- package/dist/MenuItem.js +12 -12
- package/dist/MenuItem.js.map +1 -1
- package/dist/Metric.js +24 -24
- package/dist/Metric.js.map +1 -1
- package/dist/Modal.js +60 -60
- package/dist/Modal.js.map +1 -1
- package/dist/Modals.js +1 -1
- package/dist/Modals.js.map +1 -1
- package/dist/Module.js +6 -6
- package/dist/Module.js.map +1 -1
- package/dist/ModuleContent.js +16 -16
- package/dist/ModuleContent.js.map +1 -1
- package/dist/ModuleFooter.js +13 -13
- package/dist/ModuleFooter.js.map +1 -1
- package/dist/ModuleHeader.js +29 -29
- package/dist/ModuleHeader.js.map +1 -1
- package/dist/MoreActions.js +81 -84
- package/dist/MoreActions.js.map +1 -1
- package/dist/ObfuscateText.js +4 -4
- package/dist/ObfuscateText.js.map +1 -1
- package/dist/PageContent.js +13 -13
- package/dist/PageContent.js.map +1 -1
- package/dist/PageHeader.js +28 -28
- package/dist/PageHeader.js.map +1 -1
- package/dist/PageNavigation.js +1 -1
- package/dist/Paginate.js +45 -45
- package/dist/Paginate.js.map +1 -1
- package/dist/QuickAction.js +18 -18
- package/dist/QuickAction.js.map +1 -1
- package/dist/Radio.js +17 -17
- package/dist/Radio.js.map +1 -1
- package/dist/RadioGroup.js +158 -154
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioNew.js +80 -80
- package/dist/RadioNew.js.map +1 -1
- package/dist/RadioNew.vue.d.ts +0 -3
- package/dist/RangeInput.js +2 -2
- package/dist/RangeInput.js.map +1 -1
- package/dist/SearchBar.js +9 -9
- package/dist/SearchBar.js.map +1 -1
- package/dist/SectionHeader.js +14 -14
- package/dist/SectionHeader.js.map +1 -1
- package/dist/Select.js +369 -366
- package/dist/Select.js.map +1 -1
- package/dist/SelectStatus.js +26 -27
- package/dist/SelectStatus.js.map +1 -1
- package/dist/Skeleton.js +20 -20
- package/dist/Skeleton.js.map +1 -1
- package/dist/Step.js +37 -40
- package/dist/Step.js.map +1 -1
- package/dist/Stepper.js +17 -17
- package/dist/Stepper.js.map +1 -1
- package/dist/Switch.js +57 -57
- package/dist/Switch.js.map +1 -1
- package/dist/Tab.js +17 -19
- package/dist/Tab.js.map +1 -1
- package/dist/TabPanel.js +1 -1
- package/dist/TabPanel.js.map +1 -1
- package/dist/Table.js +22 -22
- package/dist/Table.js.map +1 -1
- package/dist/TableCell.js +32 -32
- package/dist/TableCell.js.map +1 -1
- package/dist/TableHeaderCell.js +35 -35
- package/dist/TableHeaderCell.js.map +1 -1
- package/dist/TableHeaderRow.js +10 -10
- package/dist/TableHeaderRow.js.map +1 -1
- package/dist/TableRow.js +51 -51
- package/dist/TableRow.js.map +1 -1
- package/dist/Tabs.js +2 -2
- package/dist/{Tabs.vue_vue_type_script_setup_true_lang-B3Irnlcd.js → Tabs.vue_vue_type_script_setup_true_lang-BVTCcK6M.js} +33 -33
- package/dist/Tabs.vue_vue_type_script_setup_true_lang-BVTCcK6M.js.map +1 -0
- package/dist/TextEditor.js +8 -8
- package/dist/TextEditor.js.map +1 -1
- package/dist/Textarea.js +15 -15
- package/dist/Textarea.js.map +1 -1
- package/dist/Thumbnail.js +41 -41
- package/dist/Thumbnail.js.map +1 -1
- package/dist/ThumbnailEmpty.js +3 -3
- package/dist/ThumbnailEmpty.js.map +1 -1
- package/dist/ThumbnailGroup.js +22 -22
- package/dist/ThumbnailGroup.js.map +1 -1
- package/dist/Timeline.js +3 -3
- package/dist/Timeline.js.map +1 -1
- package/dist/TimelineItem.js +22 -22
- package/dist/TimelineItem.js.map +1 -1
- package/dist/Toast.js +29 -29
- package/dist/Toast.js.map +1 -1
- package/dist/Toast.vue.d.ts +3 -0
- package/dist/Toasts.js +11 -11
- package/dist/Toasts.js.map +1 -1
- package/dist/Tooltip.js +2 -81
- package/dist/Tooltip.js.map +1 -1
- package/dist/Tooltip.vue.d.ts +1 -1
- package/dist/Tooltip.vue_vue_type_script_setup_true_lang-mzBLSXy3.js +84 -0
- package/dist/Tooltip.vue_vue_type_script_setup_true_lang-mzBLSXy3.js.map +1 -0
- package/dist/components.css +2 -2
- package/dist/constants.d.ts +9 -9
- package/dist/constants.js +17 -17
- package/dist/constants.js.map +1 -1
- package/dist/directives/tooltip.js +2 -2
- package/dist/directives/tooltip.js.map +1 -1
- package/dist/{index-C14LhAwV.js → index-DBV9Uz0C.js} +3 -3
- package/dist/{index-C14LhAwV.js.map → index-DBV9Uz0C.js.map} +1 -1
- package/dist/tailwind-base.js.d.ts +12 -0
- package/dist/tailwind-base.js.map +1 -1
- package/dist/useSortable.js +1 -1
- package/dist/utils/helpers.js +15 -15
- package/dist/utils/helpers.js.map +1 -1
- package/package.json +15 -15
- package/styles/backwards-compat.css +373 -2851
- package/styles/main.css +8 -0
- package/styles/sofia-font.css +23 -27
- package/styles/theme.css +1033 -0
- package/dist/Field.vue_vue_type_script_setup_true_lang-DI6z3AE9.js.map +0 -1
- package/dist/Image.vue_vue_type_script_setup_true_lang-D5u4av0_.js.map +0 -1
- package/dist/Tabs.vue_vue_type_script_setup_true_lang-B3Irnlcd.js.map +0 -1
- package/dist/tailwind-base.d.ts +0 -333
- package/styles/base.css +0 -902
- package/tailwind-base.ts +0 -455
package/dist/FilterChip.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { defineComponent as f, useCssModule as
|
|
1
|
+
import { defineComponent as f, useCssModule as y, computed as h, createBlock as v, openBlock as s, normalizeClass as l, unref as t, withCtx as b, createElementVNode as C, renderSlot as w, createElementBlock as n, createCommentVNode as i, toDisplayString as k, createVNode as D } from "vue";
|
|
2
2
|
import { t as c } from "./locale.js";
|
|
3
3
|
import x from "./Chip.js";
|
|
4
4
|
import B from "./Icon.js";
|
|
5
5
|
import { _ as F } from "./_plugin-vue_export-helper-CHgC5LLL.js";
|
|
6
|
-
const O = { class: "
|
|
6
|
+
const O = { class: "flex items-center" }, R = ["aria-label", "title"], S = { key: 1 }, N = /* @__PURE__ */ f({
|
|
7
7
|
__name: "FilterChip",
|
|
8
8
|
props: {
|
|
9
9
|
filterCount: { default: void 0 },
|
|
@@ -14,17 +14,17 @@ const O = { class: "tw-flex tw-items-center" }, R = ["aria-label", "title"], S =
|
|
|
14
14
|
},
|
|
15
15
|
emits: ["click", "remove"],
|
|
16
16
|
setup(d, { emit: p }) {
|
|
17
|
-
const e = d,
|
|
17
|
+
const e = d, a = p, o = y(), r = h(() => Number(e.filterCount) > 0);
|
|
18
18
|
function m() {
|
|
19
|
-
|
|
19
|
+
a("click");
|
|
20
20
|
}
|
|
21
21
|
function _() {
|
|
22
|
-
|
|
22
|
+
a("remove");
|
|
23
23
|
}
|
|
24
|
-
return (u, E) => (
|
|
24
|
+
return (u, E) => (s(), v(x, {
|
|
25
25
|
"should-override-colors": "",
|
|
26
26
|
tabindex: "0",
|
|
27
|
-
class:
|
|
27
|
+
class: l(["stash-filter-chip text-sm font-normal normal-case leading-5 text-ice-900", [
|
|
28
28
|
t(o).root,
|
|
29
29
|
{
|
|
30
30
|
[t(o)["is-selected"]]: e.isSelected,
|
|
@@ -41,19 +41,19 @@ const O = { class: "tw-flex tw-items-center" }, R = ["aria-label", "title"], S =
|
|
|
41
41
|
}, {
|
|
42
42
|
default: b(() => [
|
|
43
43
|
C("div", O, [
|
|
44
|
-
|
|
45
|
-
r.value ? (
|
|
44
|
+
w(u.$slots, "default"),
|
|
45
|
+
r.value ? (s(), n("span", {
|
|
46
46
|
key: 0,
|
|
47
47
|
"data-test": "span|filter-count",
|
|
48
|
-
class:
|
|
48
|
+
class: l(t(o)["filter-count"]),
|
|
49
49
|
"aria-label": t(c)("ll.numberOfActiveFilters"),
|
|
50
50
|
title: t(c)("ll.numberOfActiveFilters")
|
|
51
|
-
},
|
|
52
|
-
e.hasDropdown ? (
|
|
51
|
+
}, k(e.filterCount), 11, R)) : i("", !0),
|
|
52
|
+
e.hasDropdown ? (s(), n("span", S, [
|
|
53
53
|
D(B, {
|
|
54
54
|
"data-test": "icon|caret",
|
|
55
55
|
name: "caret-down",
|
|
56
|
-
class:
|
|
56
|
+
class: l([
|
|
57
57
|
t(o).caret,
|
|
58
58
|
{
|
|
59
59
|
[t(o)["caret-rotate"]]: e.isDropdownOpen
|
|
@@ -66,15 +66,15 @@ const O = { class: "tw-flex tw-items-center" }, R = ["aria-label", "title"], S =
|
|
|
66
66
|
_: 3
|
|
67
67
|
}, 8, ["class", "is-removable"]));
|
|
68
68
|
}
|
|
69
|
-
}), M = "
|
|
69
|
+
}), M = "_root_3y20y_8", V = "_caret_3y20y_97", g = {
|
|
70
70
|
root: M,
|
|
71
|
-
"is-selected": "_is-
|
|
72
|
-
"is-removable": "_is-
|
|
73
|
-
"has-filter-count": "_has-filter-
|
|
74
|
-
"has-dropdown": "_has-
|
|
75
|
-
"filter-count": "_filter-
|
|
71
|
+
"is-selected": "_is-selected_3y20y_27",
|
|
72
|
+
"is-removable": "_is-removable_3y20y_39",
|
|
73
|
+
"has-filter-count": "_has-filter-count_3y20y_52",
|
|
74
|
+
"has-dropdown": "_has-dropdown_3y20y_57",
|
|
75
|
+
"filter-count": "_filter-count_3y20y_70",
|
|
76
76
|
caret: V,
|
|
77
|
-
"caret-rotate": "_caret-
|
|
77
|
+
"caret-rotate": "_caret-rotate_3y20y_108"
|
|
78
78
|
}, A = {
|
|
79
79
|
$style: g
|
|
80
80
|
}, G = /* @__PURE__ */ F(N, [["__cssModules", A]]);
|
package/dist/FilterChip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterChip.js","sources":["../src/components/FilterChip/FilterChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Chip from '../Chip/Chip.vue';\n import Icon from '../Icon/Icon.vue';\n\n export interface FilterChipProps {\n /**\n * Used for conditionally rendering filter count chip\n */\n filterCount?: number;\n\n /**\n * Use for conditionally rendering caret\n */\n hasDropdown?: boolean;\n\n /**\n * Used for styling when `hasDropdown` is true\n */\n isDropdownOpen?: boolean;\n\n /**\n * Used for conditionally rendering close icon and exposing remove event\n */\n isRemovable?: boolean;\n\n /**\n * Used for conditionally applying styles\n */\n isSelected?: boolean;\n }\n\n const props = withDefaults(defineProps<FilterChipProps>(), {\n filterCount: undefined,\n hasDropdown: false,\n isDropdownOpen: false,\n isRemovable: false,\n isSelected: false,\n });\n\n const emit = defineEmits<{\n (e: 'click'): void;\n (e: 'remove'): void;\n }>();\n\n const classes = useCssModule();\n const hasFilterCount = computed(() => Number(props.filterCount) > 0);\n\n function handleClick() {\n emit('click');\n }\n\n function handleRemove() {\n emit('remove');\n }\n</script>\n\n<template>\n <Chip\n should-override-colors\n tabindex=\"0\"\n class=\"stash-filter-chip
|
|
1
|
+
{"version":3,"file":"FilterChip.js","sources":["../src/components/FilterChip/FilterChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Chip from '../Chip/Chip.vue';\n import Icon from '../Icon/Icon.vue';\n\n export interface FilterChipProps {\n /**\n * Used for conditionally rendering filter count chip\n */\n filterCount?: number;\n\n /**\n * Use for conditionally rendering caret\n */\n hasDropdown?: boolean;\n\n /**\n * Used for styling when `hasDropdown` is true\n */\n isDropdownOpen?: boolean;\n\n /**\n * Used for conditionally rendering close icon and exposing remove event\n */\n isRemovable?: boolean;\n\n /**\n * Used for conditionally applying styles\n */\n isSelected?: boolean;\n }\n\n const props = withDefaults(defineProps<FilterChipProps>(), {\n filterCount: undefined,\n hasDropdown: false,\n isDropdownOpen: false,\n isRemovable: false,\n isSelected: false,\n });\n\n const emit = defineEmits<{\n (e: 'click'): void;\n (e: 'remove'): void;\n }>();\n\n const classes = useCssModule();\n const hasFilterCount = computed(() => Number(props.filterCount) > 0);\n\n function handleClick() {\n emit('click');\n }\n\n function handleRemove() {\n emit('remove');\n }\n</script>\n\n<template>\n <Chip\n should-override-colors\n tabindex=\"0\"\n class=\"stash-filter-chip text-sm font-normal normal-case leading-5 text-ice-900\"\n radius=\"pill\"\n :class=\"[\n classes.root,\n {\n [classes['is-selected']]: props.isSelected,\n [classes['is-removable']]: props.isRemovable,\n [classes['is-dropdown-open']]: props.isDropdownOpen,\n [classes['has-dropdown']]: props.hasDropdown,\n [classes['has-filter-count']]: hasFilterCount,\n },\n ]\"\n :is-removable=\"props.isSelected && props.isRemovable && !props.hasDropdown\"\n @click=\"handleClick\"\n @remove=\"handleRemove\"\n >\n <div class=\"flex items-center\">\n <!-- @slot default -->\n <slot></slot>\n\n <span\n v-if=\"hasFilterCount\"\n data-test=\"span|filter-count\"\n :class=\"classes['filter-count']\"\n :aria-label=\"t('ll.numberOfActiveFilters')\"\n :title=\"t('ll.numberOfActiveFilters')\"\n >\n {{ props.filterCount }}\n </span>\n\n <span v-if=\"props.hasDropdown\">\n <Icon\n data-test=\"icon|caret\"\n name=\"caret-down\"\n :class=\"[\n classes.caret,\n {\n [classes['caret-rotate']]: props.isDropdownOpen,\n },\n ]\"\n />\n </span>\n </div>\n </Chip>\n</template>\n\n<style module>\n @reference \"../../../styles/main.css\";\n\n @layer utilities {\n /**\n many styles declared here are overriding styles defined in Chip\n */\n .root {\n background-color: var(--color-white);\n border: 1px solid var(--color-ice-500);\n cursor: pointer;\n height: --spacing(9);\n padding-left: --spacing(3);\n padding-right: --spacing(3);\n }\n\n .root:focus {\n box-shadow: 0 0 0 4px rgb(0 123 255 / 15%);\n outline: none;\n }\n\n .root:hover {\n background-color: var(--color-blue-100);\n border: 1px solid var(--color-blue-500);\n }\n\n .root.is-selected {\n color: var(--color-white);\n background-color: var(--color-blue-500);\n border: 1px solid var(--color-blue-500);\n }\n\n .root.is-selected:hover {\n color: var(--color-white);\n background-color: var(--color-blue-700);\n border: 1px solid var(--color-blue-700);\n }\n\n .root.is-selected.is-removable {\n background-color: var(--color-blue-500);\n }\n\n .root.is-selected.is-removable :global(.stash-chip__remove-button) {\n margin-right: -1px;\n padding-right: --spacing(3);\n }\n\n .root.is-selected.is-removable :global(.stash-chip__remove-button):hover {\n background-color: var(--color-blue-700);\n }\n\n .root.is-selected.has-filter-count:hover {\n background-color: var(--color-blue-700);\n color: var(--color-white);\n }\n\n .root.has-dropdown {\n padding-right: --spacing(1.5);\n }\n\n .root.has-filter-count:hover {\n background-color: var(--color-blue-100);\n color: var(--color-ice-900);\n }\n\n .root label {\n cursor: pointer;\n }\n\n .filter-count {\n display: inline-flex;\n align-items: center;\n border-radius: 5em;\n height: 16px;\n padding: 0 8px;\n margin-left: --spacing(1.5);\n font-size: 10px;\n font-weight: bold;\n background-color: var(--color-blue-500);\n color: var(--color-white);\n }\n\n .is-selected .filter-count {\n background-color: var(--color-blue-700);\n }\n\n .is-selected:hover .filter-count {\n background-color: var(--color-white);\n color: var(--color-blue-700);\n }\n\n .is-selected.is-removable .filter-count {\n background-color: var(--color-blue-700);\n color: var(--color-white);\n }\n\n .caret {\n color: var(--color-ice-700);\n margin-left: --spacing(1.5);\n transform: rotate(0);\n transition: all 0.5s;\n }\n\n .is-selected .caret {\n color: var(--color-white);\n }\n\n .caret-rotate {\n transform: rotate(-180deg);\n }\n }\n</style>\n"],"names":["props","__props","emit","__emit","classes","useCssModule","hasFilterCount","computed","handleClick","handleRemove"],"mappings":";;;;;;;;;;;;;;;;AAkCE,UAAMA,IAAQC,GAQRC,IAAOC,GAKPC,IAAUC,EAAA,GACVC,IAAiBC,EAAS,MAAM,OAAOP,EAAM,WAAW,IAAI,CAAC;AAEnE,aAASQ,IAAc;AACrB,MAAAN,EAAK,OAAO;AAAA,IACd;AAEA,aAASO,IAAe;AACtB,MAAAP,EAAK,QAAQ;AAAA,IACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/FilterDrawerItem.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { defineComponent as C, useSlots as F, inject as k, computed as
|
|
1
|
+
import { defineComponent as C, useSlots as F, inject as k, computed as p, createElementBlock as o, openBlock as e, createBlock as a, createCommentVNode as r, resolveDynamicComponent as x, withCtx as f, createElementVNode as l, toDisplayString as n, normalizeClass as I, unref as c, createTextVNode as g, renderSlot as D } from "vue";
|
|
2
2
|
import { t as u } from "./locale.js";
|
|
3
3
|
import E from "./Chip.js";
|
|
4
4
|
import { D as S } from "./DataViewFilters.keys-BLu07FiP.js";
|
|
5
5
|
import N from "./Icon.js";
|
|
6
|
-
const T = { class: "stash-filter-drawer-item" }, A = { class: "
|
|
6
|
+
const T = { class: "stash-filter-drawer-item" }, A = { class: "flex items-center justify-between self-stretch" }, V = { class: "flex flex-col items-start" }, B = {
|
|
7
7
|
key: 0,
|
|
8
|
-
class: "
|
|
8
|
+
class: "text-xs",
|
|
9
9
|
"data-test": "description"
|
|
10
10
|
}, O = {
|
|
11
11
|
key: 0,
|
|
12
|
-
class: "
|
|
12
|
+
class: "gap-3 p-6"
|
|
13
13
|
}, R = /* @__PURE__ */ C({
|
|
14
14
|
__name: "FilterDrawerItem",
|
|
15
15
|
props: {
|
|
@@ -18,27 +18,27 @@ const T = { class: "stash-filter-drawer-item" }, A = { class: "tw-flex tw-items-
|
|
|
18
18
|
description: {}
|
|
19
19
|
},
|
|
20
20
|
emits: ["navigate"],
|
|
21
|
-
setup(
|
|
22
|
-
const i =
|
|
21
|
+
setup(v, { emit: _ }) {
|
|
22
|
+
const i = v, h = _, b = F(), t = k(S.key);
|
|
23
23
|
if (!(t != null && t.useFiltersInstance))
|
|
24
24
|
throw new Error(
|
|
25
25
|
"FilterDropdown must be used within a <DataViewFilters> that receives an instance of useFilters()."
|
|
26
26
|
);
|
|
27
|
-
const { activeFiltersCounts:
|
|
27
|
+
const { activeFiltersCounts: w } = t.useFiltersInstance, d = p(() => w.value[i.group]), s = p(() => t.drawerStyle === "cascade");
|
|
28
28
|
return (y, m) => (e(), o("div", T, [
|
|
29
29
|
(e(), a(x(s.value ? "div" : "button"), {
|
|
30
30
|
"data-test": "stash-filter-drawer-item|dynamic-component",
|
|
31
|
-
class: "
|
|
32
|
-
onClick: m[0] || (m[0] = (j) => s.value ? void 0 :
|
|
31
|
+
class: "outline-hidden w-full border-b border-ice-500 py-4 focus:outline-blue-500",
|
|
32
|
+
onClick: m[0] || (m[0] = (j) => s.value ? void 0 : h("navigate"))
|
|
33
33
|
}, {
|
|
34
|
-
default:
|
|
34
|
+
default: f(() => [
|
|
35
35
|
l("div", A, [
|
|
36
36
|
l("div", V, [
|
|
37
37
|
l("h4", null, n(i.title), 1),
|
|
38
38
|
i.description ? (e(), o("div", B, n(i.description), 1)) : r("", !0)
|
|
39
39
|
]),
|
|
40
40
|
l("div", {
|
|
41
|
-
class: I(["
|
|
41
|
+
class: I(["inline-flex items-center gap-6", { "mb-0.5 mr-2": s.value }])
|
|
42
42
|
}, [
|
|
43
43
|
d.value ? (e(), a(E, {
|
|
44
44
|
key: 0,
|
|
@@ -48,7 +48,7 @@ const T = { class: "stash-filter-drawer-item" }, A = { class: "tw-flex tw-items-
|
|
|
48
48
|
"aria-label": c(u)("ll.numberOfActiveFilters"),
|
|
49
49
|
title: c(u)("ll.numberOfActiveFilters")
|
|
50
50
|
}, {
|
|
51
|
-
default:
|
|
51
|
+
default: f(() => [
|
|
52
52
|
g(n(d.value), 1)
|
|
53
53
|
]),
|
|
54
54
|
_: 1
|
|
@@ -63,7 +63,7 @@ const T = { class: "stash-filter-drawer-item" }, A = { class: "tw-flex tw-items-
|
|
|
63
63
|
]),
|
|
64
64
|
_: 1
|
|
65
65
|
})),
|
|
66
|
-
s.value &&
|
|
66
|
+
s.value && b.default ? (e(), o("div", O, [
|
|
67
67
|
D(y.$slots, "default")
|
|
68
68
|
])) : r("", !0)
|
|
69
69
|
]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterDrawerItem.js","sources":["../src/components/FilterDrawerItem/FilterDrawerItem.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { computed, inject } from 'vue';\n\n import { t } from '../../locale';\n import Chip from '../Chip/Chip.vue';\n import { DATA_VIEW_FILTERS_UTILS_INJECTION } from '../DataViewFilters/DataViewFilters.keys';\n import Icon from '../Icon/Icon.vue';\n\n export interface FilterDrawerItemProps {\n /** The name of a filter group */\n group: string;\n title: string;\n description?: string;\n }\n const props = defineProps<FilterDrawerItemProps>();\n\n export interface FilterDrawerItemEmits {\n (e: 'navigate');\n }\n const emit = defineEmits<FilterDrawerItemEmits>();\n\n export interface FilterDrawerItemSlots {\n default?: () => unknown;\n }\n\n const slots = defineSlots<FilterDrawerItemSlots>();\n\n const dataViewFiltersUtils = inject(DATA_VIEW_FILTERS_UTILS_INJECTION.key);\n\n if (!dataViewFiltersUtils?.useFiltersInstance) {\n throw new Error(\n 'FilterDropdown must be used within a <DataViewFilters> that receives an instance of useFilters().',\n );\n }\n\n const { activeFiltersCounts } = dataViewFiltersUtils.useFiltersInstance;\n\n const activeCount = computed(() => activeFiltersCounts.value[props.group]);\n const isDrawerCascade = computed(() => dataViewFiltersUtils.drawerStyle === 'cascade');\n</script>\n\n<template>\n <div class=\"stash-filter-drawer-item\">\n <component\n :is=\"isDrawerCascade ? 'div' : 'button'\"\n data-test=\"stash-filter-drawer-item|dynamic-component\"\n class=\"
|
|
1
|
+
{"version":3,"file":"FilterDrawerItem.js","sources":["../src/components/FilterDrawerItem/FilterDrawerItem.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { computed, inject } from 'vue';\n\n import { t } from '../../locale';\n import Chip from '../Chip/Chip.vue';\n import { DATA_VIEW_FILTERS_UTILS_INJECTION } from '../DataViewFilters/DataViewFilters.keys';\n import Icon from '../Icon/Icon.vue';\n\n export interface FilterDrawerItemProps {\n /** The name of a filter group */\n group: string;\n title: string;\n description?: string;\n }\n const props = defineProps<FilterDrawerItemProps>();\n\n export interface FilterDrawerItemEmits {\n (e: 'navigate');\n }\n const emit = defineEmits<FilterDrawerItemEmits>();\n\n export interface FilterDrawerItemSlots {\n default?: () => unknown;\n }\n\n const slots = defineSlots<FilterDrawerItemSlots>();\n\n const dataViewFiltersUtils = inject(DATA_VIEW_FILTERS_UTILS_INJECTION.key);\n\n if (!dataViewFiltersUtils?.useFiltersInstance) {\n throw new Error(\n 'FilterDropdown must be used within a <DataViewFilters> that receives an instance of useFilters().',\n );\n }\n\n const { activeFiltersCounts } = dataViewFiltersUtils.useFiltersInstance;\n\n const activeCount = computed(() => activeFiltersCounts.value[props.group]);\n const isDrawerCascade = computed(() => dataViewFiltersUtils.drawerStyle === 'cascade');\n</script>\n\n<template>\n <div class=\"stash-filter-drawer-item\">\n <component\n :is=\"isDrawerCascade ? 'div' : 'button'\"\n data-test=\"stash-filter-drawer-item|dynamic-component\"\n class=\"outline-hidden w-full border-b border-ice-500 py-4 focus:outline-blue-500\"\n @click=\"isDrawerCascade ? undefined : emit('navigate')\"\n >\n <div class=\"flex items-center justify-between self-stretch\">\n <div class=\"flex flex-col items-start\">\n <h4>{{ props.title }}</h4>\n <div v-if=\"props.description\" class=\"text-xs\" data-test=\"description\">\n {{ props.description }}\n </div>\n </div>\n <div class=\"inline-flex items-center gap-6\" :class=\"{ 'mb-0.5 mr-2': isDrawerCascade }\">\n <Chip\n v-if=\"activeCount\"\n color=\"blue\"\n radius=\"pill\"\n shade=\"main\"\n :aria-label=\"t('ll.numberOfActiveFilters')\"\n :title=\"t('ll.numberOfActiveFilters')\"\n >\n {{ activeCount }}\n </Chip>\n <Icon v-if=\"!isDrawerCascade\" name=\"chevron-right\" :title=\"t('ll.viewFilterGroup')\" />\n </div>\n </div>\n </component>\n <div v-if=\"isDrawerCascade && slots.default\" class=\"gap-3 p-6\">\n <slot></slot>\n </div>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","slots","_useSlots","dataViewFiltersUtils","inject","DATA_VIEW_FILTERS_UTILS_INJECTION","activeFiltersCounts","activeCount","computed","isDrawerCascade"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAcE,UAAMA,IAAQC,GAKRC,IAAOC,GAMPC,IAAQC,EAAA,GAERC,IAAuBC,EAAOC,EAAkC,GAAG;AAEzE,QAAI,EAACF,KAAA,QAAAA,EAAsB;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAIJ,UAAM,EAAE,qBAAAG,MAAwBH,EAAqB,oBAE/CI,IAAcC,EAAS,MAAMF,EAAoB,MAAMT,EAAM,KAAK,CAAC,GACnEY,IAAkBD,EAAS,MAAML,EAAqB,gBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/FilterDropdown.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent as O, inject as b, ref as y, computed as R, createBlock as k, openBlock as
|
|
1
|
+
import { defineComponent as O, inject as b, ref as y, computed as R, createBlock as k, openBlock as f, withCtx as l, createElementVNode as d, createVNode as p, unref as t, renderSlot as W, Transition as j, createElementBlock as J, createCommentVNode as x, createTextVNode as m, toDisplayString as w } from "vue";
|
|
2
2
|
import z from "lodash-es/throttle";
|
|
3
3
|
import { t as C } from "./locale.js";
|
|
4
4
|
import D from "./Button.js";
|
|
@@ -8,10 +8,10 @@ import { D as F } from "./DataView.keys-aSOnA4AD.js";
|
|
|
8
8
|
import { D as G } from "./DataViewFilters.keys-BLu07FiP.js";
|
|
9
9
|
import $ from "./Dropdown.js";
|
|
10
10
|
import q from "./FilterChip.js";
|
|
11
|
-
const H = { class: "
|
|
11
|
+
const H = { class: "flex h-full flex-col rounded" }, K = { class: "flex-1 overflow-hidden rounded-t" }, M = {
|
|
12
12
|
key: 0,
|
|
13
|
-
class: "
|
|
14
|
-
}, P = { class: "
|
|
13
|
+
class: "pointer-events-none absolute inset-x-0 bottom-0 z-10 h-[20px] bg-scroll-shadow"
|
|
14
|
+
}, P = { class: "flex shrink-0 justify-end gap-6 rounded-b border border-solid border-x-ice-100 border-b-ice-100 border-t-ice-200 bg-ice-100 p-3.5" }, ne = /* @__PURE__ */ O({
|
|
15
15
|
__name: "FilterDropdown",
|
|
16
16
|
props: {
|
|
17
17
|
label: {},
|
|
@@ -31,17 +31,17 @@ const H = { class: "tw-flex tw-h-full tw-flex-col tw-rounded" }, K = { class: "t
|
|
|
31
31
|
return (e = n.value) == null ? void 0 : e.isActive;
|
|
32
32
|
});
|
|
33
33
|
function A() {
|
|
34
|
-
var
|
|
34
|
+
var o;
|
|
35
35
|
const e = u.value;
|
|
36
|
-
(
|
|
36
|
+
(o = n.value) == null || o.toggle(), e && (_(), c("dismiss"));
|
|
37
37
|
}
|
|
38
38
|
function N() {
|
|
39
39
|
var e;
|
|
40
40
|
S(s.group), c("reset"), (e = n.value) == null || e.dismiss();
|
|
41
41
|
}
|
|
42
42
|
async function V() {
|
|
43
|
-
var
|
|
44
|
-
const { preventDismiss: e } = await ((
|
|
43
|
+
var o, a;
|
|
44
|
+
const { preventDismiss: e } = await ((o = s.onApply) == null ? void 0 : o.call(s)) || E() || {};
|
|
45
45
|
e || (a = n.value) == null || a.dismiss();
|
|
46
46
|
}
|
|
47
47
|
function B() {
|
|
@@ -55,7 +55,7 @@ const H = { class: "tw-flex tw-h-full tw-flex-col tw-rounded" }, K = { class: "t
|
|
|
55
55
|
r.value = !1;
|
|
56
56
|
}, 2e3);
|
|
57
57
|
}
|
|
58
|
-
return (e,
|
|
58
|
+
return (e, o) => (f(), k($, {
|
|
59
59
|
ref_key: "dropdownRef",
|
|
60
60
|
ref: n,
|
|
61
61
|
align: "left",
|
|
@@ -63,21 +63,21 @@ const H = { class: "tw-flex tw-h-full tw-flex-col tw-rounded" }, K = { class: "t
|
|
|
63
63
|
"data-test": "stash-filter-dropdown",
|
|
64
64
|
"fluid-content": "",
|
|
65
65
|
"close-manually": "",
|
|
66
|
-
"content-class": "
|
|
66
|
+
"content-class": "w-full max-w-[600px] h-[400px]",
|
|
67
67
|
offset: { y: 6 },
|
|
68
68
|
onDismiss: B
|
|
69
69
|
}, {
|
|
70
70
|
toggle: l(() => [
|
|
71
|
-
|
|
72
|
-
class: "
|
|
71
|
+
p(q, {
|
|
72
|
+
class: "rounded-full",
|
|
73
73
|
"has-dropdown": "",
|
|
74
74
|
"is-dropdown-open": u.value,
|
|
75
|
-
"filter-count":
|
|
75
|
+
"filter-count": t(v)[s.group],
|
|
76
76
|
"is-selected": u.value,
|
|
77
77
|
onClick: A
|
|
78
78
|
}, {
|
|
79
79
|
default: l(() => [
|
|
80
|
-
|
|
80
|
+
m(w(s.label), 1)
|
|
81
81
|
]),
|
|
82
82
|
_: 1
|
|
83
83
|
}, 8, ["is-dropdown-open", "filter-count", "is-selected"])
|
|
@@ -86,40 +86,40 @@ const H = { class: "tw-flex tw-h-full tw-flex-col tw-rounded" }, K = { class: "t
|
|
|
86
86
|
d("div", H, [
|
|
87
87
|
d("div", K, [
|
|
88
88
|
d("div", {
|
|
89
|
-
class: "
|
|
90
|
-
onScroll:
|
|
91
|
-
(...a) =>
|
|
89
|
+
class: "relative h-full overflow-auto p-6",
|
|
90
|
+
onScroll: o[0] || (o[0] = //@ts-ignore
|
|
91
|
+
(...a) => t(g) && t(g)(...a)),
|
|
92
92
|
onScrollend: L
|
|
93
93
|
}, [
|
|
94
94
|
W(e.$slots, "default")
|
|
95
95
|
], 32),
|
|
96
|
-
|
|
96
|
+
p(j, { name: "fade" }, {
|
|
97
97
|
default: l(() => [
|
|
98
|
-
r.value ? (
|
|
98
|
+
r.value ? (f(), J("div", M)) : x("", !0)
|
|
99
99
|
]),
|
|
100
100
|
_: 1
|
|
101
101
|
})
|
|
102
102
|
]),
|
|
103
103
|
d("footer", P, [
|
|
104
|
-
|
|
104
|
+
t(v)[s.group] ? (f(), k(D, {
|
|
105
105
|
key: 0,
|
|
106
106
|
secondary: "",
|
|
107
|
-
class: "
|
|
108
|
-
disabled:
|
|
107
|
+
class: "min-w-[100px]",
|
|
108
|
+
disabled: t(h),
|
|
109
109
|
onClick: N
|
|
110
110
|
}, {
|
|
111
111
|
default: l(() => [
|
|
112
|
-
|
|
112
|
+
m(w(t(C)("ll.reset")), 1)
|
|
113
113
|
]),
|
|
114
114
|
_: 1
|
|
115
115
|
}, 8, ["disabled"])) : x("", !0),
|
|
116
|
-
|
|
117
|
-
class: "
|
|
118
|
-
disabled:
|
|
116
|
+
p(D, {
|
|
117
|
+
class: "min-w-[100px]",
|
|
118
|
+
disabled: t(h),
|
|
119
119
|
onClick: V
|
|
120
120
|
}, {
|
|
121
121
|
default: l(() => [
|
|
122
|
-
|
|
122
|
+
m(w(t(C)("ll.apply")), 1)
|
|
123
123
|
]),
|
|
124
124
|
_: 1
|
|
125
125
|
}, 8, ["disabled"])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterDropdown.js","sources":["../src/components/FilterDropdown/FilterDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import throttle from 'lodash-es/throttle';\n import { computed, inject, ref } from 'vue';\n\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import { DATA_VIEW_INJECTION } from '../DataView/DataView.vue';\n import { DATA_VIEW_FILTERS_UTILS_INJECTION } from '../DataViewFilters/DataViewFilters.keys';\n import type { OnApplyFilters } from '../DataViewFilters/DataViewFilters.types';\n import Dropdown from '../Dropdown/Dropdown.vue';\n import FilterChip from '../FilterChip/FilterChip.vue';\n\n export interface FilterDropdownProps {\n label: string;\n /** The name of a filter group */\n group: string;\n onApply?: OnApplyFilters;\n }\n const props = withDefaults(defineProps<FilterDropdownProps>(), {\n activeFilterCount: 0,\n onApply: () => undefined,\n });\n\n const emit = defineEmits<{\n (e: 'reset'): void;\n (e: 'dismiss'): void;\n }>();\n\n const { isLoading: isDataViewLoading } = inject(DATA_VIEW_INJECTION.key, DATA_VIEW_INJECTION.defaults);\n\n const dataViewFiltersUtils = inject(DATA_VIEW_FILTERS_UTILS_INJECTION.key);\n\n if (!dataViewFiltersUtils?.useFiltersInstance) {\n throw new Error(\n 'FilterDropdown must be used within a <DataViewFilters> that receives an instance of useFilters().',\n );\n }\n\n const { applyFilters, resetFilterGroup, activeFiltersCounts, undoWorkingFilters } =\n dataViewFiltersUtils.useFiltersInstance;\n\n const dropdownRef = ref<InstanceType<typeof Dropdown>>();\n const isOpen = computed(() => dropdownRef.value?.isActive);\n\n function onToggleButtonClick() {\n const wasOpen = isOpen.value;\n\n dropdownRef.value?.toggle();\n\n if (wasOpen) {\n undoWorkingFilters();\n emit('dismiss');\n }\n }\n\n function handleResetClick() {\n resetFilterGroup(props.group);\n emit('reset');\n dropdownRef.value?.dismiss();\n }\n\n async function handleApplyClick() {\n const { preventDismiss } = (await props.onApply?.()) || applyFilters() || {};\n\n if (!preventDismiss) {\n dropdownRef.value?.dismiss();\n }\n }\n\n function onDismiss() {\n undoWorkingFilters();\n emit('dismiss');\n }\n\n const showShadow = ref(false);\n const onScroll = throttle((event: Event) => {\n if (!event.target) return;\n\n if ((event.target as HTMLElement).scrollTop > 0) {\n showShadow.value = true;\n } else {\n showShadow.value = false;\n }\n }, 500);\n\n function onScrollEnd() {\n setTimeout(() => {\n showShadow.value = false;\n }, 2000);\n }\n</script>\n\n<template>\n <Dropdown\n ref=\"dropdownRef\"\n align=\"left\"\n class=\"stash-filter-dropdown\"\n data-test=\"stash-filter-dropdown\"\n fluid-content\n close-manually\n content-class=\"
|
|
1
|
+
{"version":3,"file":"FilterDropdown.js","sources":["../src/components/FilterDropdown/FilterDropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import throttle from 'lodash-es/throttle';\n import { computed, inject, ref } from 'vue';\n\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import { DATA_VIEW_INJECTION } from '../DataView/DataView.vue';\n import { DATA_VIEW_FILTERS_UTILS_INJECTION } from '../DataViewFilters/DataViewFilters.keys';\n import type { OnApplyFilters } from '../DataViewFilters/DataViewFilters.types';\n import Dropdown from '../Dropdown/Dropdown.vue';\n import FilterChip from '../FilterChip/FilterChip.vue';\n\n export interface FilterDropdownProps {\n label: string;\n /** The name of a filter group */\n group: string;\n onApply?: OnApplyFilters;\n }\n const props = withDefaults(defineProps<FilterDropdownProps>(), {\n activeFilterCount: 0,\n onApply: () => undefined,\n });\n\n const emit = defineEmits<{\n (e: 'reset'): void;\n (e: 'dismiss'): void;\n }>();\n\n const { isLoading: isDataViewLoading } = inject(DATA_VIEW_INJECTION.key, DATA_VIEW_INJECTION.defaults);\n\n const dataViewFiltersUtils = inject(DATA_VIEW_FILTERS_UTILS_INJECTION.key);\n\n if (!dataViewFiltersUtils?.useFiltersInstance) {\n throw new Error(\n 'FilterDropdown must be used within a <DataViewFilters> that receives an instance of useFilters().',\n );\n }\n\n const { applyFilters, resetFilterGroup, activeFiltersCounts, undoWorkingFilters } =\n dataViewFiltersUtils.useFiltersInstance;\n\n const dropdownRef = ref<InstanceType<typeof Dropdown>>();\n const isOpen = computed(() => dropdownRef.value?.isActive);\n\n function onToggleButtonClick() {\n const wasOpen = isOpen.value;\n\n dropdownRef.value?.toggle();\n\n if (wasOpen) {\n undoWorkingFilters();\n emit('dismiss');\n }\n }\n\n function handleResetClick() {\n resetFilterGroup(props.group);\n emit('reset');\n dropdownRef.value?.dismiss();\n }\n\n async function handleApplyClick() {\n const { preventDismiss } = (await props.onApply?.()) || applyFilters() || {};\n\n if (!preventDismiss) {\n dropdownRef.value?.dismiss();\n }\n }\n\n function onDismiss() {\n undoWorkingFilters();\n emit('dismiss');\n }\n\n const showShadow = ref(false);\n const onScroll = throttle((event: Event) => {\n if (!event.target) return;\n\n if ((event.target as HTMLElement).scrollTop > 0) {\n showShadow.value = true;\n } else {\n showShadow.value = false;\n }\n }, 500);\n\n function onScrollEnd() {\n setTimeout(() => {\n showShadow.value = false;\n }, 2000);\n }\n</script>\n\n<template>\n <Dropdown\n ref=\"dropdownRef\"\n align=\"left\"\n class=\"stash-filter-dropdown\"\n data-test=\"stash-filter-dropdown\"\n fluid-content\n close-manually\n content-class=\"w-full max-w-[600px] h-[400px]\"\n :offset=\"{ y: 6 }\"\n @dismiss=\"onDismiss\"\n >\n <template #toggle>\n <FilterChip\n class=\"rounded-full\"\n has-dropdown\n :is-dropdown-open=\"isOpen\"\n :filter-count=\"activeFiltersCounts[props.group]\"\n :is-selected=\"isOpen\"\n @click=\"onToggleButtonClick\"\n >\n {{ props.label }}\n </FilterChip>\n </template>\n <template #default>\n <div class=\"flex h-full flex-col rounded\">\n <div class=\"flex-1 overflow-hidden rounded-t\">\n <div class=\"relative h-full overflow-auto p-6\" @scroll=\"onScroll\" @scrollend=\"onScrollEnd\">\n <slot></slot>\n </div>\n <Transition name=\"fade\">\n <div\n v-if=\"showShadow\"\n class=\"pointer-events-none absolute inset-x-0 bottom-0 z-10 h-[20px] bg-scroll-shadow\"\n ></div>\n </Transition>\n </div>\n\n <footer\n class=\"flex shrink-0 justify-end gap-6 rounded-b border border-solid border-x-ice-100 border-b-ice-100 border-t-ice-200 bg-ice-100 p-3.5\"\n >\n <Button\n v-if=\"activeFiltersCounts[props.group]\"\n secondary\n class=\"min-w-[100px]\"\n :disabled=\"isDataViewLoading\"\n @click=\"handleResetClick\"\n >\n {{ t('ll.reset') }}\n </Button>\n <Button class=\"min-w-[100px]\" :disabled=\"isDataViewLoading\" @click=\"handleApplyClick\">\n {{ t('ll.apply') }}\n </Button>\n </footer>\n </div>\n </template>\n </Dropdown>\n</template>\n"],"names":["props","__props","emit","__emit","isDataViewLoading","inject","DATA_VIEW_INJECTION","dataViewFiltersUtils","DATA_VIEW_FILTERS_UTILS_INJECTION","applyFilters","resetFilterGroup","activeFiltersCounts","undoWorkingFilters","dropdownRef","ref","isOpen","computed","_a","onToggleButtonClick","wasOpen","handleResetClick","handleApplyClick","preventDismiss","_b","onDismiss","showShadow","onScroll","throttle","event","onScrollEnd"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkBE,UAAMA,IAAQC,GAKRC,IAAOC,GAKP,EAAE,WAAWC,MAAsBC,EAAOC,EAAoB,KAAKA,EAAoB,QAAQ,GAE/FC,IAAuBF,EAAOG,EAAkC,GAAG;AAEzE,QAAI,EAACD,KAAA,QAAAA,EAAsB;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAIJ,UAAM,EAAE,cAAAE,GAAc,kBAAAC,GAAkB,qBAAAC,GAAqB,oBAAAC,EAAA,IAC3DL,EAAqB,oBAEjBM,IAAcC,EAAA,GACdC,IAASC,EAAS,MAAA;;AAAM,cAAAC,IAAAJ,EAAY,UAAZ,gBAAAI,EAAmB;AAAA,KAAQ;AAEzD,aAASC,IAAsB;;AAC7B,YAAMC,IAAUJ,EAAO;AAEvB,OAAAE,IAAAJ,EAAY,UAAZ,QAAAI,EAAmB,UAEfE,MACFP,EAAA,GACAV,EAAK,SAAS;AAAA,IAElB;AAEA,aAASkB,IAAmB;;AAC1B,MAAAV,EAAiBV,EAAM,KAAK,GAC5BE,EAAK,OAAO,IACZe,IAAAJ,EAAY,UAAZ,QAAAI,EAAmB;AAAA,IACrB;AAEA,mBAAeI,IAAmB;;AAChC,YAAM,EAAE,gBAAAC,MAAoB,QAAML,IAAAjB,EAAM,YAAN,gBAAAiB,EAAA,KAAAjB,OAAsBS,EAAA,KAAkB,CAAA;AAE1E,MAAKa,MACHC,IAAAV,EAAY,UAAZ,QAAAU,EAAmB;AAAA,IAEvB;AAEA,aAASC,IAAY;AACnB,MAAAZ,EAAA,GACAV,EAAK,SAAS;AAAA,IAChB;AAEA,UAAMuB,IAAaX,EAAI,EAAK,GACtBY,IAAWC,EAAS,CAACC,MAAiB;AAC1C,MAAKA,EAAM,WAENA,EAAM,OAAuB,YAAY,IAC5CH,EAAW,QAAQ,KAEnBA,EAAW,QAAQ;AAAA,IAEvB,GAAG,GAAG;AAEN,aAASI,IAAc;AACrB,iBAAW,MAAM;AACf,QAAAJ,EAAW,QAAQ;AAAA,MACrB,GAAG,GAAI;AAAA,IACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/FilterSelect.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { defineComponent as
|
|
1
|
+
import { defineComponent as $, computed as v, createBlock as w, openBlock as i, mergeProps as O, withCtx as u, createElementVNode as s, createElementBlock as c, createCommentVNode as A, withDirectives as y, vModelCheckbox as h, withModifiers as _, createVNode as b, withKeys as x, createTextVNode as B, toDisplayString as V, unref as E, Fragment as K, renderList as N } from "vue";
|
|
2
2
|
import { t as D } from "./locale.js";
|
|
3
|
-
import { _ as F } from "./Field.vue_vue_type_script_setup_true_lang-
|
|
4
|
-
import
|
|
5
|
-
const I = { class: "
|
|
3
|
+
import { _ as F } from "./Field.vue_vue_type_script_setup_true_lang-dAGKfjf5.js";
|
|
4
|
+
import g from "./FilterChip.js";
|
|
5
|
+
const I = { class: "flex flex-wrap gap-1.5" }, L = ["id"], T = ["for"], M = ["id", "value"], R = ["for", "onClick"], z = /* @__PURE__ */ $({
|
|
6
6
|
__name: "FilterSelect",
|
|
7
7
|
props: {
|
|
8
8
|
name: {},
|
|
@@ -24,36 +24,36 @@ const I = { class: "tw-flex tw-flex-wrap tw-gap-1.5" }, L = ["id"], T = ["for"],
|
|
|
24
24
|
disabled: { type: Boolean }
|
|
25
25
|
},
|
|
26
26
|
emits: ["update:modelValue"],
|
|
27
|
-
setup(
|
|
28
|
-
const e =
|
|
27
|
+
setup(k, { emit: S }) {
|
|
28
|
+
const e = k, p = S, o = v({
|
|
29
29
|
get() {
|
|
30
30
|
return e.modelValue;
|
|
31
31
|
},
|
|
32
|
-
set(
|
|
33
|
-
p("update:modelValue",
|
|
32
|
+
set(t) {
|
|
33
|
+
p("update:modelValue", t);
|
|
34
34
|
}
|
|
35
35
|
}), n = v({
|
|
36
36
|
get() {
|
|
37
37
|
return e.options.length === e.modelValue.length;
|
|
38
38
|
},
|
|
39
|
-
set(
|
|
40
|
-
p("update:modelValue",
|
|
39
|
+
set(t) {
|
|
40
|
+
p("update:modelValue", t ? e.options.map((a) => a.value) : []);
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
|
-
function r(
|
|
44
|
-
return `${e.name}--${
|
|
43
|
+
function r(t) {
|
|
44
|
+
return `${e.name}--${t.value}`;
|
|
45
45
|
}
|
|
46
|
-
function
|
|
47
|
-
return e.modelValue.includes(
|
|
46
|
+
function C(t) {
|
|
47
|
+
return e.modelValue.includes(t.value);
|
|
48
48
|
}
|
|
49
|
-
function m(
|
|
50
|
-
const a = o.value.filter((
|
|
51
|
-
a.length === o.value.length && a.push(
|
|
49
|
+
function m(t) {
|
|
50
|
+
const a = o.value.filter((l) => l !== t);
|
|
51
|
+
a.length === o.value.length && a.push(t), o.value = a;
|
|
52
52
|
}
|
|
53
53
|
function f() {
|
|
54
54
|
n.value = !n.value;
|
|
55
55
|
}
|
|
56
|
-
return (
|
|
56
|
+
return (t, a) => (i(), w(F, O(e, {
|
|
57
57
|
class: "stash-filter-select",
|
|
58
58
|
"data-test": "stash-filter-select",
|
|
59
59
|
fieldset: ""
|
|
@@ -65,8 +65,8 @@ const I = { class: "tw-flex tw-flex-wrap tw-gap-1.5" }, L = ["id"], T = ["for"],
|
|
|
65
65
|
}, [
|
|
66
66
|
y(s("input", {
|
|
67
67
|
id: `${e.name}--all`,
|
|
68
|
-
"onUpdate:modelValue": a[0] || (a[0] = (
|
|
69
|
-
class: "
|
|
68
|
+
"onUpdate:modelValue": a[0] || (a[0] = (l) => n.value = l),
|
|
69
|
+
class: "sr-only",
|
|
70
70
|
tabindex: "-1",
|
|
71
71
|
type: "checkbox",
|
|
72
72
|
value: "all"
|
|
@@ -77,42 +77,42 @@ const I = { class: "tw-flex tw-flex-wrap tw-gap-1.5" }, L = ["id"], T = ["for"],
|
|
|
77
77
|
for: `${e.name}--all`,
|
|
78
78
|
onClick: _(f, ["prevent"])
|
|
79
79
|
}, [
|
|
80
|
-
b(
|
|
80
|
+
b(g, {
|
|
81
81
|
"is-selected": n.value,
|
|
82
82
|
tabindex: "0",
|
|
83
83
|
onKeypress: x(f, ["enter"])
|
|
84
84
|
}, {
|
|
85
85
|
default: u(() => [
|
|
86
|
-
B(
|
|
86
|
+
B(V(E(D)("ll.all")), 1)
|
|
87
87
|
]),
|
|
88
88
|
_: 1
|
|
89
89
|
}, 8, ["is-selected"])
|
|
90
90
|
], 8, T)
|
|
91
91
|
])) : A("", !0),
|
|
92
|
-
(i(!0), c(K, null, N(e.options, (
|
|
93
|
-
key: r(
|
|
92
|
+
(i(!0), c(K, null, N(e.options, (l) => (i(), c("div", {
|
|
93
|
+
key: r(l)
|
|
94
94
|
}, [
|
|
95
95
|
y(s("input", {
|
|
96
|
-
id: r(
|
|
96
|
+
id: r(l),
|
|
97
97
|
"onUpdate:modelValue": a[1] || (a[1] = (d) => o.value = d),
|
|
98
|
-
class: "
|
|
98
|
+
class: "sr-only",
|
|
99
99
|
tabindex: "-1",
|
|
100
100
|
type: "checkbox",
|
|
101
|
-
value:
|
|
101
|
+
value: l.value
|
|
102
102
|
}, null, 8, M), [
|
|
103
103
|
[h, o.value]
|
|
104
104
|
]),
|
|
105
105
|
s("label", {
|
|
106
|
-
for: r(
|
|
107
|
-
onClick: _((d) => m(
|
|
106
|
+
for: r(l),
|
|
107
|
+
onClick: _((d) => m(l.value), ["prevent"])
|
|
108
108
|
}, [
|
|
109
|
-
b(
|
|
110
|
-
"is-selected":
|
|
109
|
+
b(g, {
|
|
110
|
+
"is-selected": C(l),
|
|
111
111
|
tabindex: "0",
|
|
112
|
-
onKeypress: x((d) => m(
|
|
112
|
+
onKeypress: x((d) => m(l.value), ["enter"])
|
|
113
113
|
}, {
|
|
114
114
|
default: u(() => [
|
|
115
|
-
B(
|
|
115
|
+
B(V(l.label), 1)
|
|
116
116
|
]),
|
|
117
117
|
_: 2
|
|
118
118
|
}, 1032, ["is-selected", "onKeypress"])
|
package/dist/FilterSelect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterSelect.js","sources":["../src/components/FilterSelect/FilterSelect.vue"],"sourcesContent":["<script lang=\"ts\">\n export * from './FilterSelect.types';\n</script>\n\n<script lang=\"ts\" setup>\n import { computed } from 'vue';\n\n import { t } from '../../locale';\n import { FieldProps } from '../Field/Field.types';\n import Field from '../Field/Field.vue';\n import FilterChip from '../FilterChip/FilterChip.vue';\n import { FilterSelectModelValue, FilterSelectOption } from './FilterSelect.types';\n\n export interface FilterSelectProps extends FieldProps {\n /**\n * The name attribute for the `<input>` elements. It is also used as a unique field to differentiate FilterSelect instances.\n */\n name: string;\n\n options: FilterSelectOption[];\n\n modelValue: FilterSelectModelValue;\n\n /**\n * When true, this prop adds an \"All\" option for selecting all options.\n */\n canSelectAll?: boolean;\n }\n\n const props = withDefaults(defineProps<FilterSelectProps>(), {\n canSelectAll: false,\n });\n\n const emit = defineEmits<{\n (e: 'update:modelValue', value: FilterSelectModelValue): void;\n }>();\n\n /**\n * @see: https://vuejs.org/guide/components/v-model.html#component-v-model\n */\n const selected = computed({\n get() {\n return props.modelValue;\n },\n set(value) {\n emit('update:modelValue', value);\n },\n });\n\n const isAllSelected = computed({\n get() {\n return props.options.length === props.modelValue.length;\n },\n set(isChecked) {\n emit('update:modelValue', isChecked ? props.options.map((option) => option.value) : []);\n },\n });\n\n function getOptionId(option: FilterSelectOption) {\n return `${props.name}--${option.value}`;\n }\n\n function isOptionSelected(option: FilterSelectOption) {\n return props.modelValue.includes(option.value);\n }\n\n function onEnter(enteredValue: FilterSelectOption['value']) {\n const newSelected = selected.value.filter((value) => value !== enteredValue);\n\n if (newSelected.length === selected.value.length) {\n newSelected.push(enteredValue);\n }\n\n selected.value = newSelected;\n }\n\n function onEnterAll() {\n isAllSelected.value = !isAllSelected.value;\n }\n</script>\n\n<template>\n <Field v-bind=\"props\" class=\"stash-filter-select\" data-test=\"stash-filter-select\" fieldset>\n <div class=\"
|
|
1
|
+
{"version":3,"file":"FilterSelect.js","sources":["../src/components/FilterSelect/FilterSelect.vue"],"sourcesContent":["<script lang=\"ts\">\n export * from './FilterSelect.types';\n</script>\n\n<script lang=\"ts\" setup>\n import { computed } from 'vue';\n\n import { t } from '../../locale';\n import { FieldProps } from '../Field/Field.types';\n import Field from '../Field/Field.vue';\n import FilterChip from '../FilterChip/FilterChip.vue';\n import { FilterSelectModelValue, FilterSelectOption } from './FilterSelect.types';\n\n export interface FilterSelectProps extends FieldProps {\n /**\n * The name attribute for the `<input>` elements. It is also used as a unique field to differentiate FilterSelect instances.\n */\n name: string;\n\n options: FilterSelectOption[];\n\n modelValue: FilterSelectModelValue;\n\n /**\n * When true, this prop adds an \"All\" option for selecting all options.\n */\n canSelectAll?: boolean;\n }\n\n const props = withDefaults(defineProps<FilterSelectProps>(), {\n canSelectAll: false,\n });\n\n const emit = defineEmits<{\n (e: 'update:modelValue', value: FilterSelectModelValue): void;\n }>();\n\n /**\n * @see: https://vuejs.org/guide/components/v-model.html#component-v-model\n */\n const selected = computed({\n get() {\n return props.modelValue;\n },\n set(value) {\n emit('update:modelValue', value);\n },\n });\n\n const isAllSelected = computed({\n get() {\n return props.options.length === props.modelValue.length;\n },\n set(isChecked) {\n emit('update:modelValue', isChecked ? props.options.map((option) => option.value) : []);\n },\n });\n\n function getOptionId(option: FilterSelectOption) {\n return `${props.name}--${option.value}`;\n }\n\n function isOptionSelected(option: FilterSelectOption) {\n return props.modelValue.includes(option.value);\n }\n\n function onEnter(enteredValue: FilterSelectOption['value']) {\n const newSelected = selected.value.filter((value) => value !== enteredValue);\n\n if (newSelected.length === selected.value.length) {\n newSelected.push(enteredValue);\n }\n\n selected.value = newSelected;\n }\n\n function onEnterAll() {\n isAllSelected.value = !isAllSelected.value;\n }\n</script>\n\n<template>\n <Field v-bind=\"props\" class=\"stash-filter-select\" data-test=\"stash-filter-select\" fieldset>\n <div class=\"flex flex-wrap gap-1.5\">\n <div v-if=\"props.canSelectAll\" :key=\"`${props.name}--all`\">\n <input\n :id=\"`${props.name}--all`\"\n v-model=\"isAllSelected\"\n class=\"sr-only\"\n tabindex=\"-1\"\n type=\"checkbox\"\n value=\"all\"\n />\n <!-- Prevent the native scroll behavior when clicking the label -->\n <label :for=\"`${props.name}--all`\" @click.prevent=\"onEnterAll\">\n <FilterChip :is-selected=\"isAllSelected\" tabindex=\"0\" @keypress.enter=\"onEnterAll\">\n {{ t('ll.all') }}\n </FilterChip>\n </label>\n </div>\n <div v-for=\"option in props.options\" :key=\"getOptionId(option)\">\n <input\n :id=\"getOptionId(option)\"\n v-model=\"selected\"\n class=\"sr-only\"\n tabindex=\"-1\"\n type=\"checkbox\"\n :value=\"option.value\"\n />\n <!-- Prevent the native scroll behavior when clicking the label -->\n <label :for=\"getOptionId(option)\" @click.prevent=\"onEnter(option.value)\">\n <FilterChip :is-selected=\"isOptionSelected(option)\" tabindex=\"0\" @keypress.enter=\"onEnter(option.value)\">\n {{ option.label }}\n </FilterChip>\n </label>\n </div>\n </div>\n </Field>\n</template>\n"],"names":["props","__props","emit","__emit","selected","computed","value","isAllSelected","isChecked","option","getOptionId","isOptionSelected","onEnter","enteredValue","newSelected","onEnterAll"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BE,UAAMA,IAAQC,GAIRC,IAAOC,GAOPC,IAAWC,EAAS;AAAA,MACxB,MAAM;AACJ,eAAOL,EAAM;AAAA,MACf;AAAA,MACA,IAAIM,GAAO;AACT,QAAAJ,EAAK,qBAAqBI,CAAK;AAAA,MACjC;AAAA,IAAA,CACD,GAEKC,IAAgBF,EAAS;AAAA,MAC7B,MAAM;AACJ,eAAOL,EAAM,QAAQ,WAAWA,EAAM,WAAW;AAAA,MACnD;AAAA,MACA,IAAIQ,GAAW;AACb,QAAAN,EAAK,qBAAqBM,IAAYR,EAAM,QAAQ,IAAI,CAACS,MAAWA,EAAO,KAAK,IAAI,CAAA,CAAE;AAAA,MACxF;AAAA,IAAA,CACD;AAED,aAASC,EAAYD,GAA4B;AAC/C,aAAO,GAAGT,EAAM,IAAI,KAAKS,EAAO,KAAK;AAAA,IACvC;AAEA,aAASE,EAAiBF,GAA4B;AACpD,aAAOT,EAAM,WAAW,SAASS,EAAO,KAAK;AAAA,IAC/C;AAEA,aAASG,EAAQC,GAA2C;AAC1D,YAAMC,IAAcV,EAAS,MAAM,OAAO,CAACE,MAAUA,MAAUO,CAAY;AAE3E,MAAIC,EAAY,WAAWV,EAAS,MAAM,UACxCU,EAAY,KAAKD,CAAY,GAG/BT,EAAS,QAAQU;AAAA,IACnB;AAEA,aAASC,IAAa;AACpB,MAAAR,EAAc,QAAQ,CAACA,EAAc;AAAA,IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|