@ouestfrance/sipa-bms-ui 8.22.3 → 8.23.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.
Files changed (44) hide show
  1. package/dist/components/button/BmsIconButton.vue.d.ts +1 -1
  2. package/dist/components/button/BmsToggleIcon.vue.d.ts +24 -0
  3. package/dist/components/button/UiButton.vue.d.ts +1 -1
  4. package/dist/components/form/BmsInputText.vue.d.ts +1 -1
  5. package/dist/components/form/BmsSearch.vue.d.ts +3 -3
  6. package/dist/components/form/BmsSelect.vue.d.ts +1 -1
  7. package/dist/components/form/RawSelect.vue.d.ts +1 -1
  8. package/dist/components/navigation/UiTenantSwitcher.vue.d.ts +3 -3
  9. package/dist/components/table/BmsPagination.vue.d.ts +2 -0
  10. package/dist/components/table/BmsServerTable.vue.d.ts +3 -3
  11. package/dist/components/table/BmsTable.vue.d.ts +3 -3
  12. package/dist/components/table/BmsTableFilters.vue.d.ts +5 -3
  13. package/dist/components/table/UiBmsTable.vue.d.ts +3 -3
  14. package/dist/components/table/UiFilterButton.vue.d.ts +2 -0
  15. package/dist/index.d.ts +2 -1
  16. package/dist/models/table.model.d.ts +5 -0
  17. package/dist/plugins/field/FieldComponent.vue.d.ts +1 -1
  18. package/dist/showroom/pages/table.vue.d.ts +2 -0
  19. package/dist/sipa-bms-ui.css +151 -87
  20. package/dist/sipa-bms-ui.es.js +230 -159
  21. package/dist/sipa-bms-ui.es.js.map +1 -1
  22. package/dist/sipa-bms-ui.umd.js +234 -161
  23. package/dist/sipa-bms-ui.umd.js.map +1 -1
  24. package/package.json +2 -2
  25. package/src/components/button/BmsToggleIcon.stories.js +145 -0
  26. package/src/components/button/BmsToggleIcon.vue +108 -0
  27. package/src/components/form/BmsInputNumber.stories.js +12 -2
  28. package/src/components/form/BmsInputNumber.vue +2 -1
  29. package/src/components/form/BmsInputText.stories.js +9 -0
  30. package/src/components/form/BmsInputText.vue +2 -0
  31. package/src/components/layout/BmsFloatingWindow.vue +12 -1
  32. package/src/components/layout/BmsSplitWindow.vue +1 -1
  33. package/src/components/table/BmsPagination.vue +3 -0
  34. package/src/components/table/BmsServerTable.stories.js +59 -3
  35. package/src/components/table/BmsServerTable.vue +9 -2
  36. package/src/components/table/BmsTable.stories.js +65 -1
  37. package/src/components/table/BmsTable.vue +14 -3
  38. package/src/components/table/BmsTableFilters.vue +15 -5
  39. package/src/components/table/UiBmsTable.stories.js +3 -0
  40. package/src/components/table/UiBmsTable.vue +14 -5
  41. package/src/components/table/UiFilterButton.vue +6 -1
  42. package/src/index.ts +3 -0
  43. package/src/models/table.model.ts +6 -0
  44. package/src/showroom/pages/floating-window.vue +36 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouestfrance/sipa-bms-ui",
3
- "version": "8.22.3",
3
+ "version": "8.23.0",
4
4
  "author": "Ouest-France BMS",
5
5
  "license": "ISC",
