wave-ui 3.17.1 → 3.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-ui",
3
- "version": "3.17.1",
3
+ "version": "3.17.3",
4
4
  "description": "A UI framework for Vue.js 3 (and 2) with only the bright side. :sunny:",
5
5
  "author": "Antoni Andre <antoniandre.web@gmail.com>",
6
6
  "homepage": "https://antoniandre.github.io/wave-ui",
@@ -4,18 +4,21 @@
4
4
  slot(v-if="accordionItemsProvided")
5
5
 
6
6
  //- Else, when providing the items array or number through the items prop.
7
- template(v-else-if="!isNaN(items) || (items || []).length")
7
+ template(v-else-if="(items || []).length")
8
8
  w-accordion-item(
9
- v-for="(accordionItem, i) in state.accordionItems"
9
+ v-for="(item, i) in (items.length ? items : accordionItems)"
10
10
  :key="i"
11
- :class="itemClass"
12
- :item="accordionItem"
11
+ :class="itemClasses"
12
+ :title="item.title"
13
+ :content="item.content"
14
+ :expanded="item.expanded || item._expanded"
15
+ :disabled="item.disabled || item._disabled"
13
16
  @focus="$emit('focus', $event)")
14
17
  //- Title.
15
18
  template(#title="{ item, expanded, index }")
16
19
  slot(
17
- v-if="$slots[`item-title.${accordionItem.id || (accordionItem._index + 1)}`]"
18
- :name="`item-title.${accordionItem.id || (accordionItem._index + 1)}`"
20
+ v-if="$slots[`item-title.${item.id || index}`]"
21
+ :name="`item-title.${item.id || index}`"
19
22
  :item="item"
20
23
  :expanded="expanded"
21
24
  :index="index")
@@ -28,8 +31,8 @@
28
31
  //- Content.
29
32
  template(#content="{ item, expanded, index }")
30
33
  slot(
31
- v-if="$slots[`item-content.${accordionItem.id || (accordionItem._index + 1)}`]"
32
- :name="`item-content.${accordionItem.id || (accordionItem._index + 1)}`"
34
+ v-if="$slots[`item-content.${item.id || index}`]"
35
+ :name="`item-content.${item.id || index}`"
33
36
  :item="item"
34
37
  :expanded="expanded"
35
38
  :index="index")
@@ -43,6 +46,7 @@
43
46
 
44
47
  <script>
45
48
  import { objectifyClasses } from '../../utils/index'
49
+ import { consoleError } from '../../utils/console'
46
50
  import WAccordionItem from './item.vue'
47
51
 
48
52
  export default {
@@ -52,7 +56,9 @@ export default {
52
56
  modelValue: { type: Array },
53
57
  color: { type: String },
54
58
  bgColor: { type: String },
55
- items: { type: [Array, Number] }, // Required unless externally using WAccordionItem.
59
+ // Required unless externally using WAccordionItem.
60
+ // Number deprecated: use WAccordionItem.
61
+ items: { type: [Array, Number] },
56
62
  itemColorKey: { type: String, default: 'color' }, // Support a different color per item.
57
63
  itemTitleKey: { type: String, default: 'title' },
58
64
  itemContentKey: { type: String, default: 'content' },
@@ -78,7 +84,6 @@ export default {
78
84
  // All provided to the WAccordionItem, not passed as prop since it could be used externally.
79
85
  provide () {
80
86
  return {
81
- itemClasses: objectifyClasses(this.itemClasses),
82
87
  titleClasses: this.titleClasses,
83
88
  contentClasses: this.contentClasses,
84
89
  onItemToggle: this.onItemToggle,
@@ -86,17 +91,23 @@ export default {
86
91
  getOriginalItem: this.getOriginalItem,
87
92
  options: this.$props,
88
93
  registerItem: this.registerItem,
89
- state: this.state
94
+ unregisterItem: this.unregisterItem,
95
+ getAccordionItem: this.getAccordionItem
90
96
  }
91
97
  },
92
98
 
93
99
  data: () => ({
94
- state: {
95
- accordionItems: []
96
- }
100
+ accordionItems: []
97
101
  }),
98
102
 
99
103
  computed: {
104
+ accordionItemsById () {
105
+ return this.accordionItems.reduce((obj, item) => {
106
+ obj[item._cuid] = item
107
+ return obj
108
+ }, {})
109
+ },
110
+
100
111
  // Detect if the accordion items are directly provided through slot using WAccordionItem.
101
112
  accordionItemsProvided () {
102
113
  return this.$slots.default?.()?.some(item => item?.type?.name)
@@ -129,10 +140,13 @@ export default {
129
140
  },
130
141
 
131
142
  methods: {
143
+ getAccordionItem (cuid) {
144
+ return this.accordionItemsById[cuid]
145
+ },
146
+
132
147
  onItemToggle (item) {
133
- if (this.expandSingle) this.state.accordionItems.forEach(obj => obj._index !== item._index && (obj._expanded = false))
134
- const expandedItems = this.state.accordionItems.map(item => item._expanded || false)
135
- console.log('toggling item', expandedItems)
148
+ if (this.expandSingle) this.accordionItems.forEach(obj => obj._index !== item._index && (obj._expanded = false))
149
+ const expandedItems = this.accordionItems.map(item => item._expanded || false)
136
150
  this.$emit('update:modelValue', expandedItems)
137
151
  this.$emit('input', expandedItems)
138
152
  this.$emit('item-expand', { item, expanded: item._expanded })
@@ -144,48 +158,48 @@ export default {
144
158
 
145
159
  // Return the original accordion item (so there is no `_index`, etc.).
146
160
  getOriginalItem (item) {
147
- return this.items[item._index]
148
- },
149
-
150
- updateItems () {
151
- let items = this.state.accordionItems
152
- if (!this.accordionItemsProvided && this.items) {
153
- items = (typeof this.items === 'number' ? Array(this.items).fill({}) : this.items) || []
154
- }
155
-
156
- this.state.accordionItems = items.map((item, _index) => ({
157
- ...item,
158
- _index,
159
- _expanded: this.modelValue?.[_index] ?? false,
160
- _disabled: !!item.disabled
161
- }))
161
+ return this.items?.[item._index] || item
162
162
  },
163
163
 
164
- // Provide-injected in and used from w-accordion-item.
164
+ // Provide-injected and used from w-accordion-item.
165
165
  // Only when w-accordion-item is directly used outside of Wave UI.
166
166
  registerItem (item) {
167
- if (this.accordionItemsProvided) {
168
- item._index = this.state.accordionItems.length
169
- item._expanded = this.modelValue?.[item._index] ?? false
170
- item._disabled = !!item.disabled
167
+ item._index = this.accordionItems.length
168
+ item = Object.assign(item, this.items?.[item._index])
169
+ item._expanded = this.modelValue?.[item._index] ?? false
170
+ item._disabled = !!item._disabled
171
171
 
172
- this.state.accordionItems.push(item)
173
- }
172
+ this.accordionItems.push(item)
173
+ },
174
174
 
175
- return item._index
175
+ // Provide-injected and used from w-accordion-item.
176
+ unregisterItem (cuid) {
177
+ const index = this.getAccordionItem(cuid)?._index
178
+ if (index !== undefined) this.accordionItems.splice(index, 1)
176
179
  }
177
180
  },
178
181
 
179
182
  created () {
180
- if (!this.accordionItemsProvided && this.items) this.updateItems()
183
+ if (!isNaN(this.items)) {
184
+ consoleError(
185
+ `Since version 3.17.3, the w-accordion \`items\` prop can no longer be a Number.
186
+ Please use the w-accordion-item component instead for advanced custom rendering.
187
+ https://antoniandre.github.io/wave-ui/w-accordion#w-accordion-item`
188
+ )
189
+ }
190
+ },
191
+
192
+ unmounted () {
193
+ this.accordionItems = []
181
194
  },
182
195
 
183
196
  watch: {
184
- modelValue () {
185
- this.updateItems()
186
- },
187
- items () {
188
- // this.updateItems()
197
+ modelValue (array) {
198
+ if (this.expandSingle) {
199
+ const firstExpandedIndex = array.findIndex(bool => !!bool)
200
+ if (firstExpandedIndex > -1) array = array.fill(false, firstExpandedIndex + 1)
201
+ }
202
+ array.forEach((bool, i) => ((this.accordionItems[i] || {})._expanded = bool))
189
203
  }
190
204
  }
191
205
  }
@@ -20,7 +20,7 @@
20
20
  //- Title.
21
21
  slot(
22
22
  name="title"
23
- :item="(accordionItem)"
23
+ :item="getOriginalItem(accordionItem)"
24
24
  :expanded="accordionItem._expanded"
25
25
  :index="accordionItem._index + 1")
26
26
  .grow(v-html="accordionItem[options.itemTitleKey]")
@@ -37,7 +37,7 @@
37
37
  .w-accordion__item-content(v-if="accordionItem._expanded" :class="contentClasses")
38
38
  slot(
39
39
  name="content"
40
- :item="(accordionItem)"
40
+ :item="getOriginalItem(accordionItem)"
41
41
  :expanded="accordionItem._expanded"
42
42
  :index="accordionItem._index + 1")
43
43
  div(v-html="accordionItem[options.itemContentKey]")
@@ -48,44 +48,38 @@ export default {
48
48
  name: 'w-accordion-item',
49
49
 
50
50
  props: {
51
- item: { type: Object }
51
+ title: { type: String },
52
+ content: { type: String },
53
+ expanded: { type: Boolean },
54
+ disabled: { type: Boolean }
52
55
  },
53
56
 
54
57
  inject: [
55
58
  'options',
56
- 'itemClasses',
57
59
  'titleClasses',
58
60
  'contentClasses',
59
61
  'onItemToggle',
60
62
  'onEndOfCollapse',
61
63
  'getOriginalItem',
64
+ 'getAccordionItem',
62
65
  'registerItem',
63
- 'state'
66
+ 'unregisterItem'
64
67
  ],
65
68
 
66
69
  emits: ['focus'],
67
70
 
68
- data () {
69
- return {
70
- accordionItemIndex: this.item?._index
71
- }
72
- },
73
-
74
71
  computed: {
75
72
  accordionItem: {
76
73
  get () {
77
- return this.state.accordionItems[this.accordionItemIndex] || {}
74
+ return this.getAccordionItem(this._.uid)
78
75
  },
79
- set () {
80
-
81
- }
76
+ set () {}
82
77
  },
83
- itemClass () {
78
+ itemClasses () {
84
79
  return {
85
80
  'w-accordion__item--expanded': this.accordionItem._expanded,
86
81
  'w-accordion__item--disabled': this.accordionItem._disabled,
87
- [this.accordionItem[this.options.itemColorKey]]: this.accordionItem[this.options.itemColorKey],
88
- ...this.accordionItemClasses
82
+ [this.accordionItem[this.options.itemColorKey]]: this.accordionItem[this.options.itemColorKey]
89
83
  }
90
84
  }
91
85
  },
@@ -106,12 +100,18 @@ export default {
106
100
 
107
101
  created () {
108
102
  // Register this item to the w-accordion component.
109
- this.accordionItemIndex = this.registerItem({
103
+ this.registerItem({
104
+ _cuid: this._.uid,
110
105
  _index: 0,
111
- _expanded: false,
112
- _disabled: false,
113
- ...(this.item || {})
106
+ _expanded: this.expanded,
107
+ _disabled: this.disabled,
108
+ title: this.title,
109
+ content: this.content
114
110
  })
111
+ },
112
+
113
+ beforeUnmount () {
114
+ this.unregisterItem(this._.uid)
115
115
  }
116
116
  }
117
117
  </script>