@leaflink/stash 46.3.0 → 46.4.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.
@@ -1,9 +1,19 @@
1
- import { defineComponent as n, useCssModule as i, useSlots as p, openBlock as a, createElementBlock as o, normalizeClass as m, unref as e, renderSlot as u, createCommentVNode as y, createTextVNode as d, toDisplayString as _ } from "vue";
2
- import { t as f } from "./locale.js";
3
- import { s as g } from "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
4
- import { _ as w } from "./_plugin-vue_export-helper-dad06003.js";
1
+ import { defineComponent as d, useCssModule as f, useSlots as y, openBlock as l, createElementBlock as a, unref as e, createBlock as _, createCommentVNode as m, createElementVNode as u, renderSlot as i, toDisplayString as r, normalizeClass as n, createTextVNode as w } from "vue";
2
+ import { t as g } from "./locale.js";
3
+ import { _ as b } from "./Illustration.vue_vue_type_script_setup_true_lang-664fa82f.js";
4
+ import { s as x } from "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
5
+ import { _ as h } from "./_plugin-vue_export-helper-dad06003.js";
5
6
  import "lodash-es/get";
6
- const x = ["alt", "src"], S = /* @__PURE__ */ n({
7
+ import "lodash-es/uniqueId";
8
+ import "./index-79ce320f.js";
9
+ const k = {
10
+ key: "empty",
11
+ class: "stash-empty-state",
12
+ "data-test": "stash-empty-state"
13
+ }, v = {
14
+ key: 0,
15
+ class: "tw-flex tw-flex-col tw-items-center tw-text-center md:tw-flex-row md:tw-text-left"
16
+ }, S = { class: "tw-mb-1.5" }, $ = ["alt", "src"], C = /* @__PURE__ */ d({
7
17
  name: "ll-empty-state",
8
18
  __name: "EmptyState",
9
19
  props: {
@@ -11,31 +21,56 @@ const x = ["alt", "src"], S = /* @__PURE__ */ n({
11
21
  alt: "",
12
22
  src: ""
13
23
  }) },
14
- text: { default: "" }
24
+ text: { default: "" },
25
+ title: { default: "" },
26
+ subtitle: { default: "" },
27
+ vignette: { default: void 0 }
15
28
  },
16
- setup(r) {
17
- const t = r, s = i(), l = p();
18
- return (c, k) => (a(), o("div", {
19
- key: "empty",
20
- class: m(["stash-empty-state tw-mx-auto tw-my-0 tw-flex tw-items-center tw-justify-center tw-py-12", [e(s).root, { "tw-text-center": !t.image.src && !e(l).image }]]),
21
- "data-test": "stash-empty-state"
22
- }, [
23
- u(c.$slots, "image", {}, () => [
24
- t.image.src ? (a(), o("img", {
29
+ setup(p) {
30
+ const t = p, c = f(), s = y();
31
+ return (o, B) => (l(), a("div", k, [
32
+ t.title || e(s).title || t.subtitle || e(s).subtitle || t.vignette ? (l(), a("div", v, [
33
+ t.vignette ? (l(), _(b, {
25
34
  key: 0,
26
- class: m(["tw-mr-6", e(s).image]),
27
- alt: t.image.alt,
28
- src: t.image.src,
29
- "data-test": "stash-empty-state__img"
30
- }, null, 10, x)) : y("", !0)
31
- ]),
32
- d(" " + _(t.text || e(f)("ll.emptyState.noResults")), 1)
33
- ], 2));
35
+ "data-test": "stash-empty-state|illustration",
36
+ type: "vignette",
37
+ class: "tw-mx-3",
38
+ name: t.vignette,
39
+ size: 300
40
+ }, null, 8, ["name"])) : m("", !0),
41
+ u("section", null, [
42
+ i(o.$slots, "title", {}, () => [
43
+ u("h3", S, r(t.title), 1)
44
+ ]),
45
+ i(o.$slots, "subtitle", {}, () => [
46
+ t.subtitle || e(s).subtitle ? (l(), a("p", {
47
+ key: 0,
48
+ class: n({ " tw-mb-8": e(s).button, "tw-mb-0": !e(s).button })
49
+ }, r(t.subtitle), 3)) : m("", !0)
50
+ ]),
51
+ i(o.$slots, "button")
52
+ ])
53
+ ])) : (l(), a("div", {
54
+ key: 1,
55
+ class: n(["tw-mx-auto tw-my-0 tw-flex tw-items-center tw-justify-center tw-py-12", [e(c).root, { "tw-text-center": !t.image.src && !e(s).image }]])
56
+ }, [
57
+ i(o.$slots, "image", {}, () => [
58
+ t.image.src ? (l(), a("img", {
59
+ key: 0,
60
+ class: n(["tw-mr-6", e(c).image]),
61
+ alt: t.image.alt,
62
+ src: t.image.src,
63
+ "data-test": "stash-empty-state__img"
64
+ }, null, 10, $)) : m("", !0)
65
+ ]),
66
+ w(" " + r(t.text || e(g)("ll.emptyState.noResults")), 1)
67
+ ], 2))
68
+ ]));
34
69
  }
35
- }), h = {
36
- $style: g
37
- }, V = /* @__PURE__ */ w(S, [["__cssModules", h]]);
70
+ }), E = {
71
+ $style: x
72
+ }, q = /* @__PURE__ */ h(C, [["__cssModules", E]]);
38
73
  export {
39
- V as default
74
+ q as default
40
75
  };
41
76
  //# sourceMappingURL=EmptyState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.js","sources":["../src/components/EmptyState/EmptyState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { useCssModule, useSlots } from 'vue';\n\n import { t } from '../../locale';\n\n export interface EmptyStateProps {\n /**\n * Controls wether the sidebar is opened or not\n */\n image?: {\n alt?: string;\n src: string;\n };\n text?: string;\n }\n\n defineOptions({\n name: 'll-empty-state',\n });\n\n const props = withDefaults(defineProps<EmptyStateProps>(), {\n /**\n * An optional image to render\n */\n image: () => ({\n alt: '',\n src: '',\n }),\n\n /**\n * The custom message to render\n */\n text: '',\n });\n\n const classes = useCssModule();\n const slots = useSlots();\n</script>\n\n<template>\n <div\n key=\"empty\"\n class=\"stash-empty-state tw-mx-auto tw-my-0 tw-flex tw-items-center tw-justify-center tw-py-12\"\n data-test=\"stash-empty-state\"\n :class=\"[classes.root, { 'tw-text-center': !props.image.src && !slots.image }]\"\n >\n <slot name=\"image\">\n <img\n v-if=\"props.image.src\"\n class=\"tw-mr-6\"\n :alt=\"props.image.alt\"\n :class=\"classes.image\"\n :src=\"props.image.src\"\n data-test=\"stash-empty-state__img\"\n />\n </slot>\n\n {{ props.text || t('ll.emptyState.noResults') }}\n </div>\n</template>\n\n<style module>\n .root {\n max-width: 600px;\n }\n\n .image {\n max-width: 60px;\n }\n</style>\n"],"names":["classes","useCssModule","slots","useSlots"],"mappings":";;;;;;;;;;;;;;;;iBAmCQA,IAAUC,KACVC,IAAQC;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"EmptyState.js","sources":["../src/components/EmptyState/EmptyState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import { VignetteNames } from '../Illustration/Illustration.models';\n import Illustration from '../Illustration/Illustration.vue';\n\n export interface EmptyStateProps {\n /**\n * @deprecated Use illustration instead.\n */\n image?: {\n alt?: string;\n src: string;\n };\n\n /**\n * @deprecated Use title instead.\n */\n text?: string;\n\n /**\n * the title text of the empty state\n */\n title?: string;\n\n /**\n * the subtitle text of the empty state\n */\n subtitle?: string;\n\n /**\n * The name of the vignette illustration to render\n */\n vignette?: VignetteNames;\n }\n\n export interface EmptyStateSlots {\n title?: void;\n subtitle?: void;\n button?: void;\n image?: void;\n }\n\n defineOptions({\n name: 'll-empty-state',\n });\n\n const props = withDefaults(defineProps<EmptyStateProps>(), {\n /**\n * An optional image to render\n */\n image: () => ({\n alt: '',\n src: '',\n }),\n\n /**\n * The custom message to render\n */\n text: '',\n\n title: '',\n subtitle: '',\n vignette: undefined,\n });\n\n const classes = useCssModule();\n const slots = defineSlots<EmptyStateSlots>();\n</script>\n\n<template>\n <div key=\"empty\" class=\"stash-empty-state\" data-test=\"stash-empty-state\">\n <template v-if=\"props.title || slots.title || props.subtitle || slots.subtitle || props.vignette\">\n <div class=\"tw-flex tw-flex-col tw-items-center tw-text-center md:tw-flex-row md:tw-text-left\">\n <Illustration\n v-if=\"props.vignette\"\n data-test=\"stash-empty-state|illustration\"\n type=\"vignette\"\n class=\"tw-mx-3\"\n :name=\"props.vignette\"\n :size=\"300\"\n />\n <section>\n <slot name=\"title\">\n <h3 class=\"tw-mb-1.5\">\n {{ props.title }}\n </h3>\n </slot>\n\n <slot name=\"subtitle\">\n <p v-if=\"props.subtitle || slots.subtitle\" :class=\"{ ' tw-mb-8': slots.button, 'tw-mb-0': !slots.button }\">\n {{ props.subtitle }}\n </p>\n </slot>\n\n <slot name=\"button\"></slot>\n </section>\n </div>\n </template>\n\n <template v-else>\n <div\n class=\"tw-mx-auto tw-my-0 tw-flex tw-items-center tw-justify-center tw-py-12\"\n :class=\"[classes.root, { 'tw-text-center': !props.image.src && !slots.image }]\"\n >\n <slot name=\"image\">\n <img\n v-if=\"props.image.src\"\n class=\"tw-mr-6\"\n :alt=\"props.image.alt\"\n :class=\"classes.image\"\n :src=\"props.image.src\"\n data-test=\"stash-empty-state__img\"\n />\n </slot>\n\n {{ props.text || t('ll.emptyState.noResults') }}\n </div>\n </template>\n </div>\n</template>\n\n<style module>\n .root {\n max-width: 600px;\n }\n\n .image {\n max-width: 60px;\n }\n</style>\n"],"names":["classes","useCssModule","slots","_useSlots"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmEQA,IAAUC,KACVC,IAAQC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -45,6 +45,9 @@ declare const _default: __VLS_WithTemplateSlots<DefineComponent<__VLS_WithDefaul
45
45
  * The custom message to render
46
46
  */
47
47
  text: string;
48
+ title: string;
49
+ subtitle: string;
50
+ vignette: undefined;
48
51
  }>, {}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<EmptyStateProps>, {
49
52
  /**
50
53
  * An optional image to render
@@ -57,26 +60,87 @@ declare const _default: __VLS_WithTemplateSlots<DefineComponent<__VLS_WithDefaul
57
60
  * The custom message to render
58
61
  */
59
62
  text: string;
63
+ title: string;
64
+ subtitle: string;
65
+ vignette: undefined;
60
66
  }>>>, {
67
+ title: string;
61
68
  image: {
62
69
  alt?: string | undefined;
63
70
  src: string;
64
71
  };
65
72
  text: string;
66
- }, {}>, {
67
- image?(_: {}): any;
68
- }>;
73
+ subtitle: string;
74
+ vignette: "map" | "search" | "payments" | "calendar" | "dashboard" | "edit" | "megaphone" | "truck" | "warehouse" | "light-bulb" | "pie-chart" | "api" | "bank" | "basket" | "brand-menu" | "deals" | "document-search" | "empty-tray" | "graph" | "integrations" | "messages" | "money-bank" | "notifications" | "orders-empty" | "products" | "search-storefront" | "store" | "todo" | "users" | "warehouse-delivery";
75
+ }, {}>, Readonly<EmptyStateSlots>>;
69
76
  export default _default;
70
77
 
71
78
  export declare interface EmptyStateProps {
72
79
  /**
73
- * Controls wether the sidebar is opened or not
80
+ * @deprecated Use illustration instead.
74
81
  */
75
82
  image?: {
76
83
  alt?: string;
77
84
  src: string;
78
85
  };
86
+ /**
87
+ * @deprecated Use title instead.
88
+ */
79
89
  text?: string;
90
+ /**
91
+ * the title text of the empty state
92
+ */
93
+ title?: string;
94
+ /**
95
+ * the subtitle text of the empty state
96
+ */
97
+ subtitle?: string;
98
+ /**
99
+ * The name of the vignette illustration to render
100
+ */
101
+ vignette?: VignetteNames;
102
+ }
103
+
104
+ export declare interface EmptyStateSlots {
105
+ title?: void;
106
+ subtitle?: void;
107
+ button?: void;
108
+ image?: void;
80
109
  }
81
110
 
111
+ declare enum VignetteName {
112
+ Api = "api",
113
+ Bank = "bank",
114
+ Basket = "basket",
115
+ BrandMenu = "brand-menu",
116
+ Calendar = "calendar",
117
+ Dashboard = "dashboard",
118
+ Deals = "deals",
119
+ DocumentSearch = "document-search",
120
+ Edit = "edit",
121
+ EmptyTray = "empty-tray",
122
+ Graph = "graph",
123
+ Integrations = "integrations",
124
+ LightBulb = "light-bulb",
125
+ Map = "map",
126
+ Megaphone = "megaphone",
127
+ Messages = "messages",
128
+ MoneyBank = "money-bank",
129
+ Notifications = "notifications",
130
+ OrdersEmpty = "orders-empty",
131
+ Payments = "payments",
132
+ PieChart = "pie-chart",
133
+ Products = "products",
134
+ Search = "search",
135
+ SearchStorefront = "search-storefront",
136
+ Store = "store",
137
+ Todo = "todo",
138
+ Truck = "truck",
139
+ Users = "users",
140
+ Warehouse = "warehouse",
141
+ WarehouseDelivery = "warehouse-delivery"
142
+ }
143
+
144
+ declare type VignetteNames = `${VignetteName}`;
145
+
82
146
  export { }
package/dist/ListView.js CHANGED
@@ -58,6 +58,7 @@ import "lodash-es/isNil";
58
58
  import "./utils/i18n.js";
59
59
  import "./Radio.js";
60
60
  import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
61
+ import "./Illustration.vue_vue_type_script_setup_true_lang-664fa82f.js";
61
62
  import "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
62
63
  import "./Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js";
