@energysage/es-ds-components 3.0.0-alpha.13 → 3.0.0-alpha.14

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.
@@ -0,0 +1,20 @@
1
+ <script setup lang="ts">
2
+ import Column from 'primevue/column';
3
+ import type { ComponentOptionsMixin } from 'vue';
4
+
5
+ // magic solution for wrapping Column successfully
6
+ // https://www.reddit.com/r/vuejs/comments/1g17u7u/comment/lvjv91h/
7
+ defineOptions({
8
+ name: 'Column',
9
+ extends: (Column as unknown as ComponentOptionsMixin).extends,
10
+ inheritAttrs: false,
11
+ });
12
+ </script>
13
+
14
+ <!-- eslint-disable vue/valid-template-root -->
15
+ <template>
16
+ <!--
17
+ While this file needs to exist to keep Nuxt happy, it doesn't actually do anything.
18
+ Instances of es-data-table-column are placed inside es-data-table, and es-data-table handles their display.
19
+ -->
20
+ </template>
@@ -1,75 +1,38 @@
1
1
  <script setup lang="ts">
2
2
  import DataTable from 'primevue/datatable';
3
- import Column from 'primevue/column';
4
3
 
5
4
  const props = defineProps({
6
- fields: {
7
- type: Array,
8
- default: null,
9
- },
10
5
  items: {
11
6
  type: Array,
12
7
  required: true,
13
8
  },
14
- stickyFirstCol: {
9
+ scrollable: {
15
10
  type: Boolean,
16
11
  default: false,
17
12
  },
18
- stickyHeader: {
19
- type: [Boolean, String],
20
- default: false,
13
+ scrollHeight: {
14
+ type: String,
15
+ default: '',
21
16
  },
22
17
  });
23
18
 
24
- const checkFrozenRow = (index: any) => {
25
- if (index === 0 && props.stickyFirstCol) {
26
- return true;
27
- }
28
- return false;
29
- };
30
-
31
- // Code is taken from BootStrap Vue to implemnt <b-table> feature that automatically
32
- // samples the first row to extract field name and "humanize" by converting kebab-case,
33
- // snake_case, and camelCase to individual words and capitalizes each word.
34
- // Doc: https://bootstrap-vue.org/docs/components/table
35
- // Source Code: https://github.com/bootstrap-vue/bootstrap-vue/blob/5173dd19f6f46dc9d125cd7233fb59ccd2ef9296/src/utils/string.js#L30
36
- const startCase = (str: string) =>
37
- str
38
- .replace(/_/g, ' ')
39
- .replace(/([a-z])([A-Z])/g, (_, $1, $2) => `${$1} ${$2}`)
40
- .replace(/(\s|^)(\w)/g, (_, $1, $2) => $1 + $2.toUpperCase());
41
-
42
- const label = (col: any) => {
43
- if (typeof col === 'string') {
44
- return startCase(col);
19
+ // avoid passing in default scrollHeight value when scrollable is false
20
+ // otherwise it will limit the height when we don't want it to
21
+ const defaultScrollHeight = computed(() => {
22
+ if (props.scrollable) {
23
+ return props.scrollHeight || '305px';
45
24
  }
46
- return col?.label ? col.label : startCase(col?.key);
47
- };
48
25
 
49
- const columns = computed(() => {
50
- if (props.fields) {
51
- return props.fields;
52
- }
53
- // @ts-expect-error not sure
54
- return Object.keys(props.items[0]);
55
- });
56
-
57
- const scrollHeight = computed(() => {
58
- if (props.stickyHeader) {
59
- if (typeof props.stickyHeader === 'string') {
60
- return props.stickyHeader;
61
- }
62
- return '300px';
63
- }
64
26
  return '';
65
27
  });
66
28
  </script>
29
+
67
30
  <template>
68
31
  <data-table
69
- scrollable
32
+ class="border table__data-table table-spacing table"
70
33
  :pt="{
71
34
  table: {
72
- class: 'font-size-75 font-size-md-100',
35
+ class: 'font-size-75 font-size-md-100 w-100',
73
36
  style: 'border-collapse: separate; border-spacing: 0;',
74
37
  },
75
38
  wrapper: {
@@ -79,50 +42,34 @@ const scrollHeight = computed(() => {
79
42
  style: 'top: 0px; z-index: 2',
80
43
  },
81
44
  }"
82
- :value="props.items"
83
- class="border table__data-table table-spacing table"
84
- :scroll-height="scrollHeight">
85
- <!-- @vue-expect-error -->
86
- <column
87
- v-for="(col, index) of columns"
88
- :key="col?.key ? col.key : col"
89
- :field="col?.key ? col.key : col"
90
- :header="label(col)"
91
- :sortable="col?.sortable"
92
- :frozen="checkFrozenRow(index)"
93
- align-frozen="left"
94
- :pt="{
95
- sortIcon: {
96
- style: 'display: none',
97
- },
98
- headerCell: (options) => ({
99
- class: [
100
- {
101
- sortable: options.props.sortable,
102
- stickyFirstColHeader: options.props.frozen,
103
- },
104
- ],
105
- }),
106
- bodyCell: (options) => ({
107
- class: [
108
- {
109
- stickyFirstCol: options.props.frozen,
110
- },
111
- ],
112
- }),
113
- }">
114
- </column>
45
+ :scrollable="scrollable"
46
+ :scroll-height="defaultScrollHeight"
47
+ :value="items">
48
+ <slot />
115
49
  </data-table>
116
50
  </template>
51
+
117
52
  <style scoped lang="scss">
118
- :deep(.stickyFirstColHeader) {
119
- position: sticky !important;
53
+ :deep(th[data-p-sortable-column='true']) {
54
+ cursor: pointer;
55
+ user-select: none;
56
+
57
+ div[data-pc-section='headercontent'] {
58
+ align-items: center;
59
+ display: flex;
60
+ }
61
+ span[data-pc-section='sort'] {
62
+ display: inline-block;
63
+ margin-left: 0.5rem;
64
+ }
120
65
  }
121
- :deep(.stickyFirstCol) {
66
+
67
+ :deep(td[data-p-frozen-column='true']),
68
+ :deep(th[data-p-frozen-column='true']) {
122
69
  position: sticky !important;
123
- background: inherit;
124
70
  }
125
- :deep(.sortable) {
126
- cursor: pointer !important;
71
+
72
+ :deep(td[data-p-frozen-column='true']) {
73
+ background: inherit;
127
74
  }
128
75
  </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@energysage/es-ds-components",
3
- "version": "3.0.0-alpha.13",
3
+ "version": "3.0.0-alpha.14",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "An EnergySage Vue component library",