@ouestfrance/sipa-bms-ui 8.22.3 → 8.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) 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 +182 -115
  20. package/dist/sipa-bms-ui.es.js +232 -161
  21. package/dist/sipa-bms-ui.es.js.map +1 -1
  22. package/dist/sipa-bms-ui.umd.js +236 -163
  23. package/dist/sipa-bms-ui.umd.js.map +1 -1
  24. package/package.json +2 -2
  25. package/src/assets/scss/global-variables.scss +3 -0
  26. package/src/components/button/BmsToggleIcon.stories.js +145 -0
  27. package/src/components/button/BmsToggleIcon.vue +108 -0
  28. package/src/components/feedback/UiTooltip.vue +1 -1
  29. package/src/components/form/BmsInputNumber.stories.js +12 -2
  30. package/src/components/form/BmsInputNumber.vue +2 -1
  31. package/src/components/form/BmsInputText.stories.js +9 -0
  32. package/src/components/form/BmsInputText.vue +2 -0
  33. package/src/components/layout/BmsFloatingWindow.vue +13 -2
  34. package/src/components/layout/BmsSplitWindow.vue +1 -1
  35. package/src/components/table/BmsPagination.vue +3 -0
  36. package/src/components/table/BmsServerTable.stories.js +59 -3
  37. package/src/components/table/BmsServerTable.vue +10 -3
  38. package/src/components/table/BmsTable.stories.js +65 -1
  39. package/src/components/table/BmsTable.vue +15 -4
  40. package/src/components/table/BmsTableFilters.vue +15 -5
  41. package/src/components/table/UiBmsTable.stories.js +3 -0
  42. package/src/components/table/UiBmsTable.vue +14 -6
  43. package/src/components/table/UiFilterButton.vue +6 -1
  44. package/src/index.ts +3 -0
  45. package/src/models/table.model.ts +6 -0
  46. package/src/plugins/notifications/NotificationItem.vue +1 -1
  47. package/src/showroom/pages/floating-window.vue +36 -0
  48. package/src/showroom/pages/table.vue +9 -5
@@ -13,6 +13,7 @@ import {
13
13
  Sort,
14
14
  SortValue,
15
15
  TableHeader,
16
+ TableMode,
16
17
  } from '@/models';
17
18
  import { computed, Ref, ref, watch, watchEffect } from 'vue';
18
19
  import BmsTableFilters from './BmsTableFilters.vue';
@@ -21,6 +22,7 @@ import { BmsTag } from '@/index';
21
22
  import * as lucideIcons from 'lucide-vue-next';
22
23
  import { Trash } from 'lucide-vue-next';
23
24
  import { useRoute } from 'vue-router';
25
+ import Table from '@/showroom/pages/table.vue';
24
26
 
25
27
  const route = useRoute();
26
28
  const slots = defineSlots();
@@ -32,7 +34,7 @@ interface UiTableProps {
32
34
  savedFilters?: SavedFilter[];
33
35
  canSaveFilters?: boolean;
34
36
  items: unknown[];
35
- mode?: 'normal' | 'dense';
37
+ mode?: TableMode | string; // string for retro compatibility
36
38
  persistent?: boolean;
37
39
  pagination?: number[];
38
40
  size?: number;
@@ -45,7 +47,7 @@ interface UiTableProps {
45
47
  }
46
48
 
47
49
  const props = withDefaults(defineProps<UiTableProps>(), {
48
- mode: 'normal',
50
+ mode: TableMode.NORMAL,
49
51
  persistent: true,
50
52
  pagination: () => [25, 50, 100],
51
53
  size: 25,
@@ -233,6 +235,8 @@ const onSelectAll = () => {
233
235
  };
234
236
 
235
237
  const totalSize = computed(() => elementsAndChildElements.value.length);
238
+
239
+ const isTableSmall = computed(() => props.mode === TableMode.SMALL);
236
240
  </script>
237
241
 
238
242
  <template>
@@ -241,7 +245,7 @@ const totalSize = computed(() => elementsAndChildElements.value.length);
241
245
  :loading="loading"
242
246
  :items="currentItems"
243
247
  :headers="headers"
244
- :mode="mode"
248
+ :mode="mode as TableMode"
245
249
  :hasFilters="filters.length > 0"
246
250
  :sort="sort"
247
251
  :selectable="selectable"
@@ -264,6 +268,7 @@ const totalSize = computed(() => elementsAndChildElements.value.length);
264
268
  <div v-show="isFilterVisible" class="filters-container">
265
269
  <BmsTableFilters
266
270
  v-model="filters"
271
+ :small="isTableSmall"
267
272
  :canSaveFilters="canSaveFilters"
268
273
  @saveFilter="onSaveFilter"
269
274
  @reset-filters="resetFilters"
@@ -300,10 +305,15 @@ const totalSize = computed(() => elementsAndChildElements.value.length);
300
305
  :activeFiltersNb="numberOfActiveFilters"
301
306
  :isFilterVisible="isFilterVisible"
302
307
  @toggleFilters="toggleFilters"
308
+ :small="isTableSmall"
303
309
  />
304
310
  <template v-if="!disableSearch">
305
311
  <slot name="search">
306
- <BmsSearch v-model="search" class="table-search" />
312
+ <BmsSearch
313
+ v-model="search"
314
+ class="table-search"
315
+ :small="isTableSmall"
316
+ />
307
317
  </slot>
308
318
  </template>
309
319
  </template>
@@ -325,6 +335,7 @@ const totalSize = computed(() => elementsAndChildElements.value.length);
325
335
  :currentPage="currentPage"
326
336
  :sizes="paginationsOptions"
327
337
  :pages="totalPages"
338
+ :small="isTableSmall"
328
339
  @prev="onPrevClick"
329
340
  @next="onNextClick"
330
341
  @go="go($event)"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="filters">
2
+ <div class="filters" :class="{ 'filters--small': small }">
3
3
  <div class="filters__header">
4
4
  <div class="filters__header-title">
5
5
  <FilterIcon />
@@ -23,7 +23,7 @@
23
23
  </BmsIconButton>
24
24
  </span>
25
25
  </div>
26
- <div class="filters__inputs">
26
+ <div class="filters__inputs" :class="{ 'filters__inputs--small': small }">
27
27
  <span
28
28
  v-for="filter in modelValue"
29
29
  class="input"
@@ -34,6 +34,7 @@
34
34
  >
35
35
  <component
36
36
  :is="getFilterComponent(filter.type)"
37
+ :small="small"
37
38
  :label="filter.label"
38
39
  :inputType="filter.inputType"
39
40
  :modelValue="transformValueForComponent(filter?.value, filter.type)"
@@ -104,9 +105,11 @@ const props = withDefaults(
104
105
  defineProps<{
105
106
  modelValue: Filter[];
106
107
  canSaveFilters?: boolean;
108
+ small?: boolean;
107
109
  }>(),
108
110
  {
109
111
  canSaveFilters: false,
112
+ small: false,
110
113
  },
111
114
  );
112
115
 
@@ -246,11 +249,15 @@ watch(
246
249
 
247
250
  <style lang="scss" scoped>
248
251
  .filters {
249
- padding: 16px;
252
+ padding: 1em;
250
253
  background: var(--bms-white);
251
254
  border: 1px solid var(--bms-grey-10);
252
255
  border-radius: var(--bms-border-radius-large);
253
- margin-bottom: 16px;
256
+ margin-bottom: 1em;
257
+ &--small {
258
+ margin-bottom: 0.5em;
259
+ padding: 0.5em;
260
+ }
254
261
 
255
262
  &__header {
256
263
  display: flex;
@@ -268,9 +275,12 @@ watch(
268
275
  &__inputs {
269
276
  display: flex;
270
277
  flex-wrap: wrap;
271
- padding-top: 16px;
272
278
  align-items: flex-end;
273
279
  row-gap: 8px;
280
+ padding-top: 1em;
281
+ &--small {
282
+ padding-top: 0.5em;
283
+ }
274
284
 
275
285
  .input {
276
286
  width: 25%;
@@ -11,6 +11,9 @@ export default {
11
11
  page: template,
12
12
  },
13
13
  },
14
+ argTypes: {
15
+ mode: { options: ['normal', 'dense', 'small'] },
16
+ },
14
17
  tags: ['code-only'],
15
18
  title: 'Composants/table/UiBmsTable',
16
19
  component: UiBmsTable,
@@ -5,8 +5,8 @@ import {
5
5
  SortValue,
6
6
  StatusType,
7
7
  type TableHeader,
8
+ TableMode,
8
9
  } from '@/models';
9
- import _get from 'lodash/get';
10
10
  import _isEqual from 'lodash/isEqual';
11
11
  import {
12
12
  type Component,
@@ -27,7 +27,7 @@ import UiBmsTableRow from './UiBmsTableRow.vue';
27
27
  interface UiBmsTableProps {
28
28
  headers: TableHeader[];
29
29
  items: any[];
30
- mode?: 'normal' | 'dense';
30
+ mode?: TableMode;
31
31
  loading?: boolean;
32
32
  hasFilters?: boolean;
33
33
  sort?: Sort;
@@ -40,7 +40,7 @@ interface UiBmsTableProps {
40
40
  }
41
41
 
42
42
  const props = withDefaults(defineProps<UiBmsTableProps>(), {
43
- mode: 'normal',
43
+ mode: TableMode.NORMAL,
44
44
  hasFilters: false,
45
45
  sort: () => ({
46
46
  key: null,
@@ -211,7 +211,10 @@ onMounted(() => {
211
211
 
212
212
  <template>
213
213
  <div class="bms-table">
214
- <div class="bms-table__actions">
214
+ <div
215
+ class="bms-table__actions"
216
+ :class="{ 'bms-table__actions--small': mode === TableMode.SMALL }"
217
+ >
215
218
  <div class="bms-table__actions__saved-filters">
216
219
  <div class="bms-table__actions__custom">
217
220
  <slot name="custom-actions"></slot>
@@ -321,7 +324,7 @@ onMounted(() => {
321
324
  :headers="filteredHeaders"
322
325
  :select-mode="selectMode"
323
326
  :selectable-disabled="selectableDisabled"
324
- :dense="mode === 'dense'"
327
+ :dense="mode === TableMode.DENSE || mode === TableMode.SMALL"
325
328
  @select="onItemSelect"
326
329
  >
327
330
  <template v-for="cell in headers" v-slot:[cell.key]="slotData">
@@ -400,7 +403,11 @@ onMounted(() => {
400
403
  display: flex;
401
404
  align-items: center;
402
405
  justify-content: space-between;
403
- margin-bottom: 16px;
406
+ margin-bottom: 1em;
407
+
408
+ &--small {
409
+ margin-bottom: 0.5em;
410
+ }
404
411
 
405
412
  &__saved-filters {
406
413
  display: flex;
@@ -528,6 +535,7 @@ onMounted(() => {
528
535
  visibility: hidden;
529
536
  --table-blob-height: 80px;
530
537
 
538
+ &.small,
531
539
  &.dense {
532
540
  --table-blob-height: 50px;
533
541
  }
@@ -4,6 +4,7 @@
4
4
  class="filter-button"
5
5
  :color="isFilterVisible ? StatusType.Default : StatusType.Information"
6
6
  :mode="isFilterVisible ? 'fill' : 'ghost'"
7
+ :small="small"
7
8
  @click="$emits('toggleFilters')"
8
9
  >
9
10
  <FilterIcon />
@@ -23,11 +24,13 @@ import { StatusType } from '@/models';
23
24
  interface UiFilterButtonProps {
24
25
  isFilterVisible: boolean;
25
26
  activeFiltersNb: number;
27
+ small?: boolean;
26
28
  }
27
29
 
28
30
  const props = withDefaults(defineProps<UiFilterButtonProps>(), {
29
31
  isFilterVisible: false,
30
32
  activeFiltersNb: 0,
33
+ small: false,
31
34
  });
32
35
 
33
36
  const $emits = defineEmits<{
@@ -43,8 +46,10 @@ const showIndicator = computed(
43
46
  .filter-button-container {
44
47
  position: relative;
45
48
 
49
+ :deep(.bms-button .content) {
50
+ margin: 0;
51
+ }
46
52
  .filter-button {
47
- padding: 0.5em 0;
48
53
  font-size: 20px;
49
54
  }
50
55
  .indicator {
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ import { App } from 'vue';
2
2
 
3
3
  import BmsButton from './components/button/BmsButton.vue';
4
4
  import BmsIconButton from './components/button/BmsIconButton.vue';
5
+ import BmsToggleIcon from './components/button/BmsToggleIcon.vue';
5
6
 
6
7
  import BmsAlert from './components/feedback/BmsAlert.vue';
7
8
  import BmsBadge from './components/feedback/BmsBadge.vue';
@@ -75,6 +76,7 @@ export const createBmsUi = () => ({
75
76
  install: (app: App) => {
76
77
  app.component('BmsButton', BmsButton);
77
78
  app.component('BmsIconButton', BmsIconButton);
79
+ app.component('BmsToggleIcon', BmsToggleIcon);
78
80
 
79
81
  app.component('BmsAlert', BmsAlert);
80
82
  app.component('BmsBadge', BmsBadge);
@@ -159,6 +161,7 @@ export * from './services';
159
161
  export {
160
162
  BmsButton,
161
163
  BmsIconButton,
164
+ BmsToggleIcon,
162
165
  BmsAlert,
163
166
  BmsBadge,
164
167
  BmsCaption,
@@ -70,3 +70,9 @@ export enum SelectMode {
70
70
  DEFAULT = 'default',
71
71
  SINGLE = 'single',
72
72
  }
73
+
74
+ export enum TableMode {
75
+ NORMAL = 'normal',
76
+ DENSE = 'dense',
77
+ SMALL = 'small',
78
+ }
@@ -58,7 +58,7 @@ const closeNotification = () => {
58
58
  background-color: var(--notification-background-color);
59
59
  color: white;
60
60
  position: relative;
61
- box-shadow: 0 4px 8px var(--bms-shadow-color);
61
+ box-shadow: var(--bms-box-shadow);
62
62
 
63
63
  .main-info {
64
64
  display: flex;
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <BmsSplitWindow>
3
+ <template #first>
4
+ <div class="first">
5
+ first
6
+ <BmsFloatingWindow
7
+ title="coucou"
8
+ :model-value="true"
9
+ expandable
10
+ :expand-target="'.second'"
11
+ height="500px"
12
+ >
13
+ cc
14
+ </BmsFloatingWindow>
15
+ </div>
16
+ </template>
17
+ <template #second> <div class="second">second</div> </template>
18
+ </BmsSplitWindow>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import BmsFloatingWindow from '@/components/layout/BmsFloatingWindow.vue';
23
+ import BmsSplitWindow from '@/components/layout/BmsSplitWindow.vue';
24
+ </script>
25
+
26
+ <style scoped lang="scss">
27
+ .first {
28
+ background-color: red;
29
+ height: 200px;
30
+ width: 100%;
31
+ }
32
+ .second {
33
+ background-color: blue;
34
+ width: 100%;
35
+ }
36
+ </style>
@@ -14,7 +14,7 @@
14
14
  activity-link="/activity-path"
15
15
  v-model:selectedItems="selectedItems"
16
16
  selectable
17
- :select-mode="'single'"
17
+ :select-mode="SelectMode.SINGLE"
18
18
  @saveFilter="onSaveFilter"
19
19
  @deleteSavedFilter="onDeleteSavedFilter"
20
20
  @filterInput="onFilterInput"
@@ -54,23 +54,27 @@
54
54
  </template>
55
55
 
56
56
  <script lang="ts" setup>
57
- import { BmsBackButton, BmsButton, useNotifications } from '@/index';
57
+ import {
58
+ BmsBackButton,
59
+ BmsButton,
60
+ SelectMode,
61
+ useNotifications,
62
+ } from '@/index';
58
63
  import {
59
64
  ColumnType,
60
65
  Filter,
61
66
  InputType,
62
67
  SavedFilter,
63
- SelectMode,
64
68
  SortValue,
65
69
  StatusType,
66
70
  } from '@/models';
67
71
  import { Ref, ref } from 'vue';
68
72
  import { useRouterHistory } from '@/plugins/router-history/router-history.composable';
69
- import BmsShortLinkMenu from '@/components/navigation/BmsShortLinkMenu.vue';
70
73
  import BmsTooltip from '@/components/feedback/BmsTooltip.vue';
71
74
  import BmsIconButton from '@/components/button/BmsIconButton.vue';
72
- import { Delete, Save, Trash } from 'lucide-vue-next';
75
+ import { Save, Trash } from 'lucide-vue-next';
73
76
  import BmsChip from '@/components/form/BmsChip.vue';
77
+ import BmsTable from '@/components/table/BmsTable.vue';
74
78
 
75
79
  const { goBack } = useRouterHistory();
76
80
  const { error, success } = useNotifications();