63
64
  const de = "_checkbox_hsxyw_10", he = "_actions_hsxyw_14", ue = {
@@ -379,7 +380,7 @@ function Ae(e, l, s, w, i, t) {
379
380
  }
380
381
  const Pe = {
381
382
  $style: Ie
382
- }, ss = /* @__PURE__ */ k(xe, [["render", Ae], ["__cssModules", Pe]]), Fe = "_caret_1147a_2", Oe = {
383
+ }, ls = /* @__PURE__ */ k(xe, [["render", Ae], ["__cssModules", Pe]]), Fe = "_caret_1147a_2", Oe = {
383
384
  "caret-up": "_caret-up_1147a_2",
384
385
  "caret-down": "_caret-down_1147a_6",
385
386
  caret: Fe
@@ -475,7 +476,7 @@ function Le(e, l, s, w, i, t) {
475
476
  }
476
477
  const Ve = {
477
478
  $style: Oe
478
- }, ls = /* @__PURE__ */ k(Ee, [["render", Le], ["__cssModules", Ve]]), De = "_header_c8ut0_25", Re = "_separator_c8ut0_1", Ne = "_dropdown_c8ut0_199", ze = {
479
+ }, is = /* @__PURE__ */ k(Ee, [["render", Le], ["__cssModules", Ve]]), De = "_header_c8ut0_25", Re = "_separator_c8ut0_1", Ne = "_dropdown_c8ut0_199", ze = {
479
480
  "list-items": "_list-items_c8ut0_2",
480
481
  "legacy-box": "_legacy-box_c8ut0_16",
481
482
  header: De,
@@ -1335,12 +1336,12 @@ function Ke(e, l, s, w, i, t) {
1335
1336
  }
1336
1337
  const We = {
1337
1338
  $style: ze
1338
- }, is = /* @__PURE__ */ k(He, [["render", Ke], ["__cssModules", We]]);
1339
+ }, rs = /* @__PURE__ */ k(He, [["render", Ke], ["__cssModules", We]]);
1339
1340
  export {
1340
1341
  we as BulkActions,
1341
- ss as ListGroup,
1342
- ls as ListHeader,
1342
+ ls as ListGroup,
1343
+ is as ListHeader,
1343
1344
  Te as LoadingManager,
1344
- is as default
1345
+ rs as default
1345
1346
  };
1346
1347
  //# sourceMappingURL=ListView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListView.js","sources":["../src/components/ListView/components/BulkActions.vue","../src/components/ListView/components/LoadingManager.vue","../src/components/ListView/components/ListGroup.vue","../src/components/ListView/components/ListHeader.vue","../src/components/ListView/ListView.vue"],"sourcesContent":["<script>\n import { t } from '../../../locale';\n import Button from '../../Button/Button.vue';\n import Checkbox from '../../Checkbox/Checkbox.vue';\n\n export default {\n name: 'bulk-actions',\n\n components: {\n 'll-button': Button,\n 'll-checkbox': Checkbox,\n },\n\n props: {\n allowSelectAll: Boolean,\n isAllPageChecked: Boolean,\n isSomePageChecked: Boolean,\n hideBulkActionOptions: Boolean,\n hideNumberOfTotalSelected: Boolean,\n totalCount: {\n type: Number,\n default: 0,\n },\n totalSelectedCount: {\n type: Number,\n default: 0,\n },\n },\n\n emits: ['change:select-current', 'change:select-all', 'change:clear-selected'],\n\n data: function () {\n return {\n selectAllText: t('ll.listView.selectAll'),\n };\n },\n\n computed: {\n clearSelectedText() {\n if (this.allowSelectAll) {\n return t('ll.listView.deselectAllCount', { count: this.totalCount });\n }\n\n return t('ll.listView.clearSelection');\n },\n\n showSelectAll() {\n return [this.totalSelectedCount !== this.totalCount, this.allowSelectAll].every(Boolean);\n },\n\n numberOfTotalSelectedText() {\n return t('ll.listView.numberOfTotalSelected', {\n num: this.totalSelectedCount,\n total: this.totalCount,\n });\n },\n\n selectAllCountText() {\n return t('ll.listView.selectAllCount', { count: this.totalCount });\n },\n\n numItemsSelectedText() {\n return t('ll.listView.numItemsSelected', {\n totalSelectedCount: this.totalSelectedCount,\n totalCount: this.totalCount,\n });\n },\n },\n\n methods: {\n onSelectPage(value) {\n this.$emit('change:select-current', value);\n },\n\n selectAll() {\n this.$emit('change:select-all');\n },\n\n clearSelected() {\n this.$emit('change:clear-selected');\n },\n },\n };\n</script>\n\n<template>\n <div\n class=\"lg:tw-flex\"\n :class=\"[\n $style['select-bar'],\n {\n 'lg:tw-hidden': hideBulkActionOptions,\n },\n 'tw-p-3',\n ]\"\n >\n <div\n class=\"tw-flex tw-items-center\"\n :class=\"{\n 'tw-justify-between': !hideBulkActionOptions,\n }\"\n >\n <ll-checkbox\n data-test=\"checkbox|bulk-actions\"\n :class=\"$style.checkbox\"\n class=\"tw-m-0 lg:tw-hidden\"\n :checked=\"isSomePageChecked && !!totalCount\"\n :indeterminate=\"isSomePageChecked && !isAllPageChecked\"\n :label=\"!totalSelectedCount ? selectAllText : ''\"\n @update:checked=\"onSelectPage\"\n />\n <div\n v-if=\"!!totalSelectedCount && !hideBulkActionOptions\"\n class=\"tw-flex tw-flex-1 tw-items-center tw-justify-between\"\n >\n <div v-if=\"!hideNumberOfTotalSelected\" class=\"tw-text-xs\">\n {{ numberOfTotalSelectedText }}\n </div>\n <div :class=\"{ 'tw-ml-3': !hideNumberOfTotalSelected }\">\n <ll-button v-if=\"showSelectAll\" inline @click=\"selectAll\">{{ selectAllCountText }}</ll-button>\n <ll-button v-else inline @click=\"clearSelected\">\n {{ clearSelectedText }}\n </ll-button>\n </div>\n </div>\n <div v-else-if=\"hideBulkActionOptions && !!totalSelectedCount\" class=\"tw-ml-1.5 lg:tw-hidden\">\n <h4>{{ numItemsSelectedText }}</h4>\n </div>\n </div>\n <div v-if=\"!!totalSelectedCount && !hideBulkActionOptions\" :class=\"$style.actions\">\n <slot name=\"bulk-actions-content\"></slot>\n </div>\n </div>\n</template>\n\n<style module>\n .select-bar {\n @media screen('lg') {\n border-bottom: 1px solid var(--color-ice-200);\n justify-content: center;\n vertical-align: middle;\n }\n }\n\n .checkbox {\n flex: 0 0 auto;\n }\n\n .actions > * {\n margin-top: theme('spacing.6');\n width: 100%;\n\n @media screen('lg') {\n margin-left: theme('spacing.3');\n margin-top: 0;\n width: auto;\n }\n }\n</style>\n","<script>\n import EmptyState from '../../EmptyState/EmptyState.vue';\n import Loading from '../../Loading/Loading.vue';\n\n export default {\n name: 'loading-manager',\n\n components: {\n EmptyState,\n Loading,\n },\n\n props: {\n emptyStateText: {\n type: String,\n default: '',\n },\n\n loading: Boolean,\n\n results: {\n type: Array,\n default: () => [],\n },\n },\n };\n</script>\n\n<template>\n <Loading v-if=\"loading\" class=\"ll-bg-white\" />\n <transition-group v-else-if=\"results.length\" name=\"slide-y\" tag=\"ul\">\n <slot></slot>\n </transition-group>\n <EmptyState v-else class=\"ll-bg-white\" :class=\"$style['empty-state']\" :text=\"emptyStateText\" />\n</template>\n\n<style module>\n .empty-state {\n max-width: 100%;\n }\n</style>\n","<script>\n import { CSS_VARS } from '../../../constants';\n import sticky from '../../../directives/sticky/sticky';\n import { getCssVar } from '../../../utils/helpers';\n import Button from '../../Button/Button.vue';\n import Expand from '../../Expand/Expand.vue';\n import Icon from '../../Icon/Icon.vue';\n\n export default {\n name: 'list-group',\n\n components: {\n Expand,\n 'll-button': Button,\n Icon,\n },\n\n directives: {\n sticky,\n },\n\n props: {\n /**\n * Disables the gutters between adjacent ListGroup components.\n */\n disableExternalGutters: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Allows the list items to be collapsed\n */\n isCollapsible: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Allows the expanded content to be collapsed by default.\n * Note: has no effect unless the `isCollapsible` prop is `true`.\n */\n isCollapsedByDefault: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n const isExpanded = !this.isCollapsible || !this.isCollapsedByDefault;\n\n return {\n isExpanded,\n isDoneExpanding: isExpanded,\n };\n },\n\n computed: {\n headerOffset() {\n return parseFloat(getCssVar(CSS_VARS.TOP_HEADER_HEIGHT));\n },\n },\n\n methods: {\n toggleExpand() {\n if (!this.isCollapsible) {\n return;\n }\n\n this.isExpanded = !this.isExpanded;\n\n if (!this.isExpanded) {\n this.isDoneExpanding = false;\n } // else wait for Expand to emit @after-expand\n },\n\n onHeaderClick(e) {\n // toggle the ListGroup, except when clicking the actions\n if (!this.$refs.actionsContainer.contains(e.target)) {\n this.toggleExpand();\n }\n },\n },\n };\n</script>\n\n<template>\n <div\n :class=\"[\n $style['list-group'],\n {\n 'disable-external-gutters': disableExternalGutters,\n 'is-collapsed': !isExpanded,\n },\n ]\"\n >\n <header\n class=\"tw-flex tw-items-center\"\n :class=\"[$style['main-header'], { 'tw-cursor-pointer': isCollapsible }]\"\n @click=\"onHeaderClick\"\n >\n <ll-button v-if=\"isCollapsible\" :class=\"['tw-mr-1.5 tw-text-ice-900', $style['expansion-toggle-button']]\" icon>\n <Icon :class=\"[isExpanded ? 'tw-rotate-270' : 'rotate-180']\" name=\"chevron-left\" />\n </ll-button>\n\n <div class=\"tw-flex-auto\">\n <slot name=\"title\"></slot>\n </div>\n\n <div ref=\"actionsContainer\">\n <slot name=\"actions\"></slot>\n </div>\n </header>\n\n <Expand :is-expanded=\"isExpanded\" @after-expand=\"isDoneExpanding = true\">\n <div :class=\"$style['expanded-content-wrapper']\">\n <header\n v-if=\"$slots['expanded-content-list-header']\"\n v-sticky=\"isExpanded && isDoneExpanding ? headerOffset : 0\"\n :class=\"$style['expanded-content-header']\"\n >\n <div class=\"tw-ll-grid tw-flex-1\" :class=\"$style['expanded-content-header-grid']\">\n <slot name=\"expanded-content-list-header\"></slot>\n </div>\n </header>\n <div :class=\"$style['expanded-content-list-items-wrapper']\">\n <transition-group name=\"fade\" mode=\"out-in\">\n <slot name=\"expanded-content-list-items\"></slot>\n </transition-group>\n </div>\n </div>\n </Expand>\n </div>\n</template>\n\n<style module>\n .main-header {\n @apply tw-shadow;\n\n background-color: var(--color-white);\n border-radius: theme('borderRadius.DEFAULT');\n margin-bottom: theme('spacing.6');\n padding: var(--grid-gutter);\n\n @media screen('lg') {\n border-bottom: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n margin-bottom: 0;\n }\n }\n\n .expanded-content-wrapper {\n position: relative;\n width: 100%;\n }\n\n @media screen('lg') {\n .expanded-content-wrapper {\n @apply tw-shadow;\n }\n }\n\n .expanded-content-header {\n background-color: var(--color-white);\n border-bottom: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n color: var(--color-ice-900);\n display: none;\n font-weight: 500;\n padding: 0 theme('spacing.3');\n transition: padding theme('transitionDuration.150') theme('transitionTimingFunction.swing');\n z-index: 1;\n\n @media screen('lg') {\n align-items: center;\n display: flex;\n }\n\n &:global(.is-sticky) {\n @apply tw-shadow;\n\n border-radius: 0;\n z-index: calc(theme('zIndex.control') + 1);\n }\n }\n\n .expanded-content-header-grid {\n column-gap: 0;\n grid-column-gap: 0;\n\n > div {\n align-items: center;\n border-right: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n display: flex;\n font-size: theme('fontSize.xs');\n justify-content: space-between;\n padding: theme('spacing.3');\n\n &:last-of-type {\n border-right: 0;\n }\n }\n }\n\n .expansion-toggle-button:focus {\n box-shadow: none;\n }\n\n .list-group:global(.disable-external-gutters) {\n .main-header {\n @media screen('lg') {\n border-radius: 0;\n }\n }\n\n .expanded-content-list-items-wrapper > * {\n @media screen('lg') {\n border-bottom: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n border-radius: 0;\n }\n }\n\n &:last-of-type {\n &:global(.is-collapsed) .main-header,\n .expanded-content-list-items-wrapper > *:last-child {\n @media screen('lg') {\n border-bottom: none;\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n }\n }\n }\n }\n</style>\n","<script>\n import Icon from '../../Icon/Icon.vue';\n\n export default {\n name: 'list-header',\n\n components: {\n 'll-icon': Icon,\n },\n\n props: {\n /**\n * keys to be sorted for the column\n * the first key should be the default sort value\n */\n sortKeys: {\n type: Array,\n required: true,\n validator: (value) => value.length === 2,\n },\n\n listViewRef: {\n type: Object,\n default: null,\n },\n },\n\n data() {\n return {\n isAscending: null,\n };\n },\n\n computed: {\n listViewInstance() {\n return this.listViewRef || this.$parent;\n },\n /**\n * Is the column currently sorted\n */\n isSorted() {\n return this.sortKeys.includes(this.listViewInstance.sortTerm);\n },\n\n /**\n * Show the top icon if it's not sorted or if the current sortTerm matches\n */\n showCaretUp() {\n return this.isAscending === null || this.sortKeys[0] === this.listViewInstance.sortTerm;\n },\n\n /**\n * Show the bottom icon if it's not sorted or if the current sortTerm matches\n */\n showCaretDown() {\n return this.isAscending === null || this.sortKeys[1] === this.listViewInstance.sortTerm;\n },\n },\n\n watch: {\n isSorted: {\n handler(value) {\n this.isAscending = value ? true : null;\n },\n immediate: true,\n },\n },\n\n methods: {\n /**\n * Sorts the column by the sort field\n */\n sort() {\n this.listViewInstance.onSort(this.sortKeys[this.isAscending ? 1 : 0]);\n this.isAscending = !this.isAscending;\n },\n },\n };\n</script>\n\n<template>\n <div :class=\"['tw-cursor-pointer', { 'tw-bg-blue-100': isSorted }]\" @click=\"sort\">\n <slot></slot>\n <div class=\"h-4 w-3 tw-relative tw-text-ice-700\" :class=\"{ 'is-active-sort': isSorted }\">\n <ll-icon\n v-if=\"showCaretUp\"\n name=\"caret-up\"\n class=\"tw-absolute\"\n :class=\"[$style.caret, $style['caret-up']]\"\n size=\"dense\"\n />\n <ll-icon\n v-if=\"showCaretDown\"\n name=\"caret-down\"\n class=\"tw-absolute\"\n :class=\"[$style.caret, $style['caret-down']]\"\n size=\"dense\"\n />\n </div>\n </div>\n</template>\n\n<style module>\n .caret-up {\n top: -5px;\n }\n\n .caret-down {\n top: 2px;\n }\n\n :global(.is-active-sort) .caret {\n top: -2px; /* vertically center the caret icon */\n }\n</style>\n","<script>\n import cloneDeep from 'lodash-es/cloneDeep';\n import { computed } from 'vue';\n\n import useSearch from '../../composables/useSearch/useSearch';\n import { CSS_VARS, LLLV_CHANGE_TRIGGERS } from '../../constants';\n import sticky from '../../directives/sticky/sticky';\n import { t } from '../../locale';\n import { persistentStorage } from '../../storage';\n import { filterItems as _filterItems, getCssVar, sortItems as _sortItems } from '../../utils/helpers';\n import Badge from '../Badge/Badge.vue';\n import Button from '../Button/Button.vue';\n import Checkbox from '../Checkbox/Checkbox.vue';\n import Dropdown from '../Dropdown/Dropdown.vue';\n import Expand from '../Expand/Expand.vue';\n import Filters from '../Filters/Filters.vue';\n import Icon from '../Icon/Icon.vue';\n import Input from '../Input/Input.vue';\n import Paginate from '../Paginate/Paginate.vue';\n import BulkActions from './components/BulkActions.vue';\n import LoadingManager from './components/LoadingManager.vue';\n\n export { default as BulkActions } from './components/BulkActions.vue';\n export { default as ListGroup } from './components/ListGroup.vue';\n export { default as ListHeader } from './components/ListHeader.vue';\n export { default as LoadingManager } from './components/LoadingManager.vue';\n\n const DEFAULT_SEARCH_SCHEMA = {\n isSearchable: true,\n placeholder: 'Search',\n searchBy: ['name'],\n };\n\n export default {\n name: 'll-list-view',\n\n components: {\n BulkActions,\n Filters,\n Paginate,\n LoadingManager,\n Badge,\n Button,\n Icon,\n Dropdown,\n Expand,\n Checkbox,\n Input,\n },\n\n directives: {\n sticky,\n },\n\n inject: {\n trackSearch: { default: () => () => {} },\n trackFilters: { default: () => () => {} },\n trackSort: { default: () => () => {} },\n trackResults: { default: () => () => {} },\n },\n\n props: {\n /**\n * Hide the '{number} of {total} selected' text for bulk actions\n */\n hideNumberOfTotalSelected: {\n type: Boolean,\n default: false,\n },\n /**\n * Hide the Select All checkbox for bulk actions\n */\n hideSelectAll: {\n type: Boolean,\n default: false,\n },\n /**\n * Text to render in EmptyState component if there are no results\n */\n emptyStateText: {\n type: String,\n default: '',\n },\n filterSchema: {\n type: Array,\n default: () => [],\n },\n /**\n * Make search fuzzy. Only for client side search.\n */\n fuzzySearch: {\n type: Boolean,\n default: false,\n },\n hideTotal: Boolean,\n initialPage: {\n type: Number,\n default: undefined,\n },\n /**\n * Can items on the page be selected for bulk actions\n */\n isSelectable: Boolean,\n /**\n * For loading data already paginated, filtered (including search), and sorted from a backend.\n * Defining this prop will disable the built-in search, filtering, sorting and pagination.\n * You will instead need to use the available events (`@change`, and `@change:` prefixed)\n * to know when to request new pages from your backend.\n * This requires providing `totalItemCount`.\n * Use the loading prop to indicate when data is being loaded.\n */\n isServerSide: Boolean,\n /**\n * The data for each row. Used in this file as this.internalItems (a copy) to allow mutation;\n */\n items: {\n type: Array,\n default: () => [],\n },\n /**\n * Default field to track selected items by\n */\n itemTrackBy: {\n type: String,\n default: 'id',\n },\n loading: Boolean,\n // Number of items to display per page\n pageSize: {\n type: Number,\n default: 50,\n },\n searchSchema: {\n type: Object,\n default: () => ({}),\n },\n // Provide an optional custom 'Sort by' label\n sortLabel: {\n type: String,\n default: () => t('ll.listView.sortBy'),\n },\n sortOnLoad: Boolean,\n sorts: {\n type: Object,\n default: () => ({}),\n },\n /**\n * Total number of unpaginated results\n * Required when `isServerSide` is `true`\n */\n totalItemCount: {\n type: Number,\n default: undefined,\n },\n /**\n * Validation schema function that returns an object\n */\n validationSchema: {\n type: Function,\n default: () => () => undefined,\n },\n /**\n * Whether to disable the sticky filters\n * if disabled, the following will happen\n * 1. pre-selected value(s) can be added to\n * the filter component's attributes to overwrite the sticky filters\n * 2. users will not have sticky filters on the page\n */\n disablePersistency: Boolean,\n /**\n * Whether to disable the ability of saving 'show-filters'\n * in local storage\n */\n disableShowFilter: Boolean,\n /**\n * Whether to disable the stickiness of the header.\n * Default is false. When true, neither the list headers nor\n * the bulk actions (when applicable) will be sticky.\n */\n disableStickyHeader: Boolean,\n /**\n * Whether to expand the filters section by default on load.\n */\n showFiltersOnLoad: Boolean,\n\n /**\n * Do not use the LoadingManager, and instead render the default slot as passed\n */\n disableLoader: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Override the header offset used to position the sticky header\n */\n stickyHeaderOffset: {\n type: Number,\n default: null,\n },\n /**\n * Prevent bulk actions dropdown from rendering\n */\n hideBulkActionOptions: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If initial search term is provided, the list will be filtered on load.\n */\n initialSearchTerm: {\n type: String,\n default: '',\n },\n\n /**\n * Function that determines whether the item checkbox is disabled or not (default: false)\n */\n isItemDisabled: {\n type: Function,\n default: () => false,\n },\n },\n\n emits: [\n 'change',\n 'change:filter',\n 'change:page',\n 'change:search',\n 'change:sort',\n 'change:reset',\n 'filters-toggle-click',\n 'select-all',\n 'deselect-all',\n 'update-filters',\n 'updateResults',\n ],\n\n data() {\n return {\n internalItems: [],\n currentPage: this.initialPage || 1, // TODO: fetch from query params\n previousPage: null,\n sortOptionsWidth: 0,\n filters: {},\n filterText: t('ll.filter'),\n searchFor: () => {}, // initialized in the watch handler for internalItems\n searchTerm: this.initialSearchTerm,\n searchText: t('ll.search'),\n sortTerm: '',\n isLoadingSearchSchemaAction: false,\n isShowingFilters: !!(\n this.filterSchema?.length &&\n (this.showFiltersOnLoad || persistentStorage.get('show-filters'))\n ),\n isFiltering: false,\n results: [],\n selectedItems: [],\n };\n },\n\n computed: {\n /**\n * Returns true if any of its list items are truthy; otherwise returns false.\n * @returns {boolean}\n */\n isLoading() {\n return [this.loading, this.isLoadingSearchSchemaAction, this.isFiltering].some(Boolean);\n },\n\n totalCount() {\n return this.isServerSide ? this.totalItemCount : this.results.length;\n },\n\n /**\n * Helps determine if the list is filtered or not when there is an incomplete\n * result list, such as when isServerSide is true.\n */\n isFiltered() {\n return !!(this.numberOfFilters || this.searchTerm);\n },\n\n /**\n * Merges the searchSchema with the default value since all attributes are optional\n */\n internalSearchSchema() {\n return {\n ...DEFAULT_SEARCH_SCHEMA,\n searchBy: !this.searchSchema.isSearchable && DEFAULT_SEARCH_SCHEMA.searchBy,\n ...this.searchSchema,\n };\n },\n\n /**\n * Start of page\n */\n startIndex() {\n return this.pageSize * (this.currentPage - 1);\n },\n\n /**\n * End of page\n */\n endIndex() {\n return this.startIndex + this.pageSize;\n },\n\n /**\n * Slices the results set into a paginated segment.\n * @returns One page in the paginated set of results\n */\n paginated() {\n // Disables the built-in client-side pagination\n let paginated;\n\n if (this.isServerSide) {\n paginated = this.results;\n } else {\n const { endIndex, totalCount, results, startIndex } = this;\n\n paginated = results.slice(startIndex, Math.min(endIndex, totalCount));\n }\n\n this.$emit('updateResults', paginated);\n\n return paginated;\n },\n\n /**\n * Displays a visual indication for the number of results, or \"working\" if the\n * results are being determined.\n */\n total() {\n const current = this.pageSize * (this.currentPage - 1);\n const range = this.paginated.length ? `${current + 1} - ${current + this.paginated.length}` : 0;\n\n return this.isLoading\n ? t('ll.listView.calculating')\n : t('ll.listView.totalResults', { num: String(range), total: String(this.totalCount) });\n },\n\n /**\n * Determines if both #list-header and #list-items slots are used.\n * @returns {boolean}\n */\n useDefinedSlots() {\n return !!this.$slots['list-header'] && !!this.$slots['list-items'];\n },\n\n /**\n * Don't show total count if list items are selected and total is not hidden\n */\n shouldShowTotal() {\n return !this.totalSelectedCount && !this.hideTotal;\n },\n\n /**\n * Returns a list of the selected items' track by field\n */\n selectedItemIds() {\n return this.selectedItems.map((item) => item[this.itemTrackBy]);\n },\n\n /**\n * Returns a list of the paginated items' track by field\n */\n paginatedIds() {\n return this.paginated.map((item) => item[this.itemTrackBy]);\n },\n\n isAllPageChecked() {\n if (this.isServerSide) {\n return this.totalCount > 0 && this.totalCount === this.selectedItemIds.length;\n }\n\n return this.totalCount > 0 && this.paginatedIds.every((id) => this.selectedItemIds.includes(id));\n },\n\n isSomePageChecked() {\n if (this.isServerSide) {\n return this.totalCount > 0 && this.selectedItemIds.length > 0;\n }\n\n return this.totalCount > 0 && this.paginatedIds.some((id) => this.selectedItemIds.includes(id));\n },\n\n numberOfFilters() {\n return Object.keys(this.filters).reduce((acc, item) => {\n const filterBy = this.filters[item].filterBy;\n const isBoolean = typeof filterBy[0] === 'boolean';\n const isToggle = this.filters[item].filterType === 'll-checkbox';\n const isEmpty = !this.filters[item].filterType.length;\n const isInputOptionsIncomplete = this.filters[item].filterType === 'll-input-options' && filterBy[0] === '';\n\n /**\n * Don't include hidden or incomplete fields in the count:\n * - Hidden filter populated via another filter's onChange callback\n * - InputOptions with incomplete/missing values\n */\n if (isEmpty || isInputOptionsIncomplete) {\n return acc;\n }\n\n if (isBoolean || typeof filterBy[0] === 'string') {\n // Do not count toggle filters (eg. checkbox) with a `false` value\n return acc + (filterBy[0] || !isToggle ? 1 : 0);\n }\n\n return acc + (filterBy.length || 0);\n }, 0);\n },\n\n isSelectBarVisible() {\n return !!this.totalSelectedCount;\n },\n\n showPrimaryControls() {\n return this.internalSearchSchema.isSearchable || this.filterSchema.length;\n },\n\n showSecondaryControls() {\n return !!this.$slots['secondary-controls'];\n },\n\n isSortable() {\n return Object.keys(this.sorts).length > 0;\n },\n\n totalSelectedCount() {\n return this.selectedItems.length;\n },\n\n headerOffset() {\n // passing null to the v-sticky directive will prevent it from being attached to the node\n if (this.disableStickyHeader) {\n return null;\n }\n\n return this.stickyHeaderOffset ?? parseFloat(getCssVar(CSS_VARS.TOP_HEADER_HEIGHT));\n },\n },\n\n watch: {\n isShowingFilters(value) {\n if (!this.disableShowFilter) {\n persistentStorage.set('show-filters', value);\n }\n },\n\n items: {\n handler() {\n this.internalItems = cloneDeep(this.items);\n },\n immediate: true,\n deep: true,\n },\n\n internalItems: {\n handler() {\n if (this.isServerSide) {\n this.results = this.internalItems;\n\n this.trackResults({\n page: this.currentPage,\n results: this.results,\n search: this.searchTerm,\n });\n\n return;\n }\n\n const { searchFor } = useSearch({\n items: computed(() => this.internalItems),\n fieldNames: this.internalSearchSchema.searchBy.length\n ? this.internalSearchSchema.searchBy\n : [this.displayBy],\n trackBy: this.itemTrackBy,\n });\n\n this.searchFor = (searchTerm) => searchFor(searchTerm, { fuzzy: this.fuzzySearch });\n\n this.processResults();\n },\n immediate: true,\n },\n\n sortTerm() {\n if (this.isServerSide) {\n return;\n }\n\n this.processResults();\n },\n\n sorts: {\n handler(value) {\n const sortTerms = Object.keys(value);\n\n this.sortTerm = this.sortOnLoad && sortTerms.length ? sortTerms[0] : '';\n },\n immediate: true,\n },\n },\n\n created() {\n if (this.isServerSide) {\n if (this.totalItemCount === undefined) {\n throw new Error('`totalItemCount` is required when `isServerSide` is `true`.');\n }\n\n return;\n }\n\n if (this.searchSchema.action && this.internalItems.length) {\n throw new Error('You must pass either `action` or `items`, not both.');\n }\n\n if (this.searchTerm) {\n this.onSearch();\n }\n },\n\n methods: {\n /**\n * Processes the results with searchFor, filterItems, and/or sortItems.\n * Skipped when isServerSide is true because results are pre-processed.\n * @returns {Promise<void>}\n */\n async processResults() {\n if (this.searchSchema.action) {\n this.isLoadingSearchSchemaAction = true;\n let actionResponse;\n\n try {\n actionResponse = await this.searchSchema.action({ search: this.searchTerm });\n } finally {\n this.isLoadingSearchSchemaAction = false;\n }\n\n this.results = this.sortItems(this.filterItems(actionResponse?.results || []));\n } else {\n this.results = this.sortItems(this.filterItems(this.searchFor(this.searchTerm)));\n }\n\n this.trackResults({\n page: this.currentPage,\n results: this.results,\n search: this.searchTerm,\n });\n },\n\n /**\n * Filters the list of `items` based on options selected in the `filters` object\n * @param {array} items A list of items to filter.\n * @returns list of items filtered by the applied filters\n */\n filterItems(items) {\n return _filterItems(items, this.filters);\n },\n\n /**\n * Sorts a list of items based on options selected in the `sorts` object\n * @param {array} items A list of items to sort.\n * @returns list of items sorted according to the sort term.\n */\n sortItems(items) {\n return this.sortTerm ? _sortItems(items, this.sorts[this.sortTerm]) : items;\n },\n\n change({ trigger = '' } = {}) {\n const { currentPage, filters, isFiltered, pageSize, searchTerm, sortTerm } = this;\n\n const params = {\n filters,\n isFiltered,\n page: {\n number: currentPage,\n previousNumber: this.previousPage,\n size: pageSize,\n },\n search: searchTerm,\n sort: sortTerm,\n trigger,\n };\n\n this.$emit('change', params);\n },\n\n /**\n * Clear search term and reset results to their initial state\n */\n async clearSearchTerm() {\n this.searchTerm = '';\n await this.$attrs.onSearchTermClear?.();\n this.onSearch();\n },\n\n /**\n * Resets the results to their initial state on page load\n */\n reset() {\n this.$emit('change:reset');\n\n this.searchTerm = '';\n\n this.setPage({ pageNumber: 1 });\n\n if (this.isServerSide) {\n this.change({ trigger: LLLV_CHANGE_TRIGGERS.RESET });\n\n return;\n }\n\n this.processResults();\n },\n\n onSearchTermChange() {\n this.$attrs.onSearchTermChange?.(this.searchTerm);\n },\n\n /**\n * Event handler for when the user:\n * - clicks the Search button\n * - presses the enter key while focused on the search input\n * Calls a method in Filters that triggers `this.onFilter`. This is necessary\n * in order to persist the filters in local storage, which is handled internally\n * by Filters.\n */\n onSearch() {\n this.$refs.llFilters.applyFilters({ trigger: LLLV_CHANGE_TRIGGERS.SEARCH });\n },\n\n /**\n * Event handler for when the user:\n * - clicks the Apply button\n * - clicks the Search button (from `this.onSearch`)\n * - presses the enter key while focused on the search input (from `this.onSearch`)\n * @see: SELL-350\n * @param {object} [options] - optional parameters\n * @param {string} [options.trigger] - what caused the changes\n * @returns {Promise<void>}\n */\n async onFilter({ trigger = LLLV_CHANGE_TRIGGERS.APPLY } = {}) {\n this.setPage({ pageNumber: 1 });\n this.change({ trigger });\n this.trackSearch(this.searchTerm);\n this.trackFilters(this.filters);\n this.selectedItems = [];\n\n if (this.isServerSide) {\n return;\n }\n\n try {\n this.isFiltering = true;\n await this.processResults({ trigger });\n } finally {\n this.isFiltering = false;\n }\n\n this.$emit('change:search', this.searchTerm);\n this.$emit('change:filter', this.filters);\n this.$emit('update-filters', this.filters); // deprecated; replaced by change:filter\n this.clearSelected();\n },\n\n onFiltersToggleClick() {\n this.isShowingFilters = !this.isShowingFilters;\n\n this.$emit('filters-toggle-click', {\n isShowingFilters: this.isShowingFilters,\n });\n },\n\n /**\n * Extend the dropdown list so it does not shift when\n * the options drawer is open\n */\n onSortToggle() {\n // spacing added to the width of the dropdown container\n const spacing = 36;\n\n this.$nextTick(() => {\n this.sortOptionsWidth = `${this.$refs.sortOptions.clientWidth + spacing}px`;\n });\n },\n\n /**\n * Executes any side-effects when the sort `term` is changed\n * Always fires `change` automatically.\n * @param {string} term The updated sort term\n */\n onSort(term) {\n if (term === this.sortTerm) {\n return;\n }\n\n this.sortTerm = term;\n\n this.$emit('change:sort', term);\n this.trackSort(term);\n this.clearSelected();\n this.setPage({ pageNumber: 1 });\n this.change({ trigger: LLLV_CHANGE_TRIGGERS.SORT });\n },\n\n /**\n * Sets current page for the Paginator.\n * @param {Object} data\n * @param {number} data.pageNumber - the page number\n * @param {boolean} data.forceChange - flag to force the change\n */\n setPage({ pageNumber, forceChange = false } = {}) {\n this.previousPage = this.currentPage;\n\n this.currentPage = pageNumber;\n\n if (!this.isServerSide) {\n this.$emit('change:page', pageNumber);\n }\n\n if (forceChange) {\n this.change({ trigger: LLLV_CHANGE_TRIGGERS.PAGE });\n }\n },\n\n /**\n * Set the scroll position to the top of the list view.\n */\n scrollToTop() {\n this.$refs.scrollTarget && this.$refs.scrollTarget.scrollIntoView({ behavior: 'smooth', block: 'center' });\n },\n\n onPaginateSetPage(pageNumber) {\n this.setPage({ pageNumber, forceChange: true });\n this.scrollToTop();\n },\n\n /**\n * Selects or deselects all items on a page\n */\n onSelectPage(value) {\n this.$emit('select-all', value);\n\n if (value) {\n const items = Array.from(new Set([...this.selectedItems, ...this.paginated]));\n\n this.selectedItems = this.selectItems(items);\n } else {\n this.selectedItems = this.selectedItems.filter((item) => !this.paginatedIds.includes(item[this.itemTrackBy]));\n }\n },\n\n selectAll() {\n this.selectedItems = this.selectItems(this.results);\n },\n\n /**\n * Selects one item\n */\n onSelectItem({ item, value }) {\n if (this.isItemDisabled(item)) {\n return;\n }\n\n if (value) {\n this.selectedItems.push(item);\n } else {\n this.selectedItems = this.selectedItems.filter(\n (selectedItem) => selectedItem[this.itemTrackBy] !== item[this.itemTrackBy],\n );\n }\n },\n\n /**\n * Clears current selected items\n */\n clearSelected() {\n this.$emit('deselect-all');\n this.selectedItems = [];\n },\n\n selectItems(items) {\n return items.reduce((acc, item) => (this.isItemDisabled(item) ? acc : [...acc, item]), []);\n },\n },\n };\n</script>\n\n<template>\n <div>\n <div\n v-if=\"showPrimaryControls || showSecondaryControls\"\n ref=\"scrollTarget\"\n class=\"tw-mb-6\"\n :class=\"{ 'tw-ll-grid': showPrimaryControls && showSecondaryControls }\"\n >\n <div\n v-if=\"showPrimaryControls\"\n class=\"controls\"\n :class=\"[$style['legacy-box'], { 'tw-col-span-12 lg:tw-col-span-6': showSecondaryControls }]\"\n data-test=\"filters|controls\"\n >\n <div class=\"tw-ll-grid tw-grid-cols-4 md:tw-grid-cols-8 lg:tw-grid-cols-12\">\n <!-- Search -->\n <Input\n v-if=\"internalSearchSchema.isSearchable\"\n ref=\"search-input\"\n v-model=\"searchTerm\"\n class=\"tw-col-span-3 md:tw-col-span-4\"\n data-test=\"input|search-input\"\n :class=\"[$style['search-input'], { 'lg:tw-col-span-8': showSecondaryControls }]\"\n :hint-text=\"internalSearchSchema.hintText\"\n :label=\"searchText\"\n :placeholder=\"internalSearchSchema.placeholder\"\n @keyup.enter=\"!isLoading && onSearch()\"\n @change=\"onSearchTermChange\"\n >\n <template #append>\n <button\n v-if=\"searchTerm\"\n data-test=\"button|clear-search\"\n :class=\"$style['clear-button']\"\n :disabled=\"isLoading\"\n @click=\"clearSearchTerm\"\n >\n <Icon name=\"close\" />\n </button>\n <Button\n data-test=\"button|search-button\"\n :disabled=\"isLoading\"\n :class=\"$style['search-button']\"\n @click=\"onSearch\"\n >\n <Icon\n :class=\"{ 'tw-animate-spin tw-text-teal-500': isFiltering }\"\n :name=\"isFiltering ? 'working' : 'search'\"\n />\n </Button>\n </template>\n </Input>\n\n <!-- Filter Toggle -->\n <div\n v-if=\"filterSchema.length\"\n class=\"tw-col-span-1 tw-flex tw-items-end\"\n :class=\"[\n $style['filter-toggle-btn'],\n { [$style['filter-toggle-btn-with-hint-text']]: !!internalSearchSchema.hintText },\n ]\"\n >\n <Badge :content=\"numberOfFilters\">\n <Button\n secondary\n class=\"tw-relative tw-w-full tw-min-w-auto\"\n color=\"blue\"\n data-test=\"button|toggle-filters\"\n :disabled=\"isFiltering\"\n @click=\"onFiltersToggleClick\"\n >\n <Icon\n v-if=\"isFiltering\"\n name=\"working\"\n :class=\"[\n { 'tw-animate-spin': isFiltering },\n isShowingFilters ? 'tw-text-teal-500' : 'tw-text-ice-700',\n ]\"\n />\n <Icon v-else name=\"filter-line\" />\n {{ filterText }}\n </Button>\n </Badge>\n </div>\n\n <!-- Actions -->\n <div class=\"button-grid tw-col-span-1 tw-items-end tw-justify-end lg:tw-col-span-3\">\n <slot name=\"actions\"> </slot>\n </div>\n </div>\n\n <!-- Filters -->\n <Expand data-test=\"filters|content\" :class=\"$style['filters-expand']\" :is-expanded=\"isShowingFilters\">\n <div class=\"tw-relative tw-pt-12\" :class=\"$style['filters-wrapper']\">\n <Filters\n ref=\"llFilters\"\n :class=\"{ [$style['filters-half-width']]: showPrimaryControls && showSecondaryControls }\"\n :disable-apply=\"isLoading\"\n :disable-clear=\"isLoading || !numberOfFilters\"\n :disable-persistency=\"disablePersistency\"\n :schema=\"filterSchema\"\n :validation-schema=\"validationSchema\"\n @change=\"filters = $event\"\n @reset=\"reset\"\n @submit=\"onFilter\"\n />\n </div>\n </Expand>\n </div>\n\n <div\n v-if=\"showSecondaryControls\"\n class=\"secondary-controls\"\n :class=\"[$style['legacy-box'], { 'tw-col-span-12 tw-mt-0 lg:tw-col-span-6': showPrimaryControls }]\"\n >\n <slot name=\"secondary-controls\"></slot>\n </div>\n </div>\n\n <!-- @slot Renders custom content in the space below the filters and above the list -->\n <slot name=\"eyebrow\"></slot>\n\n <div\n v-if=\"shouldShowTotal || Object.keys(sorts).length\"\n class=\"tw-mb-1.5\"\n :class=\"shouldShowTotal ? $style['total-sort'] : 'tw-text-right'\"\n >\n <div v-if=\"shouldShowTotal\" class=\"tw-text-xs\">{{ total }}</div>\n\n <!-- Sort -->\n <Dropdown\n v-if=\"Object.keys(sorts).length\"\n :class=\"$style.dropdown\"\n :label=\"`${sortLabel} ${sortTerm}`\"\n @toggle.once=\"onSortToggle\"\n >\n <ul ref=\"sortOptions\" class=\"dropdown__list\" :style=\"{ minWidth: sortOptionsWidth }\">\n <li\n v-for=\"(sortOption, index) in Object.keys(sorts)\"\n :key=\"index\"\n :class=\"{ 'tw-bg-blue-100 tw-text-ice-700': sortOption === sortTerm }\"\n class=\"dropdown__item tw-rounded\"\n >\n <Button inline class=\"tw-items-center\" :class=\"$style['sort-option']\" @click=\"onSort(sortOption)\">\n {{ sortOption }}\n <Icon v-if=\"sortOption === sortTerm\" name=\"check\" class=\"tw-ml-auto tw-text-blue-500\" />\n </Button>\n </li>\n </ul>\n </Dropdown>\n </div>\n\n <!-- Defined Slots -->\n <div v-if=\"useDefinedSlots\" :class=\"$style['list-items']\">\n <header\n v-sticky=\"headerOffset\"\n data-test=\"header|defined-slot\"\n :class=\"[\n $style.header,\n {\n 'tw-m-0': !isSelectable,\n },\n ]\"\n class=\"tw-rounded\"\n >\n <div :class=\"$style['header-grid-container']\" class=\"tw-border-b tw-border-ice-200 tw-px-3\">\n <Checkbox\n v-if=\"isSelectable\"\n class=\"tw-ml-3\"\n :checked=\"isSomePageChecked\"\n :class=\"$style['select-all']\"\n :indeterminate=\"isSomePageChecked && !isAllPageChecked\"\n @update:checked=\"onSelectPage\"\n />\n <div class=\"tw-ll-grid tw-flex-1\" :class=\"$style['header-grid']\">\n <slot name=\"list-header\"> </slot>\n </div>\n </div>\n\n <!-- Select Bar -->\n <BulkActions\n v-if=\"isSelectable\"\n v-bind=\"{\n allowSelectAll: !hideSelectAll && !isServerSide,\n isAllPageChecked,\n isSomePageChecked,\n totalCount,\n totalSelectedCount,\n hideBulkActionOptions,\n hideNumberOfTotalSelected,\n }\"\n :class=\"!isSelectBarVisible && 'lg:tw-hidden'\"\n @change:clear-selected=\"clearSelected\"\n @change:select-current=\"onSelectPage\"\n @change:select-all=\"selectAll\"\n >\n <template #bulk-actions-content>\n <slot name=\"bulk-actions\" :selected-items=\"selectedItems\"> </slot>\n </template>\n </BulkActions>\n </header>\n\n <component\n :is=\"disableLoader ? 'div' : 'LoadingManager'\"\n :empty-state-text=\"emptyStateText\"\n :loading=\"isLoading\"\n :results=\"paginated\"\n >\n <slot\n name=\"list-items\"\n :clear-all=\"clearSelected\"\n :display-items=\"results\"\n :is-filtered=\"isFiltered\"\n :is-item-disabled=\"isItemDisabled\"\n :results=\"paginated\"\n :on-select=\"onSelectItem\"\n :selected-items=\"selectedItems\"\n ></slot>\n </component>\n </div>\n\n <!-- Default Slot -->\n <slot\n :current-page=\"currentPage\"\n :display-items=\"results\"\n :filters=\"filters\"\n :is-filtered=\"isFiltered\"\n :is-item-disabled=\"isItemDisabled\"\n :results=\"paginated\"\n :search-term=\"searchTerm\"\n :total=\"totalCount\"\n ></slot>\n\n <!-- Pagination -->\n <Paginate\n v-if=\"totalCount > pageSize\"\n :current-page=\"currentPage\"\n :list-length=\"totalCount\"\n :page-size=\"pageSize\"\n @set-page=\"onPaginateSetPage\"\n />\n </div>\n</template>\n\n<style module>\n .list-items {\n background-color: var(--color-ice-200);\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n min-width: 100%;\n position: relative;\n }\n\n @media screen('lg') {\n .list-items {\n @apply tw-shadow;\n }\n }\n\n /* the .legacy-box styles are copied from .box in _box.scss */\n .legacy-box {\n @apply tw-shadow;\n\n background: var(--color-white);\n border-radius: theme('borderRadius.DEFAULT');\n padding: theme('spacing.6') var(--grid-gutter);\n }\n\n .header {\n background-color: var(--color-white);\n color: var(--color-ice-900);\n font-weight: 500;\n margin-bottom: theme('spacing.3');\n overflow: hidden;\n z-index: 1;\n\n &:global(.is-sticky) {\n @apply tw-shadow;\n\n border-radius: 0;\n overflow: visible;\n z-index: calc(theme('zIndex.control') + 1);\n\n &::before,\n &::after {\n background-color: var(--color-white);\n content: '';\n height: 100%;\n overflow-x: hidden;\n position: absolute;\n right: 100%;\n top: 0;\n width: theme('spacing.3');\n\n @media screen('lg') {\n content: none;\n }\n }\n\n &::after {\n left: 100%;\n right: auto;\n }\n }\n\n :global(.input--checkbox) {\n label {\n min-height: theme('spacing.6');\n }\n }\n\n @media screen('lg') {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n margin-bottom: 0;\n }\n }\n\n .header-grid-container {\n display: none;\n transition: padding theme('transitionDuration.150') theme('transitionTimingFunction.swing');\n\n @media screen('lg') {\n align-items: center;\n display: flex;\n }\n }\n\n .header-grid {\n column-gap: 0 !important;\n grid-column-gap: 0 !important;\n\n > div {\n align-items: center;\n border-right: 1px solid var(--color-ice-200);\n display: flex;\n font-size: theme('fontSize.xs');\n justify-content: space-between;\n padding: theme('spacing.3');\n\n &:first-of-type {\n margin-left: calc(-1 * theme('spacing.3'));\n padding-left: theme('spacing.6');\n }\n\n &:last-of-type {\n border-right: 0;\n margin-right: calc(-1 * theme('spacing.3'));\n }\n }\n }\n\n .search-input {\n :global(input) {\n /* to prevent search text from overlapping the \"Clear\" button */\n padding-right: calc(theme('height.input') * 2) !important;\n }\n\n :global(.stash-input-append) {\n display: flex;\n justify-content: flex-end;\n width: 72px; /* double the the default width of 36px */\n\n .clear-button {\n color: var(--color-ice-700);\n height: 36px;\n margin: 0;\n min-width: 36px;\n padding: 0;\n width: 36px;\n\n &:disabled {\n color: var(--color-ice-500);\n cursor: default;\n }\n }\n\n .search-button {\n border-bottom-left-radius: 0;\n border-color: var(--color-blue-500);\n border-left: none;\n border-top-left-radius: 0;\n min-width: 36px;\n padding: 0 theme('spacing[1.5]');\n width: 36px;\n\n &:disabled {\n border-color: var(--color-ice-500);\n }\n }\n }\n }\n\n @media screen('md') {\n .total-sort {\n align-items: baseline;\n display: flex;\n justify-content: space-between;\n }\n }\n\n .filter-toggle-btn {\n min-width: fit-content !important; /* ensure this overrides the grid min-width applied */\n }\n\n .filter-toggle-btn-with-hint-text {\n /* search hint text has 16px of height and has 4px of margin top. Adding here directly to compensate that */\n margin-bottom: 20px;\n }\n\n @keyframes separator {\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n }\n\n .filters-expand:global(.stash-expand--expanded) {\n .filters-wrapper::before {\n animation: separator theme('transitionDuration.300') theme('transitionTimingFunction.ease-in-out') 0.5s 1 forwards;\n background: var(--color-ice-200);\n content: '';\n height: theme('borderWidth.DEFAULT');\n left: calc(var(--grid-gutter) * -1);\n opacity: 0;\n position: absolute;\n right: calc(var(--grid-gutter) * -1);\n top: theme('spacing.6');\n }\n }\n\n .filters-half-width {\n @media screen('lg') {\n :global(.field-wrapper) {\n grid-column: span 6 / span 6; /* col-span-6 */\n }\n }\n }\n\n .dropdown :global(.tw-text-blue-500) {\n font-size: theme('fontSize.xs');\n }\n\n .sort-option {\n height: theme('spacing.9');\n }\n\n .select-all {\n width: theme('spacing.6');\n }\n</style>\n"],"names":["_sfc_main","Button","Checkbox","t","value","_createElementBlock","_ctx","$props","_createElementVNode","_createVNode","_component_ll_checkbox","_normalizeClass","$options","_openBlock","_hoisted_1","_hoisted_2","_toDisplayString","_createBlock","_component_ll_button","_hoisted_3","_renderSlot","EmptyState","Loading","_component_Loading","_TransitionGroup","_component_EmptyState","Expand","Icon","sticky","isExpanded","getCssVar","CSS_VARS","$data","args","_component_Icon","_component_Expand","_component_ll_icon","DEFAULT_SEARCH_SCHEMA","BulkActions","Filters","Paginate","LoadingManager","Badge","Dropdown","Input","_a","persistentStorage","paginated","endIndex","totalCount","results","startIndex","current","range","item","id","acc","filterBy","isBoolean","isToggle","isEmpty","isInputOptionsIncomplete","cloneDeep","searchFor","useSearch","computed","searchTerm","sortTerms","actionResponse","items","_filterItems","_sortItems","trigger","currentPage","filters","isFiltered","pageSize","sortTerm","params","_b","LLLV_CHANGE_TRIGGERS","term","pageNumber","forceChange","selectedItem","_component_Input","$event","_cache","_withKeys","_component_Button","_component_Badge","_createTextVNode","_component_Filters","_hoisted_4","_component_Dropdown","_Fragment","_renderList","sortOption","index","_component_Checkbox","_component_BulkActions","_mergeProps","_resolveDynamicComponent","_component_Paginate"],"mappings":"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"}
1
+ {"version":3,"file":"ListView.js","sources":["../src/components/ListView/components/BulkActions.vue","../src/components/ListView/components/LoadingManager.vue","../src/components/ListView/components/ListGroup.vue","../src/components/ListView/components/ListHeader.vue","../src/components/ListView/ListView.vue"],"sourcesContent":["<script>\n import { t } from '../../../locale';\n import Button from '../../Button/Button.vue';\n import Checkbox from '../../Checkbox/Checkbox.vue';\n\n export default {\n name: 'bulk-actions',\n\n components: {\n 'll-button': Button,\n 'll-checkbox': Checkbox,\n },\n\n props: {\n allowSelectAll: Boolean,\n isAllPageChecked: Boolean,\n isSomePageChecked: Boolean,\n hideBulkActionOptions: Boolean,\n hideNumberOfTotalSelected: Boolean,\n totalCount: {\n type: Number,\n default: 0,\n },\n totalSelectedCount: {\n type: Number,\n default: 0,\n },\n },\n\n emits: ['change:select-current', 'change:select-all', 'change:clear-selected'],\n\n data: function () {\n return {\n selectAllText: t('ll.listView.selectAll'),\n };\n },\n\n computed: {\n clearSelectedText() {\n if (this.allowSelectAll) {\n return t('ll.listView.deselectAllCount', { count: this.totalCount });\n }\n\n return t('ll.listView.clearSelection');\n },\n\n showSelectAll() {\n return [this.totalSelectedCount !== this.totalCount, this.allowSelectAll].every(Boolean);\n },\n\n numberOfTotalSelectedText() {\n return t('ll.listView.numberOfTotalSelected', {\n num: this.totalSelectedCount,\n total: this.totalCount,\n });\n },\n\n selectAllCountText() {\n return t('ll.listView.selectAllCount', { count: this.totalCount });\n },\n\n numItemsSelectedText() {\n return t('ll.listView.numItemsSelected', {\n totalSelectedCount: this.totalSelectedCount,\n totalCount: this.totalCount,\n });\n },\n },\n\n methods: {\n onSelectPage(value) {\n this.$emit('change:select-current', value);\n },\n\n selectAll() {\n this.$emit('change:select-all');\n },\n\n clearSelected() {\n this.$emit('change:clear-selected');\n },\n },\n };\n</script>\n\n<template>\n <div\n class=\"lg:tw-flex\"\n :class=\"[\n $style['select-bar'],\n {\n 'lg:tw-hidden': hideBulkActionOptions,\n },\n 'tw-p-3',\n ]\"\n >\n <div\n class=\"tw-flex tw-items-center\"\n :class=\"{\n 'tw-justify-between': !hideBulkActionOptions,\n }\"\n >\n <ll-checkbox\n data-test=\"checkbox|bulk-actions\"\n :class=\"$style.checkbox\"\n class=\"tw-m-0 lg:tw-hidden\"\n :checked=\"isSomePageChecked && !!totalCount\"\n :indeterminate=\"isSomePageChecked && !isAllPageChecked\"\n :label=\"!totalSelectedCount ? selectAllText : ''\"\n @update:checked=\"onSelectPage\"\n />\n <div\n v-if=\"!!totalSelectedCount && !hideBulkActionOptions\"\n class=\"tw-flex tw-flex-1 tw-items-center tw-justify-between\"\n >\n <div v-if=\"!hideNumberOfTotalSelected\" class=\"tw-text-xs\">\n {{ numberOfTotalSelectedText }}\n </div>\n <div :class=\"{ 'tw-ml-3': !hideNumberOfTotalSelected }\">\n <ll-button v-if=\"showSelectAll\" inline @click=\"selectAll\">{{ selectAllCountText }}</ll-button>\n <ll-button v-else inline @click=\"clearSelected\">\n {{ clearSelectedText }}\n </ll-button>\n </div>\n </div>\n <div v-else-if=\"hideBulkActionOptions && !!totalSelectedCount\" class=\"tw-ml-1.5 lg:tw-hidden\">\n <h4>{{ numItemsSelectedText }}</h4>\n </div>\n </div>\n <div v-if=\"!!totalSelectedCount && !hideBulkActionOptions\" :class=\"$style.actions\">\n <slot name=\"bulk-actions-content\"></slot>\n </div>\n </div>\n</template>\n\n<style module>\n .select-bar {\n @media screen('lg') {\n border-bottom: 1px solid var(--color-ice-200);\n justify-content: center;\n vertical-align: middle;\n }\n }\n\n .checkbox {\n flex: 0 0 auto;\n }\n\n .actions > * {\n margin-top: theme('spacing.6');\n width: 100%;\n\n @media screen('lg') {\n margin-left: theme('spacing.3');\n margin-top: 0;\n width: auto;\n }\n }\n</style>\n","<script>\n import EmptyState from '../../EmptyState/EmptyState.vue';\n import Loading from '../../Loading/Loading.vue';\n\n export default {\n name: 'loading-manager',\n\n components: {\n EmptyState,\n Loading,\n },\n\n props: {\n emptyStateText: {\n type: String,\n default: '',\n },\n\n loading: Boolean,\n\n results: {\n type: Array,\n default: () => [],\n },\n },\n };\n</script>\n\n<template>\n <Loading v-if=\"loading\" class=\"ll-bg-white\" />\n <transition-group v-else-if=\"results.length\" name=\"slide-y\" tag=\"ul\">\n <slot></slot>\n </transition-group>\n <EmptyState v-else class=\"ll-bg-white\" :class=\"$style['empty-state']\" :text=\"emptyStateText\" />\n</template>\n\n<style module>\n .empty-state {\n max-width: 100%;\n }\n</style>\n","<script>\n import { CSS_VARS } from '../../../constants';\n import sticky from '../../../directives/sticky/sticky';\n import { getCssVar } from '../../../utils/helpers';\n import Button from '../../Button/Button.vue';\n import Expand from '../../Expand/Expand.vue';\n import Icon from '../../Icon/Icon.vue';\n\n export default {\n name: 'list-group',\n\n components: {\n Expand,\n 'll-button': Button,\n Icon,\n },\n\n directives: {\n sticky,\n },\n\n props: {\n /**\n * Disables the gutters between adjacent ListGroup components.\n */\n disableExternalGutters: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Allows the list items to be collapsed\n */\n isCollapsible: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Allows the expanded content to be collapsed by default.\n * Note: has no effect unless the `isCollapsible` prop is `true`.\n */\n isCollapsedByDefault: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n const isExpanded = !this.isCollapsible || !this.isCollapsedByDefault;\n\n return {\n isExpanded,\n isDoneExpanding: isExpanded,\n };\n },\n\n computed: {\n headerOffset() {\n return parseFloat(getCssVar(CSS_VARS.TOP_HEADER_HEIGHT));\n },\n },\n\n methods: {\n toggleExpand() {\n if (!this.isCollapsible) {\n return;\n }\n\n this.isExpanded = !this.isExpanded;\n\n if (!this.isExpanded) {\n this.isDoneExpanding = false;\n } // else wait for Expand to emit @after-expand\n },\n\n onHeaderClick(e) {\n // toggle the ListGroup, except when clicking the actions\n if (!this.$refs.actionsContainer.contains(e.target)) {\n this.toggleExpand();\n }\n },\n },\n };\n</script>\n\n<template>\n <div\n :class=\"[\n $style['list-group'],\n {\n 'disable-external-gutters': disableExternalGutters,\n 'is-collapsed': !isExpanded,\n },\n ]\"\n >\n <header\n class=\"tw-flex tw-items-center\"\n :class=\"[$style['main-header'], { 'tw-cursor-pointer': isCollapsible }]\"\n @click=\"onHeaderClick\"\n >\n <ll-button v-if=\"isCollapsible\" :class=\"['tw-mr-1.5 tw-text-ice-900', $style['expansion-toggle-button']]\" icon>\n <Icon :class=\"[isExpanded ? 'tw-rotate-270' : 'rotate-180']\" name=\"chevron-left\" />\n </ll-button>\n\n <div class=\"tw-flex-auto\">\n <slot name=\"title\"></slot>\n </div>\n\n <div ref=\"actionsContainer\">\n <slot name=\"actions\"></slot>\n </div>\n </header>\n\n <Expand :is-expanded=\"isExpanded\" @after-expand=\"isDoneExpanding = true\">\n <div :class=\"$style['expanded-content-wrapper']\">\n <header\n v-if=\"$slots['expanded-content-list-header']\"\n v-sticky=\"isExpanded && isDoneExpanding ? headerOffset : 0\"\n :class=\"$style['expanded-content-header']\"\n >\n <div class=\"tw-ll-grid tw-flex-1\" :class=\"$style['expanded-content-header-grid']\">\n <slot name=\"expanded-content-list-header\"></slot>\n </div>\n </header>\n <div :class=\"$style['expanded-content-list-items-wrapper']\">\n <transition-group name=\"fade\" mode=\"out-in\">\n <slot name=\"expanded-content-list-items\"></slot>\n </transition-group>\n </div>\n </div>\n </Expand>\n </div>\n</template>\n\n<style module>\n .main-header {\n @apply tw-shadow;\n\n background-color: var(--color-white);\n border-radius: theme('borderRadius.DEFAULT');\n margin-bottom: theme('spacing.6');\n padding: var(--grid-gutter);\n\n @media screen('lg') {\n border-bottom: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n margin-bottom: 0;\n }\n }\n\n .expanded-content-wrapper {\n position: relative;\n width: 100%;\n }\n\n @media screen('lg') {\n .expanded-content-wrapper {\n @apply tw-shadow;\n }\n }\n\n .expanded-content-header {\n background-color: var(--color-white);\n border-bottom: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n color: var(--color-ice-900);\n display: none;\n font-weight: 500;\n padding: 0 theme('spacing.3');\n transition: padding theme('transitionDuration.150') theme('transitionTimingFunction.swing');\n z-index: 1;\n\n @media screen('lg') {\n align-items: center;\n display: flex;\n }\n\n &:global(.is-sticky) {\n @apply tw-shadow;\n\n border-radius: 0;\n z-index: calc(theme('zIndex.control') + 1);\n }\n }\n\n .expanded-content-header-grid {\n column-gap: 0;\n grid-column-gap: 0;\n\n > div {\n align-items: center;\n border-right: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n display: flex;\n font-size: theme('fontSize.xs');\n justify-content: space-between;\n padding: theme('spacing.3');\n\n &:last-of-type {\n border-right: 0;\n }\n }\n }\n\n .expansion-toggle-button:focus {\n box-shadow: none;\n }\n\n .list-group:global(.disable-external-gutters) {\n .main-header {\n @media screen('lg') {\n border-radius: 0;\n }\n }\n\n .expanded-content-list-items-wrapper > * {\n @media screen('lg') {\n border-bottom: theme('borderWidth.DEFAULT') solid var(--color-ice-200);\n border-radius: 0;\n }\n }\n\n &:last-of-type {\n &:global(.is-collapsed) .main-header,\n .expanded-content-list-items-wrapper > *:last-child {\n @media screen('lg') {\n border-bottom: none;\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n }\n }\n }\n }\n</style>\n","<script>\n import Icon from '../../Icon/Icon.vue';\n\n export default {\n name: 'list-header',\n\n components: {\n 'll-icon': Icon,\n },\n\n props: {\n /**\n * keys to be sorted for the column\n * the first key should be the default sort value\n */\n sortKeys: {\n type: Array,\n required: true,\n validator: (value) => value.length === 2,\n },\n\n listViewRef: {\n type: Object,\n default: null,\n },\n },\n\n data() {\n return {\n isAscending: null,\n };\n },\n\n computed: {\n listViewInstance() {\n return this.listViewRef || this.$parent;\n },\n /**\n * Is the column currently sorted\n */\n isSorted() {\n return this.sortKeys.includes(this.listViewInstance.sortTerm);\n },\n\n /**\n * Show the top icon if it's not sorted or if the current sortTerm matches\n */\n showCaretUp() {\n return this.isAscending === null || this.sortKeys[0] === this.listViewInstance.sortTerm;\n },\n\n /**\n * Show the bottom icon if it's not sorted or if the current sortTerm matches\n */\n showCaretDown() {\n return this.isAscending === null || this.sortKeys[1] === this.listViewInstance.sortTerm;\n },\n },\n\n watch: {\n isSorted: {\n handler(value) {\n this.isAscending = value ? true : null;\n },\n immediate: true,\n },\n },\n\n methods: {\n /**\n * Sorts the column by the sort field\n */\n sort() {\n this.listViewInstance.onSort(this.sortKeys[this.isAscending ? 1 : 0]);\n this.isAscending = !this.isAscending;\n },\n },\n };\n</script>\n\n<template>\n <div :class=\"['tw-cursor-pointer', { 'tw-bg-blue-100': isSorted }]\" @click=\"sort\">\n <slot></slot>\n <div class=\"h-4 w-3 tw-relative tw-text-ice-700\" :class=\"{ 'is-active-sort': isSorted }\">\n <ll-icon\n v-if=\"showCaretUp\"\n name=\"caret-up\"\n class=\"tw-absolute\"\n :class=\"[$style.caret, $style['caret-up']]\"\n size=\"dense\"\n />\n <ll-icon\n v-if=\"showCaretDown\"\n name=\"caret-down\"\n class=\"tw-absolute\"\n :class=\"[$style.caret, $style['caret-down']]\"\n size=\"dense\"\n />\n </div>\n </div>\n</template>\n\n<style module>\n .caret-up {\n top: -5px;\n }\n\n .caret-down {\n top: 2px;\n }\n\n :global(.is-active-sort) .caret {\n top: -2px; /* vertically center the caret icon */\n }\n</style>\n","<script>\n import cloneDeep from 'lodash-es/cloneDeep';\n import { computed } from 'vue';\n\n import useSearch from '../../composables/useSearch/useSearch';\n import { CSS_VARS, LLLV_CHANGE_TRIGGERS } from '../../constants';\n import sticky from '../../directives/sticky/sticky';\n import { t } from '../../locale';\n import { persistentStorage } from '../../storage';\n import { filterItems as _filterItems, getCssVar, sortItems as _sortItems } from '../../utils/helpers';\n import Badge from '../Badge/Badge.vue';\n import Button from '../Button/Button.vue';\n import Checkbox from '../Checkbox/Checkbox.vue';\n import Dropdown from '../Dropdown/Dropdown.vue';\n import Expand from '../Expand/Expand.vue';\n import Filters from '../Filters/Filters.vue';\n import Icon from '../Icon/Icon.vue';\n import Input from '../Input/Input.vue';\n import Paginate from '../Paginate/Paginate.vue';\n import BulkActions from './components/BulkActions.vue';\n import LoadingManager from './components/LoadingManager.vue';\n\n export { default as BulkActions } from './components/BulkActions.vue';\n export { default as ListGroup } from './components/ListGroup.vue';\n export { default as ListHeader } from './components/ListHeader.vue';\n export { default as LoadingManager } from './components/LoadingManager.vue';\n\n const DEFAULT_SEARCH_SCHEMA = {\n isSearchable: true,\n placeholder: 'Search',\n searchBy: ['name'],\n };\n\n export default {\n name: 'll-list-view',\n\n components: {\n BulkActions,\n Filters,\n Paginate,\n LoadingManager,\n Badge,\n Button,\n Icon,\n Dropdown,\n Expand,\n Checkbox,\n Input,\n },\n\n directives: {\n sticky,\n },\n\n inject: {\n trackSearch: { default: () => () => {} },\n trackFilters: { default: () => () => {} },\n trackSort: { default: () => () => {} },\n trackResults: { default: () => () => {} },\n },\n\n props: {\n /**\n * Hide the '{number} of {total} selected' text for bulk actions\n */\n hideNumberOfTotalSelected: {\n type: Boolean,\n default: false,\n },\n /**\n * Hide the Select All checkbox for bulk actions\n */\n hideSelectAll: {\n type: Boolean,\n default: false,\n },\n /**\n * Text to render in EmptyState component if there are no results\n */\n emptyStateText: {\n type: String,\n default: '',\n },\n filterSchema: {\n type: Array,\n default: () => [],\n },\n /**\n * Make search fuzzy. Only for client side search.\n */\n fuzzySearch: {\n type: Boolean,\n default: false,\n },\n hideTotal: Boolean,\n initialPage: {\n type: Number,\n default: undefined,\n },\n /**\n * Can items on the page be selected for bulk actions\n */\n isSelectable: Boolean,\n /**\n * For loading data already paginated, filtered (including search), and sorted from a backend.\n * Defining this prop will disable the built-in search, filtering, sorting and pagination.\n * You will instead need to use the available events (`@change`, and `@change:` prefixed)\n * to know when to request new pages from your backend.\n * This requires providing `totalItemCount`.\n * Use the loading prop to indicate when data is being loaded.\n */\n isServerSide: Boolean,\n /**\n * The data for each row. Used in this file as this.internalItems (a copy) to allow mutation;\n */\n items: {\n type: Array,\n default: () => [],\n },\n /**\n * Default field to track selected items by\n */\n itemTrackBy: {\n type: String,\n default: 'id',\n },\n loading: Boolean,\n // Number of items to display per page\n pageSize: {\n type: Number,\n default: 50,\n },\n searchSchema: {\n type: Object,\n default: () => ({}),\n },\n // Provide an optional custom 'Sort by' label\n sortLabel: {\n type: String,\n default: () => t('ll.listView.sortBy'),\n },\n sortOnLoad: Boolean,\n sorts: {\n type: Object,\n default: () => ({}),\n },\n /**\n * Total number of unpaginated results\n * Required when `isServerSide` is `true`\n */\n totalItemCount: {\n type: Number,\n default: undefined,\n },\n /**\n * Validation schema function that returns an object\n */\n validationSchema: {\n type: Function,\n default: () => () => undefined,\n },\n /**\n * Whether to disable the sticky filters\n * if disabled, the following will happen\n * 1. pre-selected value(s) can be added to\n * the filter component's attributes to overwrite the sticky filters\n * 2. users will not have sticky filters on the page\n */\n disablePersistency: Boolean,\n /**\n * Whether to disable the ability of saving 'show-filters'\n * in local storage\n */\n disableShowFilter: Boolean,\n /**\n * Whether to disable the stickiness of the header.\n * Default is false. When true, neither the list headers nor\n * the bulk actions (when applicable) will be sticky.\n */\n disableStickyHeader: Boolean,\n /**\n * Whether to expand the filters section by default on load.\n */\n showFiltersOnLoad: Boolean,\n\n /**\n * Do not use the LoadingManager, and instead render the default slot as passed\n */\n disableLoader: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Override the header offset used to position the sticky header\n */\n stickyHeaderOffset: {\n type: Number,\n default: null,\n },\n /**\n * Prevent bulk actions dropdown from rendering\n */\n hideBulkActionOptions: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If initial search term is provided, the list will be filtered on load.\n */\n initialSearchTerm: {\n type: String,\n default: '',\n },\n\n /**\n * Function that determines whether the item checkbox is disabled or not (default: false)\n */\n isItemDisabled: {\n type: Function,\n default: () => false,\n },\n },\n\n emits: [\n 'change',\n 'change:filter',\n 'change:page',\n 'change:search',\n 'change:sort',\n 'change:reset',\n 'filters-toggle-click',\n 'select-all',\n 'deselect-all',\n 'update-filters',\n 'updateResults',\n ],\n\n data() {\n return {\n internalItems: [],\n currentPage: this.initialPage || 1, // TODO: fetch from query params\n previousPage: null,\n sortOptionsWidth: 0,\n filters: {},\n filterText: t('ll.filter'),\n searchFor: () => {}, // initialized in the watch handler for internalItems\n searchTerm: this.initialSearchTerm,\n searchText: t('ll.search'),\n sortTerm: '',\n isLoadingSearchSchemaAction: false,\n isShowingFilters: !!(\n this.filterSchema?.length &&\n (this.showFiltersOnLoad || persistentStorage.get('show-filters'))\n ),\n isFiltering: false,\n results: [],\n selectedItems: [],\n };\n },\n\n computed: {\n /**\n * Returns true if any of its list items are truthy; otherwise returns false.\n * @returns {boolean}\n */\n isLoading() {\n return [this.loading, this.isLoadingSearchSchemaAction, this.isFiltering].some(Boolean);\n },\n\n totalCount() {\n return this.isServerSide ? this.totalItemCount : this.results.length;\n },\n\n /**\n * Helps determine if the list is filtered or not when there is an incomplete\n * result list, such as when isServerSide is true.\n */\n isFiltered() {\n return !!(this.numberOfFilters || this.searchTerm);\n },\n\n /**\n * Merges the searchSchema with the default value since all attributes are optional\n */\n internalSearchSchema() {\n return {\n ...DEFAULT_SEARCH_SCHEMA,\n searchBy: !this.searchSchema.isSearchable && DEFAULT_SEARCH_SCHEMA.searchBy,\n ...this.searchSchema,\n };\n },\n\n /**\n * Start of page\n */\n startIndex() {\n return this.pageSize * (this.currentPage - 1);\n },\n\n /**\n * End of page\n */\n endIndex() {\n return this.startIndex + this.pageSize;\n },\n\n /**\n * Slices the results set into a paginated segment.\n * @returns One page in the paginated set of results\n */\n paginated() {\n // Disables the built-in client-side pagination\n let paginated;\n\n if (this.isServerSide) {\n paginated = this.results;\n } else {\n const { endIndex, totalCount, results, startIndex } = this;\n\n paginated = results.slice(startIndex, Math.min(endIndex, totalCount));\n }\n\n this.$emit('updateResults', paginated);\n\n return paginated;\n },\n\n /**\n * Displays a visual indication for the number of results, or \"working\" if the\n * results are being determined.\n */\n total() {\n const current = this.pageSize * (this.currentPage - 1);\n const range = this.paginated.length ? `${current + 1} - ${current + this.paginated.length}` : 0;\n\n return this.isLoading\n ? t('ll.listView.calculating')\n : t('ll.listView.totalResults', { num: String(range), total: String(this.totalCount) });\n },\n\n /**\n * Determines if both #list-header and #list-items slots are used.\n * @returns {boolean}\n */\n useDefinedSlots() {\n return !!this.$slots['list-header'] && !!this.$slots['list-items'];\n },\n\n /**\n * Don't show total count if list items are selected and total is not hidden\n */\n shouldShowTotal() {\n return !this.totalSelectedCount && !this.hideTotal;\n },\n\n /**\n * Returns a list of the selected items' track by field\n */\n selectedItemIds() {\n return this.selectedItems.map((item) => item[this.itemTrackBy]);\n },\n\n /**\n * Returns a list of the paginated items' track by field\n */\n paginatedIds() {\n return this.paginated.map((item) => item[this.itemTrackBy]);\n },\n\n isAllPageChecked() {\n if (this.isServerSide) {\n return this.totalCount > 0 && this.totalCount === this.selectedItemIds.length;\n }\n\n return this.totalCount > 0 && this.paginatedIds.every((id) => this.selectedItemIds.includes(id));\n },\n\n isSomePageChecked() {\n if (this.isServerSide) {\n return this.totalCount > 0 && this.selectedItemIds.length > 0;\n }\n\n return this.totalCount > 0 && this.paginatedIds.some((id) => this.selectedItemIds.includes(id));\n },\n\n numberOfFilters() {\n return Object.keys(this.filters).reduce((acc, item) => {\n const filterBy = this.filters[item].filterBy;\n const isBoolean = typeof filterBy[0] === 'boolean';\n const isToggle = this.filters[item].filterType === 'll-checkbox';\n const isEmpty = !this.filters[item].filterType.length;\n const isInputOptionsIncomplete = this.filters[item].filterType === 'll-input-options' && filterBy[0] === '';\n\n /**\n * Don't include hidden or incomplete fields in the count:\n * - Hidden filter populated via another filter's onChange callback\n * - InputOptions with incomplete/missing values\n */\n if (isEmpty || isInputOptionsIncomplete) {\n return acc;\n }\n\n if (isBoolean || typeof filterBy[0] === 'string') {\n // Do not count toggle filters (eg. checkbox) with a `false` value\n return acc + (filterBy[0] || !isToggle ? 1 : 0);\n }\n\n return acc + (filterBy.length || 0);\n }, 0);\n },\n\n isSelectBarVisible() {\n return !!this.totalSelectedCount;\n },\n\n showPrimaryControls() {\n return this.internalSearchSchema.isSearchable || this.filterSchema.length;\n },\n\n showSecondaryControls() {\n return !!this.$slots['secondary-controls'];\n },\n\n isSortable() {\n return Object.keys(this.sorts).length > 0;\n },\n\n totalSelectedCount() {\n return this.selectedItems.length;\n },\n\n headerOffset() {\n // passing null to the v-sticky directive will prevent it from being attached to the node\n if (this.disableStickyHeader) {\n return null;\n }\n\n return this.stickyHeaderOffset ?? parseFloat(getCssVar(CSS_VARS.TOP_HEADER_HEIGHT));\n },\n },\n\n watch: {\n isShowingFilters(value) {\n if (!this.disableShowFilter) {\n persistentStorage.set('show-filters', value);\n }\n },\n\n items: {\n handler() {\n this.internalItems = cloneDeep(this.items);\n },\n immediate: true,\n deep: true,\n },\n\n internalItems: {\n handler() {\n if (this.isServerSide) {\n this.results = this.internalItems;\n\n this.trackResults({\n page: this.currentPage,\n results: this.results,\n search: this.searchTerm,\n });\n\n return;\n }\n\n const { searchFor } = useSearch({\n items: computed(() => this.internalItems),\n fieldNames: this.internalSearchSchema.searchBy.length\n ? this.internalSearchSchema.searchBy\n : [this.displayBy],\n trackBy: this.itemTrackBy,\n });\n\n this.searchFor = (searchTerm) => searchFor(searchTerm, { fuzzy: this.fuzzySearch });\n\n this.processResults();\n },\n immediate: true,\n },\n\n sortTerm() {\n if (this.isServerSide) {\n return;\n }\n\n this.processResults();\n },\n\n sorts: {\n handler(value) {\n const sortTerms = Object.keys(value);\n\n this.sortTerm = this.sortOnLoad && sortTerms.length ? sortTerms[0] : '';\n },\n immediate: true,\n },\n },\n\n created() {\n if (this.isServerSide) {\n if (this.totalItemCount === undefined) {\n throw new Error('`totalItemCount` is required when `isServerSide` is `true`.');\n }\n\n return;\n }\n\n if (this.searchSchema.action && this.internalItems.length) {\n throw new Error('You must pass either `action` or `items`, not both.');\n }\n\n if (this.searchTerm) {\n this.onSearch();\n }\n },\n\n methods: {\n /**\n * Processes the results with searchFor, filterItems, and/or sortItems.\n * Skipped when isServerSide is true because results are pre-processed.\n * @returns {Promise<void>}\n */\n async processResults() {\n if (this.searchSchema.action) {\n this.isLoadingSearchSchemaAction = true;\n let actionResponse;\n\n try {\n actionResponse = await this.searchSchema.action({ search: this.searchTerm });\n } finally {\n this.isLoadingSearchSchemaAction = false;\n }\n\n this.results = this.sortItems(this.filterItems(actionResponse?.results || []));\n } else {\n this.results = this.sortItems(this.filterItems(this.searchFor(this.searchTerm)));\n }\n\n this.trackResults({\n page: this.currentPage,\n results: this.results,\n search: this.searchTerm,\n });\n },\n\n /**\n * Filters the list of `items` based on options selected in the `filters` object\n * @param {array} items A list of items to filter.\n * @returns list of items filtered by the applied filters\n */\n filterItems(items) {\n return _filterItems(items, this.filters);\n },\n\n /**\n * Sorts a list of items based on options selected in the `sorts` object\n * @param {array} items A list of items to sort.\n * @returns list of items sorted according to the sort term.\n */\n sortItems(items) {\n return this.sortTerm ? _sortItems(items, this.sorts[this.sortTerm]) : items;\n },\n\n change({ trigger = '' } = {}) {\n const { currentPage, filters, isFiltered, pageSize, searchTerm, sortTerm } = this;\n\n const params = {\n filters,\n isFiltered,\n page: {\n number: currentPage,\n previousNumber: this.previousPage,\n size: pageSize,\n },\n search: searchTerm,\n sort: sortTerm,\n trigger,\n };\n\n this.$emit('change', params);\n },\n\n /**\n * Clear search term and reset results to their initial state\n */\n async clearSearchTerm() {\n this.searchTerm = '';\n await this.$attrs.onSearchTermClear?.();\n this.onSearch();\n },\n\n /**\n * Resets the results to their initial state on page load\n */\n reset() {\n this.$emit('change:reset');\n\n this.searchTerm = '';\n\n this.setPage({ pageNumber: 1 });\n\n if (this.isServerSide) {\n this.change({ trigger: LLLV_CHANGE_TRIGGERS.RESET });\n\n return;\n }\n\n this.processResults();\n },\n\n onSearchTermChange() {\n this.$attrs.onSearchTermChange?.(this.searchTerm);\n },\n\n /**\n * Event handler for when the user:\n * - clicks the Search button\n * - presses the enter key while focused on the search input\n * Calls a method in Filters that triggers `this.onFilter`. This is necessary\n * in order to persist the filters in local storage, which is handled internally\n * by Filters.\n */\n onSearch() {\n this.$refs.llFilters.applyFilters({ trigger: LLLV_CHANGE_TRIGGERS.SEARCH });\n },\n\n /**\n * Event handler for when the user:\n * - clicks the Apply button\n * - clicks the Search button (from `this.onSearch`)\n * - presses the enter key while focused on the search input (from `this.onSearch`)\n * @see: SELL-350\n * @param {object} [options] - optional parameters\n * @param {string} [options.trigger] - what caused the changes\n * @returns {Promise<void>}\n */\n async onFilter({ trigger = LLLV_CHANGE_TRIGGERS.APPLY } = {}) {\n this.setPage({ pageNumber: 1 });\n this.change({ trigger });\n this.trackSearch(this.searchTerm);\n this.trackFilters(this.filters);\n this.selectedItems = [];\n\n if (this.isServerSide) {\n return;\n }\n\n try {\n this.isFiltering = true;\n await this.processResults({ trigger });\n } finally {\n this.isFiltering = false;\n }\n\n this.$emit('change:search', this.searchTerm);\n this.$emit('change:filter', this.filters);\n this.$emit('update-filters', this.filters); // deprecated; replaced by change:filter\n this.clearSelected();\n },\n\n onFiltersToggleClick() {\n this.isShowingFilters = !this.isShowingFilters;\n\n this.$emit('filters-toggle-click', {\n isShowingFilters: this.isShowingFilters,\n });\n },\n\n /**\n * Extend the dropdown list so it does not shift when\n * the options drawer is open\n */\n onSortToggle() {\n // spacing added to the width of the dropdown container\n const spacing = 36;\n\n this.$nextTick(() => {\n this.sortOptionsWidth = `${this.$refs.sortOptions.clientWidth + spacing}px`;\n });\n },\n\n /**\n * Executes any side-effects when the sort `term` is changed\n * Always fires `change` automatically.\n * @param {string} term The updated sort term\n */\n onSort(term) {\n if (term === this.sortTerm) {\n return;\n }\n\n this.sortTerm = term;\n\n this.$emit('change:sort', term);\n this.trackSort(term);\n this.clearSelected();\n this.setPage({ pageNumber: 1 });\n this.change({ trigger: LLLV_CHANGE_TRIGGERS.SORT });\n },\n\n /**\n * Sets current page for the Paginator.\n * @param {Object} data\n * @param {number} data.pageNumber - the page number\n * @param {boolean} data.forceChange - flag to force the change\n */\n setPage({ pageNumber, forceChange = false } = {}) {\n this.previousPage = this.currentPage;\n\n this.currentPage = pageNumber;\n\n if (!this.isServerSide) {\n this.$emit('change:page', pageNumber);\n }\n\n if (forceChange) {\n this.change({ trigger: LLLV_CHANGE_TRIGGERS.PAGE });\n }\n },\n\n /**\n * Set the scroll position to the top of the list view.\n */\n scrollToTop() {\n this.$refs.scrollTarget && this.$refs.scrollTarget.scrollIntoView({ behavior: 'smooth', block: 'center' });\n },\n\n onPaginateSetPage(pageNumber) {\n this.setPage({ pageNumber, forceChange: true });\n this.scrollToTop();\n },\n\n /**\n * Selects or deselects all items on a page\n */\n onSelectPage(value) {\n this.$emit('select-all', value);\n\n if (value) {\n const items = Array.from(new Set([...this.selectedItems, ...this.paginated]));\n\n this.selectedItems = this.selectItems(items);\n } else {\n this.selectedItems = this.selectedItems.filter((item) => !this.paginatedIds.includes(item[this.itemTrackBy]));\n }\n },\n\n selectAll() {\n this.selectedItems = this.selectItems(this.results);\n },\n\n /**\n * Selects one item\n */\n onSelectItem({ item, value }) {\n if (this.isItemDisabled(item)) {\n return;\n }\n\n if (value) {\n this.selectedItems.push(item);\n } else {\n this.selectedItems = this.selectedItems.filter(\n (selectedItem) => selectedItem[this.itemTrackBy] !== item[this.itemTrackBy],\n );\n }\n },\n\n /**\n * Clears current selected items\n */\n clearSelected() {\n this.$emit('deselect-all');\n this.selectedItems = [];\n },\n\n selectItems(items) {\n return items.reduce((acc, item) => (this.isItemDisabled(item) ? acc : [...acc, item]), []);\n },\n },\n };\n</script>\n\n<template>\n <div>\n <div\n v-if=\"showPrimaryControls || showSecondaryControls\"\n ref=\"scrollTarget\"\n class=\"tw-mb-6\"\n :class=\"{ 'tw-ll-grid': showPrimaryControls && showSecondaryControls }\"\n >\n <div\n v-if=\"showPrimaryControls\"\n class=\"controls\"\n :class=\"[$style['legacy-box'], { 'tw-col-span-12 lg:tw-col-span-6': showSecondaryControls }]\"\n data-test=\"filters|controls\"\n >\n <div class=\"tw-ll-grid tw-grid-cols-4 md:tw-grid-cols-8 lg:tw-grid-cols-12\">\n <!-- Search -->\n <Input\n v-if=\"internalSearchSchema.isSearchable\"\n ref=\"search-input\"\n v-model=\"searchTerm\"\n class=\"tw-col-span-3 md:tw-col-span-4\"\n data-test=\"input|search-input\"\n :class=\"[$style['search-input'], { 'lg:tw-col-span-8': showSecondaryControls }]\"\n :hint-text=\"internalSearchSchema.hintText\"\n :label=\"searchText\"\n :placeholder=\"internalSearchSchema.placeholder\"\n @keyup.enter=\"!isLoading && onSearch()\"\n @change=\"onSearchTermChange\"\n >\n <template #append>\n <button\n v-if=\"searchTerm\"\n data-test=\"button|clear-search\"\n :class=\"$style['clear-button']\"\n :disabled=\"isLoading\"\n @click=\"clearSearchTerm\"\n >\n <Icon name=\"close\" />\n </button>\n <Button\n data-test=\"button|search-button\"\n :disabled=\"isLoading\"\n :class=\"$style['search-button']\"\n @click=\"onSearch\"\n >\n <Icon\n :class=\"{ 'tw-animate-spin tw-text-teal-500': isFiltering }\"\n :name=\"isFiltering ? 'working' : 'search'\"\n />\n </Button>\n </template>\n </Input>\n\n <!-- Filter Toggle -->\n <div\n v-if=\"filterSchema.length\"\n class=\"tw-col-span-1 tw-flex tw-items-end\"\n :class=\"[\n $style['filter-toggle-btn'],\n { [$style['filter-toggle-btn-with-hint-text']]: !!internalSearchSchema.hintText },\n ]\"\n >\n <Badge :content=\"numberOfFilters\">\n <Button\n secondary\n class=\"tw-relative tw-w-full tw-min-w-auto\"\n color=\"blue\"\n data-test=\"button|toggle-filters\"\n :disabled=\"isFiltering\"\n @click=\"onFiltersToggleClick\"\n >\n <Icon\n v-if=\"isFiltering\"\n name=\"working\"\n :class=\"[\n { 'tw-animate-spin': isFiltering },\n isShowingFilters ? 'tw-text-teal-500' : 'tw-text-ice-700',\n ]\"\n />\n <Icon v-else name=\"filter-line\" />\n {{ filterText }}\n </Button>\n </Badge>\n </div>\n\n <!-- Actions -->\n <div class=\"button-grid tw-col-span-1 tw-items-end tw-justify-end lg:tw-col-span-3\">\n <slot name=\"actions\"> </slot>\n </div>\n </div>\n\n <!-- Filters -->\n <Expand data-test=\"filters|content\" :class=\"$style['filters-expand']\" :is-expanded=\"isShowingFilters\">\n <div class=\"tw-relative tw-pt-12\" :class=\"$style['filters-wrapper']\">\n <Filters\n ref=\"llFilters\"\n :class=\"{ [$style['filters-half-width']]: showPrimaryControls && showSecondaryControls }\"\n :disable-apply=\"isLoading\"\n :disable-clear=\"isLoading || !numberOfFilters\"\n :disable-persistency=\"disablePersistency\"\n :schema=\"filterSchema\"\n :validation-schema=\"validationSchema\"\n @change=\"filters = $event\"\n @reset=\"reset\"\n @submit=\"onFilter\"\n />\n </div>\n </Expand>\n </div>\n\n <div\n v-if=\"showSecondaryControls\"\n class=\"secondary-controls\"\n :class=\"[$style['legacy-box'], { 'tw-col-span-12 tw-mt-0 lg:tw-col-span-6': showPrimaryControls }]\"\n >\n <slot name=\"secondary-controls\"></slot>\n </div>\n </div>\n\n <!-- @slot Renders custom content in the space below the filters and above the list -->\n <slot name=\"eyebrow\"></slot>\n\n <div\n v-if=\"shouldShowTotal || Object.keys(sorts).length\"\n class=\"tw-mb-1.5\"\n :class=\"shouldShowTotal ? $style['total-sort'] : 'tw-text-right'\"\n >\n <div v-if=\"shouldShowTotal\" class=\"tw-text-xs\">{{ total }}</div>\n\n <!-- Sort -->\n <Dropdown\n v-if=\"Object.keys(sorts).length\"\n :class=\"$style.dropdown\"\n :label=\"`${sortLabel} ${sortTerm}`\"\n @toggle.once=\"onSortToggle\"\n >\n <ul ref=\"sortOptions\" class=\"dropdown__list\" :style=\"{ minWidth: sortOptionsWidth }\">\n <li\n v-for=\"(sortOption, index) in Object.keys(sorts)\"\n :key=\"index\"\n :class=\"{ 'tw-bg-blue-100 tw-text-ice-700': sortOption === sortTerm }\"\n class=\"dropdown__item tw-rounded\"\n >\n <Button inline class=\"tw-items-center\" :class=\"$style['sort-option']\" @click=\"onSort(sortOption)\">\n {{ sortOption }}\n <Icon v-if=\"sortOption === sortTerm\" name=\"check\" class=\"tw-ml-auto tw-text-blue-500\" />\n </Button>\n </li>\n </ul>\n </Dropdown>\n </div>\n\n <!-- Defined Slots -->\n <div v-if=\"useDefinedSlots\" :class=\"$style['list-items']\">\n <header\n v-sticky=\"headerOffset\"\n data-test=\"header|defined-slot\"\n :class=\"[\n $style.header,\n {\n 'tw-m-0': !isSelectable,\n },\n ]\"\n class=\"tw-rounded\"\n >\n <div :class=\"$style['header-grid-container']\" class=\"tw-border-b tw-border-ice-200 tw-px-3\">\n <Checkbox\n v-if=\"isSelectable\"\n class=\"tw-ml-3\"\n :checked=\"isSomePageChecked\"\n :class=\"$style['select-all']\"\n :indeterminate=\"isSomePageChecked && !isAllPageChecked\"\n @update:checked=\"onSelectPage\"\n />\n <div class=\"tw-ll-grid tw-flex-1\" :class=\"$style['header-grid']\">\n <slot name=\"list-header\"> </slot>\n </div>\n </div>\n\n <!-- Select Bar -->\n <BulkActions\n v-if=\"isSelectable\"\n v-bind=\"{\n allowSelectAll: !hideSelectAll && !isServerSide,\n isAllPageChecked,\n isSomePageChecked,\n totalCount,\n totalSelectedCount,\n hideBulkActionOptions,\n hideNumberOfTotalSelected,\n }\"\n :class=\"!isSelectBarVisible && 'lg:tw-hidden'\"\n @change:clear-selected=\"clearSelected\"\n @change:select-current=\"onSelectPage\"\n @change:select-all=\"selectAll\"\n >\n <template #bulk-actions-content>\n <slot name=\"bulk-actions\" :selected-items=\"selectedItems\"> </slot>\n </template>\n </BulkActions>\n </header>\n\n <component\n :is=\"disableLoader ? 'div' : 'LoadingManager'\"\n :empty-state-text=\"emptyStateText\"\n :loading=\"isLoading\"\n :results=\"paginated\"\n >\n <slot\n name=\"list-items\"\n :clear-all=\"clearSelected\"\n :display-items=\"results\"\n :is-filtered=\"isFiltered\"\n :is-item-disabled=\"isItemDisabled\"\n :results=\"paginated\"\n :on-select=\"onSelectItem\"\n :selected-items=\"selectedItems\"\n ></slot>\n </component>\n </div>\n\n <!-- Default Slot -->\n <slot\n :current-page=\"currentPage\"\n :display-items=\"results\"\n :filters=\"filters\"\n :is-filtered=\"isFiltered\"\n :is-item-disabled=\"isItemDisabled\"\n :results=\"paginated\"\n :search-term=\"searchTerm\"\n :total=\"totalCount\"\n ></slot>\n\n <!-- Pagination -->\n <Paginate\n v-if=\"totalCount > pageSize\"\n :current-page=\"currentPage\"\n :list-length=\"totalCount\"\n :page-size=\"pageSize\"\n @set-page=\"onPaginateSetPage\"\n />\n </div>\n</template>\n\n<style module>\n .list-items {\n background-color: var(--color-ice-200);\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n min-width: 100%;\n position: relative;\n }\n\n @media screen('lg') {\n .list-items {\n @apply tw-shadow;\n }\n }\n\n /* the .legacy-box styles are copied from .box in _box.scss */\n .legacy-box {\n @apply tw-shadow;\n\n background: var(--color-white);\n border-radius: theme('borderRadius.DEFAULT');\n padding: theme('spacing.6') var(--grid-gutter);\n }\n\n .header {\n background-color: var(--color-white);\n color: var(--color-ice-900);\n font-weight: 500;\n margin-bottom: theme('spacing.3');\n overflow: hidden;\n z-index: 1;\n\n &:global(.is-sticky) {\n @apply tw-shadow;\n\n border-radius: 0;\n overflow: visible;\n z-index: calc(theme('zIndex.control') + 1);\n\n &::before,\n &::after {\n background-color: var(--color-white);\n content: '';\n height: 100%;\n overflow-x: hidden;\n position: absolute;\n right: 100%;\n top: 0;\n width: theme('spacing.3');\n\n @media screen('lg') {\n content: none;\n }\n }\n\n &::after {\n left: 100%;\n right: auto;\n }\n }\n\n :global(.input--checkbox) {\n label {\n min-height: theme('spacing.6');\n }\n }\n\n @media screen('lg') {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n margin-bottom: 0;\n }\n }\n\n .header-grid-container {\n display: none;\n transition: padding theme('transitionDuration.150') theme('transitionTimingFunction.swing');\n\n @media screen('lg') {\n align-items: center;\n display: flex;\n }\n }\n\n .header-grid {\n column-gap: 0 !important;\n grid-column-gap: 0 !important;\n\n > div {\n align-items: center;\n border-right: 1px solid var(--color-ice-200);\n display: flex;\n font-size: theme('fontSize.xs');\n justify-content: space-between;\n padding: theme('spacing.3');\n\n &:first-of-type {\n margin-left: calc(-1 * theme('spacing.3'));\n padding-left: theme('spacing.6');\n }\n\n &:last-of-type {\n border-right: 0;\n margin-right: calc(-1 * theme('spacing.3'));\n }\n }\n }\n\n .search-input {\n :global(input) {\n /* to prevent search text from overlapping the \"Clear\" button */\n padding-right: calc(theme('height.input') * 2) !important;\n }\n\n :global(.stash-input-append) {\n display: flex;\n justify-content: flex-end;\n width: 72px; /* double the the default width of 36px */\n\n .clear-button {\n color: var(--color-ice-700);\n height: 36px;\n margin: 0;\n min-width: 36px;\n padding: 0;\n width: 36px;\n\n &:disabled {\n color: var(--color-ice-500);\n cursor: default;\n }\n }\n\n .search-button {\n border-bottom-left-radius: 0;\n border-color: var(--color-blue-500);\n border-left: none;\n border-top-left-radius: 0;\n min-width: 36px;\n padding: 0 theme('spacing[1.5]');\n width: 36px;\n\n &:disabled {\n border-color: var(--color-ice-500);\n }\n }\n }\n }\n\n @media screen('md') {\n .total-sort {\n align-items: baseline;\n display: flex;\n justify-content: space-between;\n }\n }\n\n .filter-toggle-btn {\n min-width: fit-content !important; /* ensure this overrides the grid min-width applied */\n }\n\n .filter-toggle-btn-with-hint-text {\n /* search hint text has 16px of height and has 4px of margin top. Adding here directly to compensate that */\n margin-bottom: 20px;\n }\n\n @keyframes separator {\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n }\n\n .filters-expand:global(.stash-expand--expanded) {\n .filters-wrapper::before {\n animation: separator theme('transitionDuration.300') theme('transitionTimingFunction.ease-in-out') 0.5s 1 forwards;\n background: var(--color-ice-200);\n content: '';\n height: theme('borderWidth.DEFAULT');\n left: calc(var(--grid-gutter) * -1);\n opacity: 0;\n position: absolute;\n right: calc(var(--grid-gutter) * -1);\n top: theme('spacing.6');\n }\n }\n\n .filters-half-width {\n @media screen('lg') {\n :global(.field-wrapper) {\n grid-column: span 6 / span 6; /* col-span-6 */\n }\n }\n }\n\n .dropdown :global(.tw-text-blue-500) {\n font-size: theme('fontSize.xs');\n }\n\n .sort-option {\n height: theme('spacing.9');\n }\n\n .select-all {\n width: theme('spacing.6');\n }\n</style>\n"],"names":["_sfc_main","Button","Checkbox","t","value","_createElementBlock","_ctx","$props","_createElementVNode","_createVNode","_component_ll_checkbox","_normalizeClass","$options","_openBlock","_hoisted_1","_hoisted_2","_toDisplayString","_createBlock","_component_ll_button","_hoisted_3","_renderSlot","EmptyState","Loading","_component_Loading","_TransitionGroup","_component_EmptyState","Expand","Icon","sticky","isExpanded","getCssVar","CSS_VARS","$data","args","_component_Icon","_component_Expand","_component_ll_icon","DEFAULT_SEARCH_SCHEMA","BulkActions","Filters","Paginate","LoadingManager","Badge","Dropdown","Input","_a","persistentStorage","paginated","endIndex","totalCount","results","startIndex","current","range","item","id","acc","filterBy","isBoolean","isToggle","isEmpty","isInputOptionsIncomplete","cloneDeep","searchFor","useSearch","computed","searchTerm","sortTerms","actionResponse","items","_filterItems","_sortItems","trigger","currentPage","filters","isFiltered","pageSize","sortTerm","params","_b","LLLV_CHANGE_TRIGGERS","term","pageNumber","forceChange","selectedItem","_component_Input","$event","_cache","_withKeys","_component_Button","_component_Badge","_createTextVNode","_component_Filters","_hoisted_4","_component_Dropdown","_Fragment","_renderList","sortOption","index","_component_Checkbox","_component_BulkActions","_mergeProps","_resolveDynamicComponent","_component_Paginate"],"mappings":"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"}
package/dist/Table.js CHANGED
@@ -1,18 +1,20 @@
1
- import { defineComponent as T, inject as y, computed as a, provide as B, openBlock as w, createElementBlock as C, normalizeClass as b, unref as n, normalizeStyle as L, createElementVNode as m, renderSlot as u, createBlock as H, withCtx as i, createVNode as l } from "vue";
1
+ import { defineComponent as B, inject as w, computed as a, provide as C, openBlock as n, createElementBlock as L, normalizeClass as b, unref as m, normalizeStyle as H, createElementVNode as u, renderSlot as p, createBlock as v, withCtx as r, createVNode as i } from "vue";
2
2
  import "lodash-es/cloneDeep";
3
- import { M as v } from "./Module.keys-2cc7d830.js";
3
+ import { M as g } from "./Module.keys-2cc7d830.js";
4
4
  import "lodash-es/uniqueId";
5
5
  import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
6
6
  import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
7
- import { D as g } from "./DataView.vue_used_vue_type_style_index_0_lang.module-d878ca9a.js";
7
+ import { D as h } from "./DataView.vue_used_vue_type_style_index_0_lang.module-d878ca9a.js";
8
8
  import N from "./EmptyState.js";
9
9
  import D from "./Loading.js";
10
- import h from "./TableCell.js";
11
- import E from "./TableRow.js";
10
+ import E from "./TableCell.js";
11
+ import k from "./TableRow.js";
12
12
  import { T as I } from "./Table.keys-cf93df19.js";
13
13
  import { S as V } from "./misc-76697f61.js";
14
14
  import "./locale.js";
15
15
  import "lodash-es/get";
16
+ import "./Illustration.vue_vue_type_script_setup_true_lang-664fa82f.js";
17
+ import "./index-79ce320f.js";
16
18
  import "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
17
19
  import "./_plugin-vue_export-helper-dad06003.js";
18
20
  import "./Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js";
@@ -23,10 +25,9 @@ import "./Checkbox.js";
23
25
  import "./ChevronToggle.vue_vue_type_script_setup_true_lang-1591294c.js";
24
26
  import "./Button.js";
25
27
  import "./Icon.js";
26
- import "./index-79ce320f.js";
27
28
  import "./Expand.vue_vue_type_script_setup_true_lang-1751f4a6.js";
28
29
  var A = /* @__PURE__ */ ((e) => (e.Scroll = "scroll", e.Stack = "stack", e))(A || {}), O = /* @__PURE__ */ ((e) => (e.None = "none", e.Rounded = "rounded", e.RoundedBottom = "rounded-bottom", e))(O || {});
29
- const J = { class: "tw-relative tw-min-w-full tw-max-w-initial tw-border-separate" }, ut = /* @__PURE__ */ T({
30
+ const J = { class: "tw-relative tw-min-w-full tw-max-w-initial tw-border-separate" }, pt = /* @__PURE__ */ B({
30
31
  __name: "Table",
31
32
  props: {
32
33
  density: { default: void 0 },
@@ -43,75 +44,75 @@ const J = { class: "tw-relative tw-min-w-full tw-max-w-initial tw-border-separat
43
44
  },
44
45
  setup(e) {
45
46
  const t = e, {
46
- density: k,
47
- variant: p,
48
- isLoading: x,
49
- isEmpty: S
50
- } = y(g.key, g.defaults), { variant: s } = y(v.key, v.defaults), c = a(() => (s == null ? void 0 : s.value) === "table" || p.value === "table" ? "rounded-bottom" : t.radius), r = a(() => t.stickyHeader ? "scroll" : t.layout), f = a(() => {
47
+ density: x,
48
+ variant: c,
49
+ isLoading: S,
50
+ isEmpty: _
51
+ } = w(h.key, h.defaults), { variant: s } = w(g.key, g.defaults), f = a(() => (s == null ? void 0 : s.value) === "table" || c.value === "table" ? "rounded-bottom" : t.radius), l = a(() => t.stickyHeader ? "scroll" : t.layout), y = a(() => {
51
52
  var o, d;
52
53
  return !!((o = t.stickyHeader) != null && o.maxHeight && // table can't scroll without a max height; sticky headers only needed for a scrollable table
53
54
  ((d = t.stickyHeader) == null ? void 0 : d.listLength) > 3);
54
- }), _ = a(() => {
55
+ }), T = a(() => {
55
56
  var o;
56
57
  return {
57
- maxHeight: f.value ? (o = t.stickyHeader) == null ? void 0 : o.maxHeight : ""
58
+ maxHeight: y.value ? (o = t.stickyHeader) == null ? void 0 : o.maxHeight : ""
58
59
  };
59
60
  });
60
- return B(I.key, {
61
- density: a(() => t.density || k.value || V.Comfortable),
61
+ return C(I.key, {
62
+ density: a(() => t.density || x.value || V.Comfortable),
62
63
  hasCustomExpandToggle: a(() => t.hasCustomExpandToggle),
63
64
  hasActions: a(() => t.hasActions),
64
65
  isExpandable: a(() => t.isExpandable),
65
66
  isSelectable: a(() => t.isSelectable && !t.isLoading && !t.isEmpty),
66
- layout: r
67
- }), (o, d) => (w(), C("div", {
67
+ layout: l
68
+ }), (o, d) => (n(), L("div", {
68
69
  class: b(["stash-table tw-relative", [
69
- { "tw-rounded": c.value === "rounded" },
70
- { "tw-rounded-b": c.value === "rounded-bottom" },
71
- { "tw-border-t tw-border-ice-200": n(p) === "table" },
72
- { "tw-overflow-auto tw-shadow": r.value === "scroll" },
73
- { "tw-overflow-visble lg:tw-overflow-auto lg:tw-shadow": r.value === "stack" },
74
- { "tw-min-h-[300px]": f.value && !t.isLoading }
70
+ { "tw-rounded": f.value === "rounded" },
71
+ { "tw-rounded-b": f.value === "rounded-bottom" },
72
+ { "tw-border-t tw-border-ice-200": m(c) === "table" },
73
+ { "tw-overflow-auto tw-shadow": l.value === "scroll" },
74
+ { "tw-overflow-visble lg:tw-overflow-auto lg:tw-shadow": l.value === "stack" },
75
+ { "tw-min-h-[300px]": y.value && !t.isLoading }
75
76
  // prevent the table from collapsing on small screen heights when the max-height is dynamic
76
77
  ]]),
77
78
  "data-test": "stash-table",
78
- style: L(_.value)
79
+ style: H(T.value)
79
80
  }, [
80
- m("table", J, [
81
- m("thead", {
81
+ u("table", J, [
82
+ u("thead", {
82
83
  class: b(["tw-border-b tw-border-ice-200", {
83
- "tw-hidden lg:tw-table-header-group": r.value === "stack"
84
+ "tw-hidden lg:tw-table-header-group": l.value === "stack"
84
85
  }])
85
86
  }, [
86
- u(o.$slots, "head")
87
+ p(o.$slots, "head")
87
88
  ], 2),
88
- m("tbody", null, [
89
- t.isLoading || n(x) ? (w(), H(E, { key: 0 }, {
90
- default: i(() => [
91
- l(h, { colspan: "100%" }, {
92
- default: i(() => [
93
- l(D)
89
+ u("tbody", null, [
90
+ t.isLoading || m(S) ? (n(), v(k, { key: 0 }, {
91
+ default: r(() => [
92
+ i(E, { colspan: "100%" }, {
93
+ default: r(() => [
94
+ i(D)
94
95
  ]),
95
96
  _: 1
96
97
  })
97
98
  ]),
98
99
  _: 1
99
- })) : t.isEmpty || n(S) ? u(o.$slots, "empty", { key: 1 }, () => [
100
- l(E, null, {
101
- default: i(() => [
102
- l(h, { colspan: "100%" }, {
103
- default: i(() => [
104
- l(N, {
100
+ })) : t.isEmpty || m(_) ? (n(), v(k, { key: 1 }, {
101
+ default: r(() => [
102
+ i(E, { colspan: "100%" }, {
103
+ default: r(() => [
104
+ p(o.$slots, "empty", {}, () => [
105
+ i(N, {
105
106
  class: "tw-w-full tw-bg-white",
106
107
  text: t.emptyStateText
107
108
  }, null, 8, ["text"])
108
- ]),
109
- _: 1
110
- })
111
- ]),
112
- _: 1
113
- })
114
- ]) : u(o.$slots, "body", { key: 2 })
109
+ ])
110
+ ]),
111
+ _: 3
112
+ })
113
+ ]),
114
+ _: 3
115
+ })) : p(o.$slots, "body", { key: 2 })
115
116
  ])
116
117
  ])
117
118
  ], 6));
@@ -121,6 +122,6 @@ export {
121
122
  A as Layout,
122
123
  I as TABLE_INJECTION,
123
124
  O as TableRadius,
124
- ut as default
125
+ pt as default
125
126
  };
126
127
  //# sourceMappingURL=Table.js.map
package/dist/Table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sources":["../src/components/Table/Table.types.ts","../src/components/Table/Table.vue"],"sourcesContent":["import { ComputedRef } from 'vue';\n\nimport { SpacingDensities } from '../../../types/misc';\n\nexport enum Layout {\n Scroll = 'scroll',\n Stack = 'stack',\n}\n\nexport type Layouts = `${Layout}`;\n\nexport enum TableRadius {\n None = 'none',\n Rounded = 'rounded',\n RoundedBottom = 'rounded-bottom',\n}\n\nexport type TableRadiuses = `${TableRadius}`;\n\n/**\n * Properties and utilities provided to children of a Table instance\n */\nexport interface TableInjection {\n /**\n * Controls the Table's padding; the default value is \"comfortable\". On small screens, the density will always be \"compact\".\n */\n density: ComputedRef<SpacingDensities>;\n\n /**\n * Styles the last column for \"row actions\"\n */\n hasActions: ComputedRef<boolean>;\n\n /**\n * If true, hides the default expansion toggle column\n */\n hasCustomExpandToggle: ComputedRef<boolean>;\n\n /**\n * Adds a toggle column for row expansion. This is primarily needed for ensuring the corresponding empty TableHeaderRow is included.\n */\n isExpandable: ComputedRef<boolean>;\n\n /**\n * Adds a checkbox column for selecting rows; intended for use with the `useSelection` composable.\n */\n isSelectable: ComputedRef<boolean>;\n\n /**\n * Sets the table layout; the default value is \"scroll\".\n */\n layout: ComputedRef<Layouts>;\n}\n","<script lang=\"ts\">\n import { SpacingDensities, SpacingDensity } from '../../../types/misc';\n import { MODULE_INJECTION } from '../Module/Module.keys';\n import { Layouts, TableRadiuses } from './Table.types';\n\n export * from './Table.keys';\n export * from './Table.types';\n\n export interface TableProps {\n /**\n * Controls the Table's padding; the default value is \"comfortable\". On small screens, \"compact\" density is applied regardless of this prop's value.\n */\n density?: SpacingDensities;\n\n /**\n * Sets the text for the empty state; the default value is \"No Results\".\n */\n emptyStateText?: string;\n\n /**\n * Styles the last column for \"row actions\"\n */\n hasActions?: boolean;\n\n /**\n * If true, hides the default expansion toggle column\n */\n hasCustomExpandToggle?: boolean;\n\n /**\n * Shows the empty state\n */\n isEmpty?: boolean;\n\n /**\n * Shows the loading state\n */\n isLoading?: boolean;\n\n /**\n * Adds a toggle column for row expansion. This is primarily needed for ensuring the corresponding empty TableHeaderRow is included.\n */\n isExpandable?: boolean;\n\n /**\n * Adds a checkbox column for selecting rows; intended for use with the `useSelection` composable.\n */\n isSelectable?: boolean;\n\n /**\n * Sets the table layout; the default value is \"scroll\".\n */\n layout?: Layouts;\n\n /**\n * Controls the corners of the table with the \"border-radius\" CSS property. The default value is \"rounded\".\n */\n radius?: TableRadiuses;\n\n /**\n * Allows the table head to be sticky when scrolling inside the table body\n */\n stickyHeader?: {\n listLength: number;\n maxHeight: string;\n };\n }\n</script>\n\n<script setup lang=\"ts\">\n import { computed, inject, provide } from 'vue';\n\n import { DATA_VIEW_INJECTION } from '../DataView/DataView.vue';\n import EmptyState from '../EmptyState/EmptyState.vue';\n import Loading from '../Loading/Loading.vue';\n import TableCell from '../TableCell/TableCell.vue';\n import TableRow from '../TableRow/TableRow.vue';\n import { TABLE_INJECTION } from './Table.keys';\n\n const props = withDefaults(defineProps<TableProps>(), {\n density: undefined,\n emptyStateText: '',\n hasActions: false,\n hasCustomExpandToggle: false,\n isEmpty: false,\n isLoading: false,\n isExpandable: false,\n isSelectable: false,\n layout: 'scroll',\n radius: 'rounded',\n stickyHeader: undefined,\n });\n\n const {\n density: dataViewDensity,\n variant: dataViewVariant,\n isLoading: isDataViewLoading,\n isEmpty: isDataViewEmpty,\n } = inject(DATA_VIEW_INJECTION.key, DATA_VIEW_INJECTION.defaults);\n\n const { variant: moduleVariant } = inject(MODULE_INJECTION.key, MODULE_INJECTION.defaults);\n\n const computedRadius = computed<TableRadiuses>(() => {\n // Will work for tables when rendered inside of a Module with OR without a DataView.\n if (moduleVariant?.value === 'table') {\n return 'rounded-bottom';\n }\n\n if (dataViewVariant.value === 'table') {\n return 'rounded-bottom';\n }\n\n return props.radius;\n });\n\n const computedLayout = computed<Layouts>(() => {\n if (props.stickyHeader) {\n return 'scroll';\n }\n\n return props.layout;\n });\n\n const isStickyHeaderEnabled = computed<boolean>(() => {\n return !!(\n (\n props.stickyHeader?.maxHeight && // table can't scroll without a max height; sticky headers only needed for a scrollable table\n props.stickyHeader?.listLength > 3\n ) // scrollable table and sticky headers not needed when list is small\n );\n });\n\n const rootStyle = computed(() => ({\n maxHeight: isStickyHeaderEnabled.value ? props.stickyHeader?.maxHeight : '',\n }));\n\n provide(TABLE_INJECTION.key, {\n density: computed(() => props.density || dataViewDensity.value || SpacingDensity.Comfortable),\n hasCustomExpandToggle: computed(() => props.hasCustomExpandToggle),\n hasActions: computed(() => props.hasActions),\n isExpandable: computed(() => props.isExpandable),\n isSelectable: computed(() => props.isSelectable && !props.isLoading && !props.isEmpty),\n layout: computedLayout,\n });\n</script>\n\n<template>\n <div\n class=\"stash-table tw-relative\"\n :class=\"[\n { 'tw-rounded': computedRadius === 'rounded' },\n { 'tw-rounded-b': computedRadius === 'rounded-bottom' },\n { 'tw-border-t tw-border-ice-200': dataViewVariant === 'table' },\n { 'tw-overflow-auto tw-shadow': computedLayout === 'scroll' },\n { 'tw-overflow-visble lg:tw-overflow-auto lg:tw-shadow': computedLayout === 'stack' },\n { 'tw-min-h-[300px]': isStickyHeaderEnabled && !props.isLoading }, // prevent the table from collapsing on small screen heights when the max-height is dynamic\n ]\"\n data-test=\"stash-table\"\n :style=\"rootStyle\"\n >\n <table class=\"tw-relative tw-min-w-full tw-max-w-initial tw-border-separate\">\n <thead\n class=\"tw-border-b tw-border-ice-200\"\n :class=\"{\n 'tw-hidden lg:tw-table-header-group': computedLayout === 'stack',\n }\"\n >\n <!-- @slot head -->\n <slot name=\"head\"> </slot>\n </thead>\n <tbody>\n <TableRow v-if=\"props.isLoading || isDataViewLoading\">\n <TableCell colspan=\"100%\">\n <Loading />\n </TableCell>\n </TableRow>\n <!-- @slot empty -->\n <slot v-else-if=\"props.isEmpty || isDataViewEmpty\" name=\"empty\">\n <TableRow>\n <TableCell colspan=\"100%\">\n <EmptyState class=\"tw-w-full tw-bg-white\" :text=\"props.emptyStateText\" />\n </TableCell>\n </TableRow>\n </slot>\n <!-- @slot body -->\n <slot v-else name=\"body\"></slot>\n </tbody>\n </table>\n </div>\n</template>\n"],"names":["Layout","TableRadius","dataViewDensity","dataViewVariant","isDataViewLoading","isDataViewEmpty","inject","DATA_VIEW_INJECTION","moduleVariant","MODULE_INJECTION","computedRadius","computed","props","computedLayout","isStickyHeaderEnabled","_a","_b","rootStyle","provide","TABLE_INJECTION","SpacingDensity"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIY,IAAAA,sBAAAA,OACVA,EAAA,SAAS,UACTA,EAAA,QAAQ,SAFEA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAA,OAAO,QACPA,EAAA,UAAU,WACVA,EAAA,gBAAgB,kBAHNA,IAAAA,KAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;iBCkFJ;AAAA,MACJ,SAASC;AAAA,MACT,SAASC;AAAA,MACT,WAAWC;AAAA,MACX,SAASC;AAAA,IACP,IAAAC,EAAOC,EAAoB,KAAKA,EAAoB,QAAQ,GAE1D,EAAE,SAASC,MAAkBF,EAAOG,EAAiB,KAAKA,EAAiB,QAAQ,GAEnFC,IAAiBC,EAAwB,OAEzCH,KAAA,gBAAAA,EAAe,WAAU,WAIzBL,EAAgB,UAAU,UACrB,mBAGFS,EAAM,MACd,GAEKC,IAAiBF,EAAkB,MACnCC,EAAM,eACD,WAGFA,EAAM,MACd,GAEKE,IAAwBH,EAAkB,MAAM;;AAC7C,aAAA,CAAC,GAEJI,IAAAH,EAAM,iBAAN,QAAAG,EAAoB;AAAA,QACpBC,IAAAJ,EAAM,iBAAN,gBAAAI,EAAoB,cAAa;AAAA,IAAA,CAGtC,GAEKC,IAAYN,EAAS,MAAO;;AAAA;AAAA,QAChC,WAAWG,EAAsB,SAAQC,IAAAH,EAAM,iBAAN,gBAAAG,EAAoB,YAAY;AAAA,MACzE;AAAA,KAAA;AAEF,WAAAG,EAAQC,EAAgB,KAAK;AAAA,MAC3B,SAASR,EAAS,MAAMC,EAAM,WAAWV,EAAgB,SAASkB,EAAe,WAAW;AAAA,MAC5F,uBAAuBT,EAAS,MAAMC,EAAM,qBAAqB;AAAA,MACjE,YAAYD,EAAS,MAAMC,EAAM,UAAU;AAAA,MAC3C,cAAcD,EAAS,MAAMC,EAAM,YAAY;AAAA,MAC/C,cAAcD,EAAS,MAAMC,EAAM,gBAAgB,CAACA,EAAM,aAAa,CAACA,EAAM,OAAO;AAAA,MACrF,QAAQC;AAAA,IAAA,CACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Table.js","sources":["../src/components/Table/Table.types.ts","../src/components/Table/Table.vue"],"sourcesContent":["import { ComputedRef } from 'vue';\n\nimport { SpacingDensities } from '../../../types/misc';\n\nexport enum Layout {\n Scroll = 'scroll',\n Stack = 'stack',\n}\n\nexport type Layouts = `${Layout}`;\n\nexport enum TableRadius {\n None = 'none',\n Rounded = 'rounded',\n RoundedBottom = 'rounded-bottom',\n}\n\nexport type TableRadiuses = `${TableRadius}`;\n\n/**\n * Properties and utilities provided to children of a Table instance\n */\nexport interface TableInjection {\n /**\n * Controls the Table's padding; the default value is \"comfortable\". On small screens, the density will always be \"compact\".\n */\n density: ComputedRef<SpacingDensities>;\n\n /**\n * Styles the last column for \"row actions\"\n */\n hasActions: ComputedRef<boolean>;\n\n /**\n * If true, hides the default expansion toggle column\n */\n hasCustomExpandToggle: ComputedRef<boolean>;\n\n /**\n * Adds a toggle column for row expansion. This is primarily needed for ensuring the corresponding empty TableHeaderRow is included.\n */\n isExpandable: ComputedRef<boolean>;\n\n /**\n * Adds a checkbox column for selecting rows; intended for use with the `useSelection` composable.\n */\n isSelectable: ComputedRef<boolean>;\n\n /**\n * Sets the table layout; the default value is \"scroll\".\n */\n layout: ComputedRef<Layouts>;\n}\n","<script lang=\"ts\">\n import { SpacingDensities, SpacingDensity } from '../../../types/misc';\n import { MODULE_INJECTION } from '../Module/Module.keys';\n import { Layouts, TableRadiuses } from './Table.types';\n\n export * from './Table.keys';\n export * from './Table.types';\n\n export interface TableProps {\n /**\n * Controls the Table's padding; the default value is \"comfortable\". On small screens, \"compact\" density is applied regardless of this prop's value.\n */\n density?: SpacingDensities;\n\n /**\n * Sets the text for the empty state; the default value is \"No Results\".\n */\n emptyStateText?: string;\n\n /**\n * Styles the last column for \"row actions\"\n */\n hasActions?: boolean;\n\n /**\n * If true, hides the default expansion toggle column\n */\n hasCustomExpandToggle?: boolean;\n\n /**\n * Shows the empty state\n */\n isEmpty?: boolean;\n\n /**\n * Shows the loading state\n */\n isLoading?: boolean;\n\n /**\n * Adds a toggle column for row expansion. This is primarily needed for ensuring the corresponding empty TableHeaderRow is included.\n */\n isExpandable?: boolean;\n\n /**\n * Adds a checkbox column for selecting rows; intended for use with the `useSelection` composable.\n */\n isSelectable?: boolean;\n\n /**\n * Sets the table layout; the default value is \"scroll\".\n */\n layout?: Layouts;\n\n /**\n * Controls the corners of the table with the \"border-radius\" CSS property. The default value is \"rounded\".\n */\n radius?: TableRadiuses;\n\n /**\n * Allows the table head to be sticky when scrolling inside the table body\n */\n stickyHeader?: {\n listLength: number;\n maxHeight: string;\n };\n }\n</script>\n\n<script setup lang=\"ts\">\n import { computed, inject, provide } from 'vue';\n\n import { DATA_VIEW_INJECTION } from '../DataView/DataView.vue';\n import EmptyState from '../EmptyState/EmptyState.vue';\n import Loading from '../Loading/Loading.vue';\n import TableCell from '../TableCell/TableCell.vue';\n import TableRow from '../TableRow/TableRow.vue';\n import { TABLE_INJECTION } from './Table.keys';\n\n const props = withDefaults(defineProps<TableProps>(), {\n density: undefined,\n emptyStateText: '',\n hasActions: false,\n hasCustomExpandToggle: false,\n isEmpty: false,\n isLoading: false,\n isExpandable: false,\n isSelectable: false,\n layout: 'scroll',\n radius: 'rounded',\n stickyHeader: undefined,\n });\n\n const {\n density: dataViewDensity,\n variant: dataViewVariant,\n isLoading: isDataViewLoading,\n isEmpty: isDataViewEmpty,\n } = inject(DATA_VIEW_INJECTION.key, DATA_VIEW_INJECTION.defaults);\n\n const { variant: moduleVariant } = inject(MODULE_INJECTION.key, MODULE_INJECTION.defaults);\n\n const computedRadius = computed<TableRadiuses>(() => {\n // Will work for tables when rendered inside of a Module with OR without a DataView.\n if (moduleVariant?.value === 'table') {\n return 'rounded-bottom';\n }\n\n if (dataViewVariant.value === 'table') {\n return 'rounded-bottom';\n }\n\n return props.radius;\n });\n\n const computedLayout = computed<Layouts>(() => {\n if (props.stickyHeader) {\n return 'scroll';\n }\n\n return props.layout;\n });\n\n const isStickyHeaderEnabled = computed<boolean>(() => {\n return !!(\n (\n props.stickyHeader?.maxHeight && // table can't scroll without a max height; sticky headers only needed for a scrollable table\n props.stickyHeader?.listLength > 3\n ) // scrollable table and sticky headers not needed when list is small\n );\n });\n\n const rootStyle = computed(() => ({\n maxHeight: isStickyHeaderEnabled.value ? props.stickyHeader?.maxHeight : '',\n }));\n\n provide(TABLE_INJECTION.key, {\n density: computed(() => props.density || dataViewDensity.value || SpacingDensity.Comfortable),\n hasCustomExpandToggle: computed(() => props.hasCustomExpandToggle),\n hasActions: computed(() => props.hasActions),\n isExpandable: computed(() => props.isExpandable),\n isSelectable: computed(() => props.isSelectable && !props.isLoading && !props.isEmpty),\n layout: computedLayout,\n });\n</script>\n\n<template>\n <div\n class=\"stash-table tw-relative\"\n :class=\"[\n { 'tw-rounded': computedRadius === 'rounded' },\n { 'tw-rounded-b': computedRadius === 'rounded-bottom' },\n { 'tw-border-t tw-border-ice-200': dataViewVariant === 'table' },\n { 'tw-overflow-auto tw-shadow': computedLayout === 'scroll' },\n { 'tw-overflow-visble lg:tw-overflow-auto lg:tw-shadow': computedLayout === 'stack' },\n { 'tw-min-h-[300px]': isStickyHeaderEnabled && !props.isLoading }, // prevent the table from collapsing on small screen heights when the max-height is dynamic\n ]\"\n data-test=\"stash-table\"\n :style=\"rootStyle\"\n >\n <table class=\"tw-relative tw-min-w-full tw-max-w-initial tw-border-separate\">\n <thead\n class=\"tw-border-b tw-border-ice-200\"\n :class=\"{\n 'tw-hidden lg:tw-table-header-group': computedLayout === 'stack',\n }\"\n >\n <!-- @slot head -->\n <slot name=\"head\"> </slot>\n </thead>\n <tbody>\n <TableRow v-if=\"props.isLoading || isDataViewLoading\">\n <TableCell colspan=\"100%\">\n <Loading />\n </TableCell>\n </TableRow>\n <!-- @slot empty -->\n <template v-else-if=\"props.isEmpty || isDataViewEmpty\">\n <TableRow>\n <TableCell colspan=\"100%\">\n <slot name=\"empty\">\n <EmptyState class=\"tw-w-full tw-bg-white\" :text=\"props.emptyStateText\" />\n </slot>\n </TableCell>\n </TableRow>\n </template>\n <!-- @slot body -->\n <slot v-else name=\"body\"></slot>\n </tbody>\n </table>\n </div>\n</template>\n"],"names":["Layout","TableRadius","dataViewDensity","dataViewVariant","isDataViewLoading","isDataViewEmpty","inject","DATA_VIEW_INJECTION","moduleVariant","MODULE_INJECTION","computedRadius","computed","props","computedLayout","isStickyHeaderEnabled","_a","_b","rootStyle","provide","TABLE_INJECTION","SpacingDensity"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIY,IAAAA,sBAAAA,OACVA,EAAA,SAAS,UACTA,EAAA,QAAQ,SAFEA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAA,OAAO,QACPA,EAAA,UAAU,WACVA,EAAA,gBAAgB,kBAHNA,IAAAA,KAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;iBCkFJ;AAAA,MACJ,SAASC;AAAA,MACT,SAASC;AAAA,MACT,WAAWC;AAAA,MACX,SAASC;AAAA,IACP,IAAAC,EAAOC,EAAoB,KAAKA,EAAoB,QAAQ,GAE1D,EAAE,SAASC,MAAkBF,EAAOG,EAAiB,KAAKA,EAAiB,QAAQ,GAEnFC,IAAiBC,EAAwB,OAEzCH,KAAA,gBAAAA,EAAe,WAAU,WAIzBL,EAAgB,UAAU,UACrB,mBAGFS,EAAM,MACd,GAEKC,IAAiBF,EAAkB,MACnCC,EAAM,eACD,WAGFA,EAAM,MACd,GAEKE,IAAwBH,EAAkB,MAAM;;AAC7C,aAAA,CAAC,GAEJI,IAAAH,EAAM,iBAAN,QAAAG,EAAoB;AAAA,QACpBC,IAAAJ,EAAM,iBAAN,gBAAAI,EAAoB,cAAa;AAAA,IAAA,CAGtC,GAEKC,IAAYN,EAAS,MAAO;;AAAA;AAAA,QAChC,WAAWG,EAAsB,SAAQC,IAAAH,EAAM,iBAAN,gBAAAG,EAAoB,YAAY;AAAA,MACzE;AAAA,KAAA;AAEF,WAAAG,EAAQC,EAAgB,KAAK;AAAA,MAC3B,SAASR,EAAS,MAAMC,EAAM,WAAWV,EAAgB,SAASkB,EAAe,WAAW;AAAA,MAC5F,uBAAuBT,EAAS,MAAMC,EAAM,qBAAqB;AAAA,MACjE,YAAYD,EAAS,MAAMC,EAAM,UAAU;AAAA,MAC3C,cAAcD,EAAS,MAAMC,EAAM,YAAY;AAAA,MAC/C,cAAcD,EAAS,MAAMC,EAAM,gBAAgB,CAACA,EAAM,aAAa,CAACA,EAAM,OAAO;AAAA,MACrF,QAAQC;AAAA,IAAA,CACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/TableCell.js CHANGED
@@ -5,6 +5,7 @@ import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
5
5
  import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
6
6
  import "./DataView.vue_used_vue_type_style_index_0_lang.module-d878ca9a.js";
7
7
  import "lodash-es/get";
8
+ import "./Illustration.vue_vue_type_script_setup_true_lang-664fa82f.js";
8
9
  import "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
9
10
  import "./Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js";
10
11
  import { T as y, s as C } from "./Table.keys-cf93df19.js";
@@ -12,6 +13,7 @@ import "@leaflink/snitch";
12
13
  import "./Checkbox.vue_used_vue_type_style_index_0_lang.module-fa8d9c06.js";
13
14
  import "./Button.vue_used_vue_type_style_index_0_lang.module-63d31dc0.js";
14
15
  import { _ as h } from "./_plugin-vue_export-helper-dad06003.js";
16
+ import "./index-79ce320f.js";
15
17
  const T = {
16
18
  key: 0,
17
19
  class: "tw-text-xs tw-font-medium tw-text-ice-900 lg:tw-hidden"
@@ -49,8 +51,8 @@ const T = {
49
51
  }
50
52
  }), x = {
51
53
  $style: C
52
- }, L = /* @__PURE__ */ h(k, [["__cssModules", x]]);
54
+ }, V = /* @__PURE__ */ h(k, [["__cssModules", x]]);
53
55
  export {
54
- L as default
56
+ V as default
55
57
  };
56
58
  //# sourceMappingURL=TableCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableCell.js","sources":["../src/components/TableCell/TableCell.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { inject, useCssModule } from 'vue';\n\n import { TABLE_INJECTION } from '../Table/Table.vue';\n\n export interface TableCellProps {\n /**\n * If true, displays the cell as a control (vs data) cell without a background color on mobile when Table is in the stacked layout\n */\n isControl?: boolean;\n /**\n * If true, displays the header inside the cell on mobile and tablet screens when Table is in the stacked layout\n */\n mobileHeader?: string;\n }\n\n const props = withDefaults(defineProps<TableCellProps>(), {\n isControl: false,\n mobileHeader: '',\n });\n const classes = useCssModule();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n if (!tableInjection) {\n throw new Error('TableCell must be used within a Table component');\n }\n\n const { density, hasActions, layout } = tableInjection;\n</script>\n\n<template>\n <td\n class=\"stash-table-cell\"\n data-test=\"stash-table-cell\"\n :class=\"[\n classes.root,\n classes[`layout--${layout}`],\n {\n [classes['root--density-compact']]: density === 'compact',\n [classes['root--density-comfortable']]: density === 'comfortable',\n [classes['has-actions']]: hasActions,\n 'tw-p-3': layout === 'scroll',\n 'tw-p-1.5': layout === 'stack',\n 'lg:tw-p-3': density === 'compact',\n 'lg:tw-px-3 lg:tw-py-6': density === 'comfortable',\n [classes['is-control']]: props.isControl,\n },\n ]\"\n >\n <div v-if=\"props.mobileHeader && layout === 'stack'\" class=\"tw-text-xs tw-font-medium tw-text-ice-900 lg:tw-hidden\">\n {{ props.mobileHeader }}\n </div>\n <!-- @slot default -->\n <slot></slot>\n </td>\n</template>\n\n<style module>\n .root {\n border: 0;\n }\n\n .layout--scroll {\n background-color: var(--color-white);\n border: none;\n border-bottom: 1px solid var(--color-ice-200);\n }\n\n .layout--scroll.has-actions:last-of-type {\n text-align: center;\n }\n\n .layout--stack {\n background-color: var(--color-ice-100);\n border-radius: theme('borderRadius.DEFAULT');\n }\n\n .layout--stack.has-actions:last-of-type {\n background-color: transparent;\n position: absolute;\n right: 0;\n top: 0;\n }\n\n .layout--stack.is-control {\n background-color: transparent;\n }\n\n /* On large screens, layout--stack should match layout--scroll */\n @media screen('lg') {\n .layout--stack {\n background-color: var(--color-white);\n border-bottom: 1px solid var(--color-ice-200);\n border-radius: initial;\n }\n\n .layout--stack.has-actions:last-of-type {\n background-color: var(--color-white);\n position: initial;\n right: initial;\n text-align: center;\n top: initial;\n }\n\n .layout--stack.is-control {\n background-color: var(--color-white);\n }\n\n .root--density-comfortable:last-of-type:not(.has-actions) {\n padding-right: 24px;\n }\n\n .root--density-comfortable:first-of-type:not(:global(.stash-table-header-row__selection-cell), :global(.stash-table-row__selection-cell), :global(.stash-table-row__toggle-expansion-cell)) {\n padding-left: 24px;\n }\n }\n</style>\n"],"names":["classes","useCssModule","tableInjection","inject","TABLE_INJECTION","density","hasActions","layout"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;iBAoBQA,IAAUC,KAEVC,IAAiBC,EAAOC,EAAgB,GAAG;AACjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,iDAAiD;AAGnE,UAAM,EAAE,SAAAG,GAAS,YAAAC,GAAY,QAAAC,EAAA,IAAWL;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TableCell.js","sources":["../src/components/TableCell/TableCell.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { inject, useCssModule } from 'vue';\n\n import { TABLE_INJECTION } from '../Table/Table.vue';\n\n export interface TableCellProps {\n /**\n * If true, displays the cell as a control (vs data) cell without a background color on mobile when Table is in the stacked layout\n */\n isControl?: boolean;\n /**\n * If true, displays the header inside the cell on mobile and tablet screens when Table is in the stacked layout\n */\n mobileHeader?: string;\n }\n\n const props = withDefaults(defineProps<TableCellProps>(), {\n isControl: false,\n mobileHeader: '',\n });\n const classes = useCssModule();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n if (!tableInjection) {\n throw new Error('TableCell must be used within a Table component');\n }\n\n const { density, hasActions, layout } = tableInjection;\n</script>\n\n<template>\n <td\n class=\"stash-table-cell\"\n data-test=\"stash-table-cell\"\n :class=\"[\n classes.root,\n classes[`layout--${layout}`],\n {\n [classes['root--density-compact']]: density === 'compact',\n [classes['root--density-comfortable']]: density === 'comfortable',\n [classes['has-actions']]: hasActions,\n 'tw-p-3': layout === 'scroll',\n 'tw-p-1.5': layout === 'stack',\n 'lg:tw-p-3': density === 'compact',\n 'lg:tw-px-3 lg:tw-py-6': density === 'comfortable',\n [classes['is-control']]: props.isControl,\n },\n ]\"\n >\n <div v-if=\"props.mobileHeader && layout === 'stack'\" class=\"tw-text-xs tw-font-medium tw-text-ice-900 lg:tw-hidden\">\n {{ props.mobileHeader }}\n </div>\n <!-- @slot default -->\n <slot></slot>\n </td>\n</template>\n\n<style module>\n .root {\n border: 0;\n }\n\n .layout--scroll {\n background-color: var(--color-white);\n border: none;\n border-bottom: 1px solid var(--color-ice-200);\n }\n\n .layout--scroll.has-actions:last-of-type {\n text-align: center;\n }\n\n .layout--stack {\n background-color: var(--color-ice-100);\n border-radius: theme('borderRadius.DEFAULT');\n }\n\n .layout--stack.has-actions:last-of-type {\n background-color: transparent;\n position: absolute;\n right: 0;\n top: 0;\n }\n\n .layout--stack.is-control {\n background-color: transparent;\n }\n\n /* On large screens, layout--stack should match layout--scroll */\n @media screen('lg') {\n .layout--stack {\n background-color: var(--color-white);\n border-bottom: 1px solid var(--color-ice-200);\n border-radius: initial;\n }\n\n .layout--stack.has-actions:last-of-type {\n background-color: var(--color-white);\n position: initial;\n right: initial;\n text-align: center;\n top: initial;\n }\n\n .layout--stack.is-control {\n background-color: var(--color-white);\n }\n\n .root--density-comfortable:last-of-type:not(.has-actions) {\n padding-right: 24px;\n }\n\n .root--density-comfortable:first-of-type:not(:global(.stash-table-header-row__selection-cell), :global(.stash-table-row__selection-cell), :global(.stash-table-row__toggle-expansion-cell)) {\n padding-left: 24px;\n }\n }\n</style>\n"],"names":["classes","useCssModule","tableInjection","inject","TABLE_INJECTION","density","hasActions","layout"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBQA,IAAUC,KAEVC,IAAiBC,EAAOC,EAAgB,GAAG;AACjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,iDAAiD;AAGnE,UAAM,EAAE,SAAAG,GAAS,YAAAC,GAAY,QAAAC,EAAA,IAAWL;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -4,6 +4,7 @@ import f from "./Icon.js";
4
4
  import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
5
5
  import { D as b } from "./DataView.vue_used_vue_type_style_index_0_lang.module-d878ca9a.js";
6
6
  import "lodash-es/get";
7
+ import "./Illustration.vue_vue_type_script_setup_true_lang-664fa82f.js";
7
8
  import "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
8
9
  import "./Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js";
9
10
  import { T as N } from "./Table.keys-cf93df19.js";
@@ -81,8 +82,8 @@ const A = {
81
82
  "root--density-comfortable": "_root--density-comfortable_rrm9i_31"
82
83
  }, M = {
83
84
  $style: H
84
- }, Y = /* @__PURE__ */ S(B, [["__cssModules", M]]);
85
+ }, Z = /* @__PURE__ */ S(B, [["__cssModules", M]]);
85
86
  export {
86
- Y as default
87
+ Z as default
87
88
  };
88
89
  //# sourceMappingURL=TableHeaderCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeaderCell.js","sources":["../src/components/TableHeaderCell/TableHeaderCell.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { computed, inject, useCssModule } from 'vue';\n\n import { DATA_VIEW_INJECTION, SortValueDeserialized } from '../DataView/DataView.vue';\n import Icon from '../Icon/Icon.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n\n export interface TableHeaderCellProps {\n /**\n * A unique value correlated to the data in this header's column (without a leading hyphen/dash).\n * For example: `'product_name'` (with no leading dash/hyphen).\n */\n sortId?: SortValueDeserialized['id'];\n }\n\n const props = withDefaults(defineProps<TableHeaderCellProps>(), {\n sortId: '',\n });\n const classes = useCssModule();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n if (!tableInjection) {\n throw new Error('TableHeaderCell must be used within a Table component');\n }\n\n const { density, hasActions } = tableInjection;\n\n // #region sorting\n const { currentSortId, currentSortOrder, updateCurrentSort } = inject(\n DATA_VIEW_INJECTION.key,\n DATA_VIEW_INJECTION.defaults,\n );\n const isSortable = computed(() => !!props.sortId);\n const isActiveSort = computed(() => currentSortId.value === props.sortId);\n\n function onRootClick() {\n if (isSortable.value && typeof updateCurrentSort === 'function') {\n updateCurrentSort(props.sortId, { shouldEmit: true });\n }\n }\n // #endregion sorting\n</script>\n\n<template>\n <th\n class=\"\n stash-table-header-cell\n tw-border-b tw-border-r tw-border-ice-200 tw-p-3 tw-text-xs tw-font-medium tw-text-ice-900\n \"\n :class=\"[\n classes.root,\n {\n 'tw-bg-white': !isActiveSort,\n 'stash-table-header-cell--sorted tw-bg-blue-100': isActiveSort,\n [classes['root--density-compact']]: density === 'compact',\n [classes['root--density-comfortable']]: density === 'comfortable',\n [classes['has-actions']]: hasActions,\n 'tw-cursor-pointer': isSortable,\n },\n ]\"\n data-test=\"stash-table-header-cell\"\n @click=\"onRootClick\"\n >\n <div class=\"tw-flex tw-justify-between\" :class=\"classes['content-wrapper']\">\n <!-- @slot default -->\n <slot></slot>\n <div v-if=\"isSortable\" class=\"tw-relative tw-h-4 tw-w-3\">\n <Icon\n v-if=\"!isActiveSort || currentSortOrder === 'asc'\"\n class=\"tw-absolute tw-text-ice-700\"\n :class=\"[classes.caret, classes['caret-up']]\"\n data-test=\"icon|caret-up\"\n name=\"caret-up\"\n size=\"dense\"\n />\n <Icon\n v-if=\"!isActiveSort || currentSortOrder === 'desc'\"\n class=\"tw-absolute tw-text-ice-700\"\n :class=\"[classes.caret, classes['caret-down']]\"\n data-test=\"icon|caret-down\"\n name=\"caret-down\"\n size=\"dense\"\n />\n </div>\n </div>\n </th>\n</template>\n\n<style module>\n .root {\n border-left: none;\n border-top: none;\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .root:last-of-type {\n border-right: 0;\n }\n\n .has-actions:last-of-type .content-wrapper {\n justify-content: flex-end !important;\n }\n\n .caret-up {\n top: -5px;\n }\n\n .caret-down {\n top: 2px;\n }\n\n :global(.stash-table-header-cell--sorted) .caret {\n top: -2px; /* vertically center the caret icon */\n }\n\n @media screen('lg') {\n .root--density-comfortable:last-of-type {\n padding-right: 24px;\n }\n\n .root--density-comfortable:first-of-type:not(:global(.stash-table-header-row__selection-cell), :global(.stash-table-row__selection-cell)) {\n padding-left: 24px;\n }\n }\n</style>\n"],"names":["classes","useCssModule","tableInjection","inject","TABLE_INJECTION","density","hasActions","currentSortId","currentSortOrder","updateCurrentSort","DATA_VIEW_INJECTION","isSortable","computed","props","isActiveSort","onRootClick"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;iBAkBQA,IAAUC,KAEVC,IAAiBC,EAAOC,EAAgB,GAAG;AACjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,uDAAuD;AAGnE,UAAA,EAAE,SAAAG,GAAS,YAAAC,EAAe,IAAAJ,GAG1B,EAAE,eAAAK,GAAe,kBAAAC,GAAkB,mBAAAC,EAAsB,IAAAN;AAAA,MAC7DO,EAAoB;AAAA,MACpBA,EAAoB;AAAA,IAAA,GAEhBC,IAAaC,EAAS,MAAM,CAAC,CAACC,EAAM,MAAM,GAC1CC,IAAeF,EAAS,MAAML,EAAc,UAAUM,EAAM,MAAM;AAExE,aAASE,IAAc;AACrB,MAAIJ,EAAW,SAAS,OAAOF,KAAsB,cACnDA,EAAkBI,EAAM,QAAQ,EAAE,YAAY,GAAM,CAAA;AAAA,IAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TableHeaderCell.js","sources":["../src/components/TableHeaderCell/TableHeaderCell.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import { computed, inject, useCssModule } from 'vue';\n\n import { DATA_VIEW_INJECTION, SortValueDeserialized } from '../DataView/DataView.vue';\n import Icon from '../Icon/Icon.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n\n export interface TableHeaderCellProps {\n /**\n * A unique value correlated to the data in this header's column (without a leading hyphen/dash).\n * For example: `'product_name'` (with no leading dash/hyphen).\n */\n sortId?: SortValueDeserialized['id'];\n }\n\n const props = withDefaults(defineProps<TableHeaderCellProps>(), {\n sortId: '',\n });\n const classes = useCssModule();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n if (!tableInjection) {\n throw new Error('TableHeaderCell must be used within a Table component');\n }\n\n const { density, hasActions } = tableInjection;\n\n // #region sorting\n const { currentSortId, currentSortOrder, updateCurrentSort } = inject(\n DATA_VIEW_INJECTION.key,\n DATA_VIEW_INJECTION.defaults,\n );\n const isSortable = computed(() => !!props.sortId);\n const isActiveSort = computed(() => currentSortId.value === props.sortId);\n\n function onRootClick() {\n if (isSortable.value && typeof updateCurrentSort === 'function') {\n updateCurrentSort(props.sortId, { shouldEmit: true });\n }\n }\n // #endregion sorting\n</script>\n\n<template>\n <th\n class=\"\n stash-table-header-cell\n tw-border-b tw-border-r tw-border-ice-200 tw-p-3 tw-text-xs tw-font-medium tw-text-ice-900\n \"\n :class=\"[\n classes.root,\n {\n 'tw-bg-white': !isActiveSort,\n 'stash-table-header-cell--sorted tw-bg-blue-100': isActiveSort,\n [classes['root--density-compact']]: density === 'compact',\n [classes['root--density-comfortable']]: density === 'comfortable',\n [classes['has-actions']]: hasActions,\n 'tw-cursor-pointer': isSortable,\n },\n ]\"\n data-test=\"stash-table-header-cell\"\n @click=\"onRootClick\"\n >\n <div class=\"tw-flex tw-justify-between\" :class=\"classes['content-wrapper']\">\n <!-- @slot default -->\n <slot></slot>\n <div v-if=\"isSortable\" class=\"tw-relative tw-h-4 tw-w-3\">\n <Icon\n v-if=\"!isActiveSort || currentSortOrder === 'asc'\"\n class=\"tw-absolute tw-text-ice-700\"\n :class=\"[classes.caret, classes['caret-up']]\"\n data-test=\"icon|caret-up\"\n name=\"caret-up\"\n size=\"dense\"\n />\n <Icon\n v-if=\"!isActiveSort || currentSortOrder === 'desc'\"\n class=\"tw-absolute tw-text-ice-700\"\n :class=\"[classes.caret, classes['caret-down']]\"\n data-test=\"icon|caret-down\"\n name=\"caret-down\"\n size=\"dense\"\n />\n </div>\n </div>\n </th>\n</template>\n\n<style module>\n .root {\n border-left: none;\n border-top: none;\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n .root:last-of-type {\n border-right: 0;\n }\n\n .has-actions:last-of-type .content-wrapper {\n justify-content: flex-end !important;\n }\n\n .caret-up {\n top: -5px;\n }\n\n .caret-down {\n top: 2px;\n }\n\n :global(.stash-table-header-cell--sorted) .caret {\n top: -2px; /* vertically center the caret icon */\n }\n\n @media screen('lg') {\n .root--density-comfortable:last-of-type {\n padding-right: 24px;\n }\n\n .root--density-comfortable:first-of-type:not(:global(.stash-table-header-row__selection-cell), :global(.stash-table-row__selection-cell)) {\n padding-left: 24px;\n }\n }\n</style>\n"],"names":["classes","useCssModule","tableInjection","inject","TABLE_INJECTION","density","hasActions","currentSortId","currentSortOrder","updateCurrentSort","DATA_VIEW_INJECTION","isSortable","computed","props","isActiveSort","onRootClick"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBQA,IAAUC,KAEVC,IAAiBC,EAAOC,EAAgB,GAAG;AACjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,uDAAuD;AAGnE,UAAA,EAAE,SAAAG,GAAS,YAAAC,EAAe,IAAAJ,GAG1B,EAAE,eAAAK,GAAe,kBAAAC,GAAkB,mBAAAC,EAAsB,IAAAN;AAAA,MAC7DO,EAAoB;AAAA,MACpBA,EAAoB;AAAA,IAAA,GAEhBC,IAAaC,EAAS,MAAM,CAAC,CAACC,EAAM,MAAM,GAC1CC,IAAeF,EAAS,MAAML,EAAc,UAAUM,EAAM,MAAM;AAExE,aAASE,IAAc;AACrB,MAAIJ,EAAW,SAAS,OAAOF,KAAsB,cACnDA,EAAkBI,EAAM,QAAQ,EAAE,YAAY,GAAM,CAAA;AAAA,IAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,6 +6,7 @@ import "lodash-es/uniqueId";
6
6
  import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
7
7
  import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
8
8
  import "./DataView.vue_used_vue_type_style_index_0_lang.module-d878ca9a.js";
9
+ import "./Illustration.vue_vue_type_script_setup_true_lang-664fa82f.js";
9
10
  import "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
10
11
  import "./Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js";
11
12
  import { T as R } from "./Table.keys-cf93df19.js";
@@ -15,8 +16,8 @@ import { _ as S } from "./_plugin-vue_export-helper-dad06003.js";
15
16
  import "lodash-es/get";
16
17
  import "@leaflink/snitch";
17
18
  import "./Checkbox.vue_used_vue_type_style_index_0_lang.module-fa8d9c06.js";
18
- import "./Icon.js";
19
19
  import "./index-79ce320f.js";
20
+ import "./Icon.js";
20
21
  const B = {
21
22
  class: "stash-table-header-row",
22
23
  "data-test": "stash-table-header-row"
@@ -27,13 +28,13 @@ const B = {
27
28
  someRowsSelected: { type: Boolean, default: !1 }
28
29
  },
29
30
  emits: ["select"],
30
- setup(d, { emit: p }) {
31
- const l = d, a = _(R.key);
31
+ setup(p, { emit: d }) {
32
+ const l = p, a = _(R.key);
32
33
  if (!a)
33
34
  throw new Error("TableHeaderRow must be used within a Table component");
34
35
  const { hasCustomExpandToggle: w, isExpandable: h, isSelectable: u } = a, c = b(0);
35
36
  function n() {
36
- p("select"), c.value++;
37
+ d("select"), c.value++;
37
38
  }
38
39
  return (e, I) => (t(), k("tr", B, [
39
40
  o(u) ? (t(), s(m, {
@@ -66,8 +67,8 @@ const B = {
66
67
  "row-control-cell": "_row-control-cell_1eq6o_8"
67
68
  }, H = {
68
69
  $style: $
69
- }, W = /* @__PURE__ */ S(E, [["__cssModules", H]]);
70
+ }, X = /* @__PURE__ */ S(E, [["__cssModules", H]]);
70
71
  export {
71
- W as default
72
+ X as default
72
73
  };
73
74
  //# sourceMappingURL=TableHeaderRow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeaderRow.js","sources":["../src/components/TableHeaderRow/TableHeaderRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { inject, ref } from 'vue';\n\n import { t } from '../../locale';\n import Checkbox from '../Checkbox/Checkbox.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n import TableHeaderCell from '../TableHeaderCell/TableHeaderCell.vue';\n\n export interface TableHeaderRowProps {\n allRowsSelected?: boolean;\n someRowsSelected?: boolean;\n }\n\n const props = withDefaults(defineProps<TableHeaderRowProps>(), {\n allRowsSelected: false,\n someRowsSelected: false,\n });\n\n const emit =\n defineEmits<{\n (e: 'select'): void;\n }>();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n\n if (!tableInjection) {\n throw new Error('TableHeaderRow must be used within a Table component');\n }\n\n const { hasCustomExpandToggle, isExpandable, isSelectable } = tableInjection;\n\n const checkboxKey = ref(0);\n\n function onSelect() {\n emit('select');\n\n /**\n * In Vue (as of this writing), if a user checks a native checkbox but the v-model is `false` and does not change from `false`, then the checkbox will display as checked even though the v-model is still `false`.\n * Forcing a re-render with a `key` change allows the checkbox to stay unchecked if its v-model is still `false` and its v-model not been changed.\n * To verify that this is necessary, test the \"select all\" checkbox in the SelectionWithSomeDisabled story in Table.story.ts with and without the `key` attribute.\n */\n checkboxKey.value++;\n }\n</script>\n\n<template>\n <tr class=\"stash-table-header-row\" data-test=\"stash-table-header-row\">\n <TableHeaderCell\n v-if=\"isSelectable\"\n class=\"stash-table-header-row__selection-cell tw-min-w-[48px]\"\n :class=\"$style['row-control-cell']\"\n >\n <Checkbox\n :key=\"checkboxKey\"\n :class=\"$style['row-selection-checkbox']\"\n :checked=\"props.allRowsSelected\"\n :indeterminate=\"props.someRowsSelected && !props.allRowsSelected\"\n :title=\"t('ll.selectAll')\"\n @update:indeterminate=\"onSelect\"\n @update:checked=\"onSelect\"\n />\n </TableHeaderCell>\n <TableHeaderCell\n v-if=\"isExpandable && !hasCustomExpandToggle\"\n :class=\"$style['row-control-cell']\"\n data-test=\"table-row-header-expansion-cell\"\n />\n <!-- @slot default -->\n <slot></slot>\n </tr>\n</template>\n\n<style module>\n .row-selection-checkbox label {\n padding: 0;\n min-height: theme('spacing.6');\n vertical-align: middle;\n }\n\n .row-control-cell {\n border-right: 0;\n }\n</style>\n"],"names":["tableInjection","inject","TABLE_INJECTION","hasCustomExpandToggle","isExpandable","isSelectable","checkboxKey","ref","onSelect","emit"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuBQA,IAAiBC,EAAOC,EAAgB,GAAG;AAEjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,sDAAsD;AAGxE,UAAM,EAAE,uBAAAG,GAAuB,cAAAC,GAAc,cAAAC,EAAA,IAAiBL,GAExDM,IAAcC,EAAI,CAAC;AAEzB,aAASC,IAAW;AAClB,MAAAC,EAAK,QAAQ,GAODH,EAAA;AAAA,IACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TableHeaderRow.js","sources":["../src/components/TableHeaderRow/TableHeaderRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { inject, ref } from 'vue';\n\n import { t } from '../../locale';\n import Checkbox from '../Checkbox/Checkbox.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n import TableHeaderCell from '../TableHeaderCell/TableHeaderCell.vue';\n\n export interface TableHeaderRowProps {\n allRowsSelected?: boolean;\n someRowsSelected?: boolean;\n }\n\n const props = withDefaults(defineProps<TableHeaderRowProps>(), {\n allRowsSelected: false,\n someRowsSelected: false,\n });\n\n const emit =\n defineEmits<{\n (e: 'select'): void;\n }>();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n\n if (!tableInjection) {\n throw new Error('TableHeaderRow must be used within a Table component');\n }\n\n const { hasCustomExpandToggle, isExpandable, isSelectable } = tableInjection;\n\n const checkboxKey = ref(0);\n\n function onSelect() {\n emit('select');\n\n /**\n * In Vue (as of this writing), if a user checks a native checkbox but the v-model is `false` and does not change from `false`, then the checkbox will display as checked even though the v-model is still `false`.\n * Forcing a re-render with a `key` change allows the checkbox to stay unchecked if its v-model is still `false` and its v-model not been changed.\n * To verify that this is necessary, test the \"select all\" checkbox in the SelectionWithSomeDisabled story in Table.story.ts with and without the `key` attribute.\n */\n checkboxKey.value++;\n }\n</script>\n\n<template>\n <tr class=\"stash-table-header-row\" data-test=\"stash-table-header-row\">\n <TableHeaderCell\n v-if=\"isSelectable\"\n class=\"stash-table-header-row__selection-cell tw-min-w-[48px]\"\n :class=\"$style['row-control-cell']\"\n >\n <Checkbox\n :key=\"checkboxKey\"\n :class=\"$style['row-selection-checkbox']\"\n :checked=\"props.allRowsSelected\"\n :indeterminate=\"props.someRowsSelected && !props.allRowsSelected\"\n :title=\"t('ll.selectAll')\"\n @update:indeterminate=\"onSelect\"\n @update:checked=\"onSelect\"\n />\n </TableHeaderCell>\n <TableHeaderCell\n v-if=\"isExpandable && !hasCustomExpandToggle\"\n :class=\"$style['row-control-cell']\"\n data-test=\"table-row-header-expansion-cell\"\n />\n <!-- @slot default -->\n <slot></slot>\n </tr>\n</template>\n\n<style module>\n .row-selection-checkbox label {\n padding: 0;\n min-height: theme('spacing.6');\n vertical-align: middle;\n }\n\n .row-control-cell {\n border-right: 0;\n }\n</style>\n"],"names":["tableInjection","inject","TABLE_INJECTION","hasCustomExpandToggle","isExpandable","isSelectable","checkboxKey","ref","onSelect","emit"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuBQA,IAAiBC,EAAOC,EAAgB,GAAG;AAEjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,sDAAsD;AAGxE,UAAM,EAAE,uBAAAG,GAAuB,cAAAC,GAAc,cAAAC,EAAA,IAAiBL,GAExDM,IAAcC,EAAI,CAAC;AAEzB,aAASC,IAAW;AAClB,MAAAC,EAAK,QAAQ,GAODH,EAAA;AAAA,IACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/TableRow.js CHANGED
@@ -8,6 +8,7 @@ import "lodash-es/cloneDeep";
8
8
  import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
9
9
  import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
10
10
  import "./DataView.vue_used_vue_type_style_index_0_lang.module-d878ca9a.js";
11
+ import "./Illustration.vue_vue_type_script_setup_true_lang-664fa82f.js";
11
12
  import "./EmptyState.vue_used_vue_type_style_index_0_lang.module-f5d89366.js";
12
13
  import "./Loading.vue_used_vue_type_style_index_0_lang.module-ef5a3bc6.js";
13
14
  import T from "./TableCell.js";
@@ -126,8 +127,8 @@ const Q = /* @__PURE__ */ A({
126
127
  }
127
128
  }), W = {
128
129
  $style: H
129
- }, Ee = /* @__PURE__ */ K(Q, [["__cssModules", W]]);
130
+ }, ve = /* @__PURE__ */ K(Q, [["__cssModules", W]]);
130
131
  export {
131
- Ee as default
132
+ ve as default
132
133
  };
133
134
  //# sourceMappingURL=TableRow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableRow.js","sources":["../src/components/TableRow/TableRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, inject, ref, useAttrs, useCssModule, useSlots, watch } from 'vue';\n\n import { t } from '../../locale';\n import Checkbox, { CheckboxProps } from '../Checkbox/Checkbox.vue';\n import ChevronToggle from '../ChevronToggle/ChevronToggle.vue';\n import Expand from '../Expand/Expand.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n import TableCell from '../TableCell/TableCell.vue';\n\n defineOptions({ inheritAttrs: false });\n\n export interface TableRowProps {\n hideExpansionDivider?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n isSelectDisabled?: boolean;\n }\n\n const props = withDefaults(defineProps<TableRowProps>(), {\n /**\n * If true, hides the divider between the parent row and expansion row\n */\n hideExpansionDivider: false,\n isExpanded: false,\n isSelected: false,\n isSelectDisabled: false,\n });\n\n const emit =\n defineEmits<{\n 'update:isSelected': [isChecked: CheckboxProps['checked']];\n 'update:isExpanded': [isExpanded: boolean];\n }>();\n\n const attrs = useAttrs();\n const classes = useCssModule();\n const slots = useSlots();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n\n if (!tableInjection) {\n throw new Error('TableRow must be used within a Table component');\n }\n\n const { hasActions, hasCustomExpandToggle, isExpandable, isSelectable, layout } = tableInjection;\n\n const isRowExpanded = ref(props.isExpanded);\n const isRowExpandable = computed(() => isExpandable && !!slots.expansion);\n\n const childCellCount = computed(() => {\n let count = slots.default?.({ toggleExpand }).length ?? 0;\n\n if (isSelectable.value) {\n count += 1;\n }\n\n if (isRowExpandable.value && !hasCustomExpandToggle.value) {\n count += 1;\n }\n\n return count;\n });\n const rowId = uniqueId('table-row-');\n\n function toggleExpand(value?: boolean) {\n if (!isRowExpandable.value) {\n throw new Error('Cannot call `toggleExpand` on a non-expandable row. Provide an `expansion` slot.');\n }\n\n const isExpanded = typeof value === 'boolean' ? value : !isRowExpanded.value;\n\n isRowExpanded.value = isExpanded;\n emit('update:isExpanded', isExpanded);\n }\n\n watch(\n () => props.isExpanded,\n () => toggleExpand(props.isExpanded),\n );\n</script>\n\n<template>\n <tr\n class=\"stash-table-row\"\n :class=\"[\n classes.root,\n classes[`layout--${layout}`],\n {\n [classes['is-expandable']]: isRowExpandable,\n [classes['is-expanded']]: isRowExpanded,\n [classes['root--hidden-divider']]: hideExpansionDivider,\n 'tw-p-gutter': layout === 'stack',\n 'tw-mb-6 tw-shadow lg:tw-mb-0 lg:tw-shadow-none': layout === 'stack' && !isRowExpandable,\n 'tw-pt-[60px]': hasActions && layout === 'stack' && !isSelectable,\n },\n ]\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <TableCell\n v-if=\"isSelectable\"\n is-control\n class=\"stash-table-row__selection-cell tw-min-w-[48px]\"\n :class=\"classes['row-control-cell']\"\n data-test=\"stash-table-row|selection-cell\"\n >\n <Checkbox\n :class=\"classes['row-selection-checkbox']\"\n :checked=\"props.isSelected\"\n :disabled=\"props.isSelectDisabled\"\n :title=\"t('ll.select.self')\"\n @update:checked=\"emit('update:isSelected', $event)\"\n />\n </TableCell>\n <TableCell\n v-if=\"isRowExpandable && !hasCustomExpandToggle\"\n class=\"stash-table-row__toggle-expansion-cell tw-px-0\"\n data-test=\"stash-table-row|custom-expansion-cell\"\n is-control\n :class=\"classes['row-control-cell']\"\n >\n <ChevronToggle\n :aria-controls=\"rowId\"\n :aria-label=\"isRowExpanded ? t('ll.table.collapseRow') : t('ll.table.expandRow')\"\n :direction=\"isRowExpanded ? 'up' : 'down'\"\n :is-expanded=\"isRowExpanded\"\n @click=\"toggleExpand\"\n />\n </TableCell>\n <!-- @slot default -->\n <slot :is-row-expanded=\"isRowExpanded\" :toggle-expand=\"toggleExpand\"></slot>\n </tr>\n <tr\n v-if=\"isRowExpandable\"\n class=\"stash-table-row stash-table-row--expandable\"\n :class=\"classes['row-expansion']\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <Expand\n is=\"td\"\n :id=\"rowId\"\n class=\"tw-border-none tw-bg-white tw-px-3 tw-py-0\"\n data-test=\"stash-table-row|expansion-cell\"\n :class=\"classes['row-expansion-content']\"\n :colspan=\"childCellCount\"\n :is-expanded=\"isRowExpanded\"\n >\n <!-- @slot expansion, for expandable content -->\n <slot name=\"expansion\"></slot>\n </Expand>\n </tr>\n</template>\n\n<style module>\n .root {\n border: 0;\n }\n\n /**\n * Only takes effect when hideExpansionDivider is true, for a softer collapse transition as the bottom border re-appears\n */\n .is-expandable > td {\n border-bottom-color: var(--color-ice-200);\n transition: border-bottom-color 0.5s;\n }\n\n .root--hidden-divider.is-expanded > td {\n transition: border-bottom-color 0s;\n /**\n * Removes the grey cell background for 'control' cells at lower breakpoints, letting the white of the tr come through.\n */\n border-bottom-color: transparent;\n }\n\n .layout--scroll {\n border-radius: 0;\n box-shadow: none !important;\n margin: 0;\n }\n\n .layout--scroll:last-of-type {\n border: 0;\n }\n\n .layout--scroll:last-of-type td {\n border-bottom: none;\n }\n\n .layout--stack {\n align-items: stretch;\n background-color: var(--color-white);\n column-gap: var(--grid-gutter);\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n position: relative;\n row-gap: var(--grid-gutter);\n }\n\n .layout--stack:not(.is-expanded) {\n border-radius: theme('borderRadius.DEFAULT');\n transition: border-radius 0.5s;\n }\n\n .layout--stack.is-expanded {\n border-top-left-radius: theme('borderRadius.DEFAULT');\n border-top-right-radius: theme('borderRadius.DEFAULT');\n }\n\n .row-selection-checkbox label {\n padding: 0;\n min-height: theme('spacing.6');\n vertical-align: middle;\n }\n\n .layout--stack .row-control-cell {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n /* On mobile, display controls on their own row, pushing other cells below */\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: 1;\n }\n\n .row-expansion-content {\n box-shadow: inset 0 -1px 0 0 var(--color-ice-200);\n }\n\n .layout--stack + .row-expansion,\n .layout--stack + .row-expansion > .row-expansion-content {\n display: block;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: 1px solid var(--color-ice-200);\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n margin-bottom: theme('spacing.6');\n }\n\n .layout--stack.root--hidden-divider + .row-expansion > .row-expansion-content {\n border-top: none;\n }\n\n /* On large screens, match the styles for layout-SCROLL */\n @media screen('lg') {\n .layout--stack {\n align-items: unset;\n background-color: unset;\n border: 0;\n border-bottom: 1px solid var(--color-ice-200);\n border-radius: 0;\n box-shadow: none;\n column-gap: unset;\n display: table-row;\n grid-template-columns: unset;\n row-gap: unset;\n }\n\n .layout--stack:last-of-type {\n border-bottom: 0;\n }\n\n .layout--stack .row-control-cell {\n display: table-cell;\n }\n\n .layout--stack + .row-expansion {\n display: table-row;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: unset;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n display: table-cell;\n margin-bottom: unset;\n }\n\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: unset;\n }\n }\n</style>\n"],"names":["attrs","useAttrs","classes","useCssModule","slots","useSlots","tableInjection","inject","TABLE_INJECTION","hasActions","hasCustomExpandToggle","isExpandable","isSelectable","layout","isRowExpanded","ref","props","isRowExpandable","computed","childCellCount","count","_a","toggleExpand","rowId","uniqueId","value","isExpanded","emit","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCQA,IAAQC,KACRC,IAAUC,KACVC,IAAQC,KAERC,IAAiBC,EAAOC,EAAgB,GAAG;AAEjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,gDAAgD;AAGlE,UAAM,EAAE,YAAAG,GAAY,uBAAAC,GAAuB,cAAAC,GAAc,cAAAC,GAAc,QAAAC,EAAW,IAAAP,GAE5EQ,IAAgBC,EAAIC,EAAM,UAAU,GACpCC,IAAkBC,EAAS,MAAMP,KAAgB,CAAC,CAACP,EAAM,SAAS,GAElEe,IAAiBD,EAAS,MAAM;;AACpC,UAAIE,MAAQC,IAAAjB,EAAM,YAAN,gBAAAiB,EAAA,KAAAjB,GAAgB,EAAE,cAAAkB,KAAgB,WAAU;AAExD,aAAIV,EAAa,UACNQ,KAAA,IAGPH,EAAgB,SAAS,CAACP,EAAsB,UACzCU,KAAA,IAGJA;AAAA,IAAA,CACR,GACKG,IAAQC,EAAS,YAAY;AAEnC,aAASF,EAAaG,GAAiB;AACjC,UAAA,CAACR,EAAgB;AACb,cAAA,IAAI,MAAM,kFAAkF;AAGpG,YAAMS,IAAa,OAAOD,KAAU,YAAYA,IAAQ,CAACX,EAAc;AAEvE,MAAAA,EAAc,QAAQY,GACtBC,EAAK,qBAAqBD,CAAU;AAAA,IACtC;AAEA,WAAAE;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,MAAMM,EAAaN,EAAM,UAAU;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"TableRow.js","sources":["../src/components/TableRow/TableRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, inject, ref, useAttrs, useCssModule, useSlots, watch } from 'vue';\n\n import { t } from '../../locale';\n import Checkbox, { CheckboxProps } from '../Checkbox/Checkbox.vue';\n import ChevronToggle from '../ChevronToggle/ChevronToggle.vue';\n import Expand from '../Expand/Expand.vue';\n import { TABLE_INJECTION } from '../Table/Table.vue';\n import TableCell from '../TableCell/TableCell.vue';\n\n defineOptions({ inheritAttrs: false });\n\n export interface TableRowProps {\n hideExpansionDivider?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n isSelectDisabled?: boolean;\n }\n\n const props = withDefaults(defineProps<TableRowProps>(), {\n /**\n * If true, hides the divider between the parent row and expansion row\n */\n hideExpansionDivider: false,\n isExpanded: false,\n isSelected: false,\n isSelectDisabled: false,\n });\n\n const emit =\n defineEmits<{\n 'update:isSelected': [isChecked: CheckboxProps['checked']];\n 'update:isExpanded': [isExpanded: boolean];\n }>();\n\n const attrs = useAttrs();\n const classes = useCssModule();\n const slots = useSlots();\n\n const tableInjection = inject(TABLE_INJECTION.key);\n\n if (!tableInjection) {\n throw new Error('TableRow must be used within a Table component');\n }\n\n const { hasActions, hasCustomExpandToggle, isExpandable, isSelectable, layout } = tableInjection;\n\n const isRowExpanded = ref(props.isExpanded);\n const isRowExpandable = computed(() => isExpandable && !!slots.expansion);\n\n const childCellCount = computed(() => {\n let count = slots.default?.({ toggleExpand }).length ?? 0;\n\n if (isSelectable.value) {\n count += 1;\n }\n\n if (isRowExpandable.value && !hasCustomExpandToggle.value) {\n count += 1;\n }\n\n return count;\n });\n const rowId = uniqueId('table-row-');\n\n function toggleExpand(value?: boolean) {\n if (!isRowExpandable.value) {\n throw new Error('Cannot call `toggleExpand` on a non-expandable row. Provide an `expansion` slot.');\n }\n\n const isExpanded = typeof value === 'boolean' ? value : !isRowExpanded.value;\n\n isRowExpanded.value = isExpanded;\n emit('update:isExpanded', isExpanded);\n }\n\n watch(\n () => props.isExpanded,\n () => toggleExpand(props.isExpanded),\n );\n</script>\n\n<template>\n <tr\n class=\"stash-table-row\"\n :class=\"[\n classes.root,\n classes[`layout--${layout}`],\n {\n [classes['is-expandable']]: isRowExpandable,\n [classes['is-expanded']]: isRowExpanded,\n [classes['root--hidden-divider']]: hideExpansionDivider,\n 'tw-p-gutter': layout === 'stack',\n 'tw-mb-6 tw-shadow lg:tw-mb-0 lg:tw-shadow-none': layout === 'stack' && !isRowExpandable,\n 'tw-pt-[60px]': hasActions && layout === 'stack' && !isSelectable,\n },\n ]\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <TableCell\n v-if=\"isSelectable\"\n is-control\n class=\"stash-table-row__selection-cell tw-min-w-[48px]\"\n :class=\"classes['row-control-cell']\"\n data-test=\"stash-table-row|selection-cell\"\n >\n <Checkbox\n :class=\"classes['row-selection-checkbox']\"\n :checked=\"props.isSelected\"\n :disabled=\"props.isSelectDisabled\"\n :title=\"t('ll.select.self')\"\n @update:checked=\"emit('update:isSelected', $event)\"\n />\n </TableCell>\n <TableCell\n v-if=\"isRowExpandable && !hasCustomExpandToggle\"\n class=\"stash-table-row__toggle-expansion-cell tw-px-0\"\n data-test=\"stash-table-row|custom-expansion-cell\"\n is-control\n :class=\"classes['row-control-cell']\"\n >\n <ChevronToggle\n :aria-controls=\"rowId\"\n :aria-label=\"isRowExpanded ? t('ll.table.collapseRow') : t('ll.table.expandRow')\"\n :direction=\"isRowExpanded ? 'up' : 'down'\"\n :is-expanded=\"isRowExpanded\"\n @click=\"toggleExpand\"\n />\n </TableCell>\n <!-- @slot default -->\n <slot :is-row-expanded=\"isRowExpanded\" :toggle-expand=\"toggleExpand\"></slot>\n </tr>\n <tr\n v-if=\"isRowExpandable\"\n class=\"stash-table-row stash-table-row--expandable\"\n :class=\"classes['row-expansion']\"\n data-test=\"stash-table-row\"\n v-bind=\"attrs\"\n >\n <Expand\n is=\"td\"\n :id=\"rowId\"\n class=\"tw-border-none tw-bg-white tw-px-3 tw-py-0\"\n data-test=\"stash-table-row|expansion-cell\"\n :class=\"classes['row-expansion-content']\"\n :colspan=\"childCellCount\"\n :is-expanded=\"isRowExpanded\"\n >\n <!-- @slot expansion, for expandable content -->\n <slot name=\"expansion\"></slot>\n </Expand>\n </tr>\n</template>\n\n<style module>\n .root {\n border: 0;\n }\n\n /**\n * Only takes effect when hideExpansionDivider is true, for a softer collapse transition as the bottom border re-appears\n */\n .is-expandable > td {\n border-bottom-color: var(--color-ice-200);\n transition: border-bottom-color 0.5s;\n }\n\n .root--hidden-divider.is-expanded > td {\n transition: border-bottom-color 0s;\n /**\n * Removes the grey cell background for 'control' cells at lower breakpoints, letting the white of the tr come through.\n */\n border-bottom-color: transparent;\n }\n\n .layout--scroll {\n border-radius: 0;\n box-shadow: none !important;\n margin: 0;\n }\n\n .layout--scroll:last-of-type {\n border: 0;\n }\n\n .layout--scroll:last-of-type td {\n border-bottom: none;\n }\n\n .layout--stack {\n align-items: stretch;\n background-color: var(--color-white);\n column-gap: var(--grid-gutter);\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n position: relative;\n row-gap: var(--grid-gutter);\n }\n\n .layout--stack:not(.is-expanded) {\n border-radius: theme('borderRadius.DEFAULT');\n transition: border-radius 0.5s;\n }\n\n .layout--stack.is-expanded {\n border-top-left-radius: theme('borderRadius.DEFAULT');\n border-top-right-radius: theme('borderRadius.DEFAULT');\n }\n\n .row-selection-checkbox label {\n padding: 0;\n min-height: theme('spacing.6');\n vertical-align: middle;\n }\n\n .layout--stack .row-control-cell {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n /* On mobile, display controls on their own row, pushing other cells below */\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: 1;\n }\n\n .row-expansion-content {\n box-shadow: inset 0 -1px 0 0 var(--color-ice-200);\n }\n\n .layout--stack + .row-expansion,\n .layout--stack + .row-expansion > .row-expansion-content {\n display: block;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: 1px solid var(--color-ice-200);\n border-bottom-left-radius: theme('borderRadius.DEFAULT');\n border-bottom-right-radius: theme('borderRadius.DEFAULT');\n margin-bottom: theme('spacing.6');\n }\n\n .layout--stack.root--hidden-divider + .row-expansion > .row-expansion-content {\n border-top: none;\n }\n\n /* On large screens, match the styles for layout-SCROLL */\n @media screen('lg') {\n .layout--stack {\n align-items: unset;\n background-color: unset;\n border: 0;\n border-bottom: 1px solid var(--color-ice-200);\n border-radius: 0;\n box-shadow: none;\n column-gap: unset;\n display: table-row;\n grid-template-columns: unset;\n row-gap: unset;\n }\n\n .layout--stack:last-of-type {\n border-bottom: 0;\n }\n\n .layout--stack .row-control-cell {\n display: table-cell;\n }\n\n .layout--stack + .row-expansion {\n display: table-row;\n }\n\n .layout--stack + .row-expansion > .row-expansion-content {\n border-top: unset;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n display: table-cell;\n margin-bottom: unset;\n }\n\n .row-control-cell + :not(.row-control-cell) {\n grid-column-start: unset;\n }\n }\n</style>\n"],"names":["attrs","useAttrs","classes","useCssModule","slots","useSlots","tableInjection","inject","TABLE_INJECTION","hasActions","hasCustomExpandToggle","isExpandable","isSelectable","layout","isRowExpanded","ref","props","isRowExpandable","computed","childCellCount","count","_a","toggleExpand","rowId","uniqueId","value","isExpanded","emit","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoCQA,IAAQC,KACRC,IAAUC,KACVC,IAAQC,KAERC,IAAiBC,EAAOC,EAAgB,GAAG;AAEjD,QAAI,CAACF;AACG,YAAA,IAAI,MAAM,gDAAgD;AAGlE,UAAM,EAAE,YAAAG,GAAY,uBAAAC,GAAuB,cAAAC,GAAc,cAAAC,GAAc,QAAAC,EAAW,IAAAP,GAE5EQ,IAAgBC,EAAIC,EAAM,UAAU,GACpCC,IAAkBC,EAAS,MAAMP,KAAgB,CAAC,CAACP,EAAM,SAAS,GAElEe,IAAiBD,EAAS,MAAM;;AACpC,UAAIE,MAAQC,IAAAjB,EAAM,YAAN,gBAAAiB,EAAA,KAAAjB,GAAgB,EAAE,cAAAkB,KAAgB,WAAU;AAExD,aAAIV,EAAa,UACNQ,KAAA,IAGPH,EAAgB,SAAS,CAACP,EAAsB,UACzCU,KAAA,IAGJA;AAAA,IAAA,CACR,GACKG,IAAQC,EAAS,YAAY;AAEnC,aAASF,EAAaG,GAAiB;AACjC,UAAA,CAACR,EAAgB;AACb,cAAA,IAAI,MAAM,kFAAkF;AAGpG,YAAMS,IAAa,OAAOD,KAAU,YAAYA,IAAQ,CAACX,EAAc;AAEvE,MAAAA,EAAc,QAAQY,GACtBC,EAAK,qBAAqBD,CAAU;AAAA,IACtC;AAEA,WAAAE;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,MAAMM,EAAaN,EAAM,UAAU;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leaflink/stash",
3
- "version": "46.3.0",
3
+ "version": "46.4.0",
4
4
  "description": "LeafLink's design system.",
5
5
  "homepage": "https://stash.leaflink.com",
6
6
  "main": "./dist/index.ts",