6
6
  "scripts": {
@@ -61,7 +61,7 @@
61
61
  "lodash": "4.17.21",
62
62
  "lucide-vue-next": "0.562.0",
63
63
  "msw": "^2.12.4",
64
- "msw-storybook-addon": "^2.0.3",
64
+ "msw-storybook-addon": "^2.0.6",
65
65
  "normalize.css": "8.0.1",
66
66
  "path": "0.12.7",
67
67
  "prettier": "3.7.4",
@@ -0,0 +1,145 @@
1
+ import { Activity } from 'lucide-vue-next';
2
+ import { ref } from 'vue';
3
+ import BmsToggleIcon from './BmsToggleIcon.vue';
4
+
5
+ const WITH_DEFAULT_SLOT = {
6
+ default: '<Activity/>',
7
+ };
8
+
9
+ export default {
10
+ title: 'Composants/button/ToggleIcon',
11
+ component: BmsToggleIcon,
12
+ tags: ['with_useable_code'],
13
+ argTypes: {
14
+ modelValue: {
15
+ control: { type: 'boolean' },
16
+ },
17
+ disabled: {
18
+ control: { type: 'boolean' },
19
+ },
20
+ small: {
21
+ control: { type: 'boolean' },
22
+ },
23
+ },
24
+ };
25
+
26
+ const Template = (args) => ({
27
+ components: {
28
+ BmsToggleIcon,
29
+ Activity,
30
+ },
31
+ setup() {
32
+ const modelValue = ref(args.modelValue ?? false);
33
+ const modelValueSmall = ref(args.modelValue ?? false);
34
+ return { args, modelValue, modelValueSmall };
35
+ },
36
+ template: `
37
+ <div style="display: flex; flex-direction: column; gap: 24px; padding: 16px;">
38
+ <div style="display: flex; flex-direction: column; gap: 8px;">
39
+ <b>Normal</b>
40
+ <div style="display: flex; gap: 16px; align-items: center;">
41
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
42
+ <b style="font-size: 12px;">Default (cliquable)</b>
43
+ <BmsToggleIcon v-model="modelValue"><Activity/></BmsToggleIcon>
44
+ </div>
45
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
46
+ <b style="font-size: 12px;">Disable Default</b>
47
+ <BmsToggleIcon :model-value="false" :disabled="true"><Activity/></BmsToggleIcon>
48
+ </div>
49
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
50
+ <b style="font-size: 12px;">Hover</b>
51
+ <BmsToggleIcon :model-value="false" class="_hover"><Activity/></BmsToggleIcon>
52
+ </div>
53
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
54
+ <b style="font-size: 12px;">Actif</b>
55
+ <BmsToggleIcon :model-value="true"><Activity/></BmsToggleIcon>
56
+ </div>
57
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
58
+ <b style="font-size: 12px;">Disable Actif</b>
59
+ <BmsToggleIcon :model-value="true" :disabled="true"><Activity/></BmsToggleIcon>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <div style="display: flex; flex-direction: column; gap: 8px;">
64
+ <b>Small</b>
65
+ <div style="display: flex; gap: 16px; align-items: center;">
66
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
67
+ <b style="font-size: 12px;">Default (cliquable)</b>
68
+ <BmsToggleIcon v-model="modelValueSmall" small><Activity/></BmsToggleIcon>
69
+ </div>
70
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
71
+ <b style="font-size: 12px;">Disable Default</b>
72
+ <BmsToggleIcon :model-value="false" small :disabled="true"><Activity/></BmsToggleIcon>
73
+ </div>
74
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
75
+ <b style="font-size: 12px;">Hover</b>
76
+ <BmsToggleIcon :model-value="false" small class="_hover"><Activity/></BmsToggleIcon>
77
+ </div>
78
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
79
+ <b style="font-size: 12px;">Actif</b>
80
+ <BmsToggleIcon :model-value="true" small><Activity/></BmsToggleIcon>
81
+ </div>
82
+ <div style="display: flex; flex-direction: column; gap: 4px; align-items: center;">
83
+ <b style="font-size: 12px;">Disable Actif</b>
84
+ <BmsToggleIcon :model-value="true" small :disabled="true"><Activity/></BmsToggleIcon>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ `,
90
+ });
91
+
92
+ export const ToggleIcon = Template.bind({});
93
+ ToggleIcon.args = { ...WITH_DEFAULT_SLOT };
94
+
95
+ export const Default = () => ({
96
+ components: { BmsToggleIcon, Activity },
97
+ template: '<BmsToggleIcon><Activity/></BmsToggleIcon>',
98
+ });
99
+
100
+ export const DisableDefault = () => ({
101
+ components: { BmsToggleIcon, Activity },
102
+ template: '<BmsToggleIcon :disabled="true"><Activity/></BmsToggleIcon>',
103
+ });
104
+
105
+ export const Hover = () => ({
106
+ components: { BmsToggleIcon, Activity },
107
+ template: '<BmsToggleIcon class="_hover"><Activity/></BmsToggleIcon>',
108
+ });
109
+
110
+ export const Actif = () => ({
111
+ components: { BmsToggleIcon, Activity },
112
+ template: '<BmsToggleIcon :model-value="true"><Activity/></BmsToggleIcon>',
113
+ });
114
+
115
+ export const DisableActif = () => ({
116
+ components: { BmsToggleIcon, Activity },
117
+ template:
118
+ '<BmsToggleIcon :model-value="true" :disabled="true"><Activity/></BmsToggleIcon>',
119
+ });
120
+
121
+ export const Small = () => ({
122
+ components: { BmsToggleIcon, Activity },
123
+ template: '<BmsToggleIcon small><Activity/></BmsToggleIcon>',
124
+ });
125
+
126
+ export const SmallActive = () => ({
127
+ components: { BmsToggleIcon, Activity },
128
+ template:
129
+ '<BmsToggleIcon small :model-value="true"><Activity/></BmsToggleIcon>',
130
+ });
131
+
132
+ export const WithVModel = () => ({
133
+ components: { BmsToggleIcon, Activity },
134
+ setup() {
135
+ const isActive = ref(false);
136
+ return { isActive };
137
+ },
138
+ template: `
139
+ <div style="display: flex; flex-direction: column; gap: 16px; padding: 16px;">
140
+ <BmsToggleIcon v-model="isActive"><Activity/></BmsToggleIcon>
141
+ <p>État actif : {{ isActive }}</p>
142
+ <button @click="isActive = !isActive" style="padding: 8px;">Toggle depuis l'extérieur</button>
143
+ </div>
144
+ `,
145
+ });
@@ -0,0 +1,108 @@
1
+ <template>
2
+ <button
3
+ class="toggle-icon"
4
+ :class="{ active: modelValue, disabled, small }"
5
+ :disabled="disabled"
6
+ @click="handleClick"
7
+ >
8
+ <slot></slot>
9
+ </button>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ interface Props {
14
+ modelValue?: boolean;
15
+ disabled?: boolean;
16
+ small?: boolean;
17
+ }
18
+
19
+ const props = withDefaults(defineProps<Props>(), {
20
+ modelValue: false,
21
+ disabled: false,
22
+ small: false,
23
+ });
24
+
25
+ const emit = defineEmits<{
26
+ (e: 'update:modelValue', value: boolean): void;
27
+ (e: 'click', event: MouseEvent): void;
28
+ }>();
29
+
30
+ const handleClick = (event: MouseEvent) => {
31
+ if (!props.disabled) {
32
+ const newValue = !props.modelValue;
33
+ emit('update:modelValue', newValue);
34
+ emit('click', event);
35
+ }
36
+ };
37
+ </script>
38
+
39
+ <style lang="scss" scoped>
40
+ .toggle-icon {
41
+ --icon-color: var(--bms-grey-100);
42
+ --underline-color: transparent;
43
+
44
+ background: none;
45
+ border: none;
46
+ padding: 0;
47
+ padding-bottom: 0.25em;
48
+ cursor: pointer;
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ position: relative;
53
+
54
+ :deep(svg) {
55
+ color: var(--icon-color);
56
+ transition: color 0.2s;
57
+ }
58
+
59
+ &::after {
60
+ content: '';
61
+ position: absolute;
62
+ bottom: 0;
63
+ left: 0;
64
+ right: 0;
65
+ height: 0.125em;
66
+ background-color: var(--underline-color);
67
+ transition: background-color 0.2s;
68
+ }
69
+
70
+ &:hover:not(.disabled),
71
+ &._hover:not(.disabled) {
72
+ --icon-color: var(--bms-grey-140);
73
+ --underline-color: var(--bms-grey-140);
74
+ }
75
+
76
+ &.active {
77
+ --icon-color: var(--bms-main-100);
78
+ --underline-color: var(--bms-main-100);
79
+ }
80
+
81
+ &.active:hover:not(.disabled),
82
+ &.active._hover:not(.disabled) {
83
+ --icon-color: var(--bms-main-140);
84
+ --underline-color: var(--bms-main-140);
85
+ }
86
+
87
+ &.disabled {
88
+ --icon-color: var(--bms-grey-50);
89
+ cursor: default;
90
+ pointer-events: none;
91
+ }
92
+
93
+ &.disabled.active {
94
+ --underline-color: var(--bms-grey-50);
95
+ }
96
+
97
+ &.small {
98
+ :deep(svg) {
99
+ width: 1em;
100
+ height: 1em;
101
+ }
102
+
103
+ &::after {
104
+ height: 1.5px;
105
+ }
106
+ }
107
+ }
108
+ </style>
@@ -70,12 +70,22 @@ WithIcons.args = {
70
70
  iconEnd: true,
71
71
  };
72
72
 
73
+ export const WithLimitAndEmptyValue = Template.bind({});
74
+ WithLimitAndEmptyValue.args = {
75
+ label: 'My label',
76
+ modelValue: null,
77
+ modelValueSmall: undefined,
78
+ min: 5,
79
+ max: 8,
80
+ errors: [],
81
+ };
82
+
73
83
  export const WithLimitExceeded = Template.bind({});
74
84
  WithLimitExceeded.args = {
75
85
  label: 'My label',
76
- modelValue: 10,
86
+ modelValue: 0,
77
87
  modelValueSmall: 2,
78
- min: 5,
88
+ min: 1,
79
89
  max: 8,
80
90
  errors: [{ label: 'Error 1' }],
81
91
  };
@@ -70,7 +70,8 @@ const classes = computed(() => {
70
70
 
71
71
  const checkLimit = () => {
72
72
  internalErrors.value = [];
73
- if (props.min !== undefined && props.modelValue < props.min) {
73
+ const hasValue = props.modelValue !== null && props.modelValue !== undefined;
74
+ if (hasValue && props.min !== undefined && props.modelValue < props.min) {
74
75
  internalErrors.value = [
75
76
  'Valeur inférieure au minimum autorisé (min : ' + props.min + ')',
76
77
  ];
@@ -85,6 +85,15 @@ WithLimitEqual.args = {
85
85
  maxlength: 16,
86
86
  };
87
87
 
88
+ export const WithLimitAndEmptyValue = Template.bind({});
89
+ WithLimitAndEmptyValue.args = {
90
+ label: 'My label',
91
+ modelValue: null,
92
+ modelValueSmall: undefined,
93
+ maxlength: 15,
94
+ minlength: 1,
95
+ };
96
+
88
97
  export const WithLimitExceeded = Template.bind({});
89
98
  WithLimitExceeded.args = {
90
99
  label: 'My label',
@@ -88,7 +88,9 @@ const onInput = (e: Event) => {
88
88
  const checkLimit = () => {
89
89
  internalErrors.value = [];
90
90
  internalCaptions.value = [];
91
+ const hasValue = props.modelValue !== null && props.modelValue !== undefined;
91
92
  if (
93
+ hasValue &&
92
94
  props.inputType === InputType.TEXT &&
93
95
  typeof props.modelValue === 'string'
94
96
  ) {
@@ -47,6 +47,7 @@
47
47
  import { Maximize2, Minimize2, X } from 'lucide-vue-next';
48
48
  import BmsIconButton from '../button/BmsIconButton.vue';
49
49
  import { ref, computed, onMounted, watch, type CSSProperties } from 'vue';
50
+ import { useDebounceFn } from '@vueuse/core';
50
51
 
51
52
  export type Placement =
52
53
  | 'top-left'
@@ -128,10 +129,21 @@ function initPosition() {
128
129
  }
129
130
  }
130
131
 
132
+ const resizeCallack = useDebounceFn(() => {
133
+ expandedStyle.value = computeExpandedStyle();
134
+ }, 100);
135
+
131
136
  onMounted(() => {
132
137
  if (open.value) {
133
138
  initPosition();
134
139
  }
140
+ if (props.expandTarget) {
141
+ const targetEl = document.querySelector(props.expandTarget);
142
+ if (targetEl) {
143
+ const resizeObserver = new ResizeObserver(resizeCallack);
144
+ resizeObserver.observe(targetEl);
145
+ }
146
+ }
135
147
  });
136
148
 
137
149
  watch(open, (newVal) => {
@@ -350,7 +362,6 @@ function onDragEnd() {
350
362
 
351
363
  @container floating-window (min-width:900px) {
352
364
  .floating-window {
353
- max-height: 300px;
354
365
  max-width: 80%;
355
366
  }
356
367
  }
@@ -255,7 +255,7 @@ function clamp(value: number, minValue: number, maxValue: number) {
255
255
 
256
256
  &__separator {
257
257
  position: relative;
258
- z-index: var(--bms-z-index-fixed);
258
+ z-index: calc(var(--bms-z-index-modal));
259
259
 
260
260
  &:before {
261
261
  content: '';
@@ -4,6 +4,7 @@
4
4
  {{ selectLabel }}
5
5
  <BmsSelect
6
6
  v-model="size"
7
+ :small="small"
7
8
  :options="
8
9
  sizes.map((size: number) => ({ label: size.toString(), value: size }))
9
10
  "
@@ -70,9 +71,11 @@ interface BmsPaginationProps {
70
71
  currentPage: number;
71
72
  pages: number;
72
73
  selectLabel?: string;
74
+ small?: boolean;
73
75
  }
74
76
  const props = withDefaults(defineProps<BmsPaginationProps>(), {
75
77
  selectLabel: 'Éléments par page :',
78
+ small: false,
76
79
  });
77
80
 
78
81
  const emit = defineEmits<{
@@ -73,13 +73,13 @@ Default.args = {
73
73
  url: 'https://fakeapi.com/items',
74
74
  };
75
75
 
76
- export const withFilters = Template.bind({});
77
- withFilters.parameters = {
76
+ export const WithFilters = Template.bind({});
77
+ WithFilters.parameters = {
78
78
  msw: {
79
79
  handlers: [mswRequestHandler()],
80
80
  },
81
81
  };
82
- withFilters.args = {
82
+ WithFilters.args = {
83
83
  headers: [
84
84
  {
85
85
  label: 'Column 1',
@@ -129,6 +129,62 @@ withFilters.args = {
129
129
  defaultFiltersOpened: true,
130
130
  };
131
131
 
132
+ export const Small = Template.bind({});
133
+ Small.parameters = {
134
+ msw: {
135
+ handlers: [mswRequestHandler()],
136
+ },
137
+ };
138
+ Small.args = {
139
+ mode: 'small',
140
+ headers: [
141
+ {
142
+ label: 'Column 1',
143
+ key: 'col1',
144
+ align: 'start',
145
+ },
146
+ {
147
+ label: 'Column 2',
148
+ key: 'col2',
149
+ align: 'center',
150
+ },
151
+ {
152
+ label: 'Column 3',
153
+ key: 'col3',
154
+ align: 'end',
155
+ },
156
+ ],
157
+ filters: [
158
+ {
159
+ label: 'Input',
160
+ key: 'col1',
161
+ type: 'input',
162
+ value: 'Val',
163
+ },
164
+ {
165
+ label: 'Select',
166
+ key: 'col2',
167
+ type: 'select',
168
+ selectOptions: [
169
+ {
170
+ label: 'option1',
171
+ value: 'option1',
172
+ },
173
+ {
174
+ label: 'option2',
175
+ value: 'option2',
176
+ },
177
+ ],
178
+ },
179
+ {
180
+ label: 'Boolean',
181
+ key: 'col3',
182
+ type: 'boolean',
183
+ },
184
+ ],
185
+ url: 'https://fakeapi.com/items',
186
+ defaultFiltersOpened: true,
187
+ };
132
188
  export const WithSavedFilters = Template.bind({});
133
189
  WithSavedFilters.parameters = {
134
190
  msw: {
@@ -17,6 +17,7 @@ import {
17
17
  Sort,
18
18
  SortValue,
19
19
  TableHeader,
20
+ TableMode,
20
21
  } from '@/models';
21
22
  import _debounce from 'lodash/debounce';
22
23
  import { computed, type Ref, ref, type Slots, watch, watchEffect } from 'vue';
@@ -31,7 +32,7 @@ interface UiTableProps {
31
32
  headers: TableHeader[];
32
33
  filters?: Filter[];
33
34
  url?: string;
34
- mode?: 'normal' | 'dense';
35
+ mode?: TableMode;
35
36
  persistent?: boolean;
36
37
  pagination?: number[];
37
38
  size?: number;
@@ -54,7 +55,7 @@ interface UiTableProps {
54
55
  }
55
56
 
56
57
  const props = withDefaults(defineProps<UiTableProps>(), {
57
- mode: 'normal',
58
+ mode: TableMode.NORMAL,
58
59
  persistent: true,
59
60
  pagination: () => [25, 50, 100],
60
61
  size: 25,
@@ -307,6 +308,8 @@ const onClearSelection = () => {
307
308
  };
308
309
 
309
310
  const onSelectAll = () => emits('update:selectMode', SelectMode.ALL);
311
+
312
+ const isTableSmall = computed(() => props.mode === TableMode.SMALL);
310
313
  </script>
311
314
 
312
315
  <template>
@@ -341,6 +344,7 @@ const onSelectAll = () => emits('update:selectMode', SelectMode.ALL);
341
344
  <BmsTableFilters
342
345
  v-model="filters"
343
346
  :canSaveFilters="canSaveFilters"
347
+ :small="mode == 'small'"
344
348
  @saveFilter="onSaveFilter"
345
349
  @resetFilters="resetFilters"
346
350
  @filterInput="(filterEvent) => emits('filterInput', filterEvent)"
@@ -371,6 +375,7 @@ const onSelectAll = () => emits('update:selectMode', SelectMode.ALL);
371
375
  <template #search>
372
376
  <UiFilterButton
373
377
  v-if="filters.length > 0"
378
+ :small="isTableSmall"
374
379
  :activeFiltersNb="numberOfActiveFilters"
375
380
  :isFilterVisible="isFilterVisible"
376
381
  @toggleFilters="toggleFilters"
@@ -380,6 +385,7 @@ const onSelectAll = () => emits('update:selectMode', SelectMode.ALL);
380
385
  <BmsSearch
381
386
  :modelValue="search"
382
387
  class="table-search"
388
+ :small="isTableSmall"
383
389
  @update:modelValue="search = $event"
384
390
  />
385
391
  </slot>
@@ -407,6 +413,7 @@ const onSelectAll = () => emits('update:selectMode', SelectMode.ALL);
407
413
  :currentPage="props.initialPage === 1 ? currentPage - 1 : currentPage"
408
414
  :sizes="paginationsOptions"
409
415
  :pages="totalPages"
416
+ :small="isTableSmall"
410
417
  @prev="onPrevClick"
411
418
  @next="onNextClick"
412
419
  @go="go($event)"
@@ -18,7 +18,7 @@ export default {
18
18
  options: ['single', 'default'],
19
19
  },
20
20
  mode: {
21
- options: ['normal', 'dense'],
21
+ options: ['normal', 'dense', 'small'],
22
22
  },
23
23
  loading: {
24
24
  control: { type: 'boolean' },
@@ -136,6 +136,70 @@ FiltersClosed.args = {
136
136
  disableSearch: true,
137
137
  };
138
138
 
139
+ export const Small = Template.bind({});
140
+ Small.args = {
141
+ mode: 'small',
142
+ headers: [
143
+ {
144
+ label: 'Column 1',
145
+ key: 'col1',
146
+ align: 'start',
147
+ },
148
+ {
149
+ label: 'Column 2',
150
+ key: 'col2',
151
+ align: 'center',
152
+ },
153
+ {
154
+ label: 'Column 3',
155
+ key: 'col3',
156
+ align: 'end',
157
+ },
158
+ ],
159
+ filters: [
160
+ {
161
+ label: 'Input',
162
+ key: 'col1',
163
+ type: 'input',
164
+ value: 'Val',
165
+ },
166
+ {
167
+ label: 'Select',
168
+ key: 'col2',
169
+ type: 'select',
170
+ selectOptions: [
171
+ {
172
+ label: 'option1',
173
+ value: 'option1',
174
+ },
175
+ {
176
+ label: 'option2',
177
+ value: 'option2',
178
+ },
179
+ ],
180
+ },
181
+ {
182
+ label: 'Boolean',
183
+ key: 'col3',
184
+ type: 'boolean',
185
+ },
186
+ ],
187
+ items: [
188
+ {
189
+ col1: 'Value1',
190
+ col2: 'Value2',
191
+ col3: 'Value3',
192
+ },
193
+ {
194
+ col1: 'Value2',
195
+ col2: 'Value2',
196
+ col3: 'Value3',
197
+ },
198
+ ],
199
+ disableSearch: true,
200
+ defaultFiltersOpened: true,
201
+ };
202
+
139
203
  export const FiltersOpened = Template.bind({});
140
204
  FiltersOpened.args = {
141
205
  headers: [