@phoenix-cg/v-filters 0.1.16 → 0.2.0-beta.10

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": "@phoenix-cg/v-filters",
3
- "version": "0.1.16",
3
+ "version": "0.2.0-beta.10",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -109,7 +109,7 @@ export default {
109
109
  default: false
110
110
  },
111
111
  humanLink: {
112
- type: String
112
+ type: Object
113
113
  },
114
114
  editedOutside: {
115
115
  type: Boolean,
@@ -122,12 +122,19 @@ export default {
122
122
  fieldKey: {
123
123
  type: [String, Number],
124
124
  default: '1'
125
+ },
126
+ alwaysSendFields: {
127
+ type: Array,
128
+ default: () => []
129
+ },
130
+ paramsToInclude: {
131
+ type: Object,
132
+ default: () => ({})
125
133
  }
126
134
  },
127
135
  data () {
128
136
  return {
129
137
  filters: {},
130
- editedInside: false,
131
138
  editedFields: []
132
139
  }
133
140
  },
@@ -135,6 +142,9 @@ export default {
135
142
  edited () {
136
143
  return this.editedInside || this.editedOutside
137
144
  },
145
+ editedInside () {
146
+ return this.editedFields.length > 0
147
+ },
138
148
  actionTitle () {
139
149
  let title = this.notFoundTitle
140
150
  if (this.count > 0) {
@@ -146,31 +156,41 @@ export default {
146
156
  },
147
157
  flatFilters () {
148
158
  let filters = {}
159
+ const fieldsToInclude = [...this.editedFields, ...this.alwaysSendFields]
149
160
  Object.keys(this.filters).forEach(name => {
150
- if (this.editedFields.includes(name)) {
161
+ if (fieldsToInclude.includes(name)) {
151
162
  const filtersValue = this.filters[name]
152
163
  const wrappedValue = getType(filtersValue) === 'Object' ? [filtersValue] : filtersValue
153
- filters[name] = wrappedValue.map(value => value._id && value._id.toString() || value)
164
+ filters[name] = wrappedValue.map(value => value._id || value)
154
165
  }
155
166
  })
156
167
  return filters
157
168
  }
158
169
  },
170
+ watch: {
171
+ fields: {
172
+ deep: true,
173
+ handler () {
174
+ this.setFilters(true)
175
+ }
176
+ },
177
+ paramsToInclude () {
178
+ this.setUrlParams()
179
+ }
180
+ },
159
181
  created () {
160
182
  this.setFilters()
161
183
  },
162
184
  methods: {
163
- setFilters (isReset, query) {
164
- let params = query || this.getUrlParams()
165
- let editedInside = false
166
-
185
+ setFilters (isUpdate) {
186
+ let params = this.getUrlParams()
167
187
  this.fields.forEach(field => {
168
188
  let value = field._type === 'range' ? field.value : []
169
189
  const valueNotArray = ['select', 'tab'].includes(field._type)
170
190
  if (valueNotArray) {
171
191
  [value] = field.value
172
192
  }
173
- if (params[field._name] && !isReset) {
193
+ if (params[field._name] && !isUpdate) {
174
194
  let paramsValue = params[field._name]
175
195
  if (field._type !== 'range') {
176
196
  value = field.data.reduce((acc, item) => {
@@ -184,9 +204,24 @@ export default {
184
204
  value = paramsValue
185
205
  }
186
206
  this.addEditedField(field._name)
187
- } else if ((!params[field._name] || isReset) && valueNotArray) {
207
+ } else if (params[field._name] && isUpdate && field._type !== 'range') {
208
+ if (valueNotArray) {
209
+ const isValueInData = field.data.some(dataValue => dataValue._id === value._id || dataValue._id === value)
210
+ if (!isValueInData) {
211
+ value = field.data[0]
212
+ }
213
+ } else {
214
+ value = field.value.reduce((acc, currentValue) => {
215
+ const isValueInData = field.data.some(dataValue => dataValue._id === currentValue._id || dataValue._id === currentValue)
216
+ if (isValueInData) {
217
+ acc.push(currentValue)
218
+ }
219
+ return acc
220
+ }, [])
221
+ }
222
+ } else if ((!params[field._name] || isUpdate) && valueNotArray) {
188
223
  [value] = field.value
189
- } else if (!params[field._name] || isReset) {
224
+ } else if (!params[field._name] || isUpdate) {
190
225
  value = field.value
191
226
  }
192
227
  // Detect changed fields
@@ -194,7 +229,7 @@ export default {
194
229
  switch (field._type) {
195
230
  case 'range':
196
231
  fieldIsEdited = field.data.map((dataValue, index) => field.value[index] === dataValue)
197
- .some(checkedValue => !checkedValue)
232
+ .some(checkedValue => !checkedValue)
198
233
  break
199
234
  case 'select':
200
235
  case 'tab':
@@ -202,29 +237,38 @@ export default {
202
237
  break
203
238
  case 'checkbox':
204
239
  fieldIsEdited = field.value.length > 0
205
- break
240
+ break
206
241
  }
207
242
  fieldIsEdited && this.addEditedField(field._name)
208
243
  this.$set(this.filters, field._name, value)
209
244
  })
210
- this.setUrlParams(isReset)
211
- this.editedInside = editedInside
212
- this.doAction()
245
+ this.setUrlParams(isUpdate)
246
+ !isUpdate && this.doAction(true)
213
247
  },
214
- resetFilters (isOutside) {
215
- this.$emit('reset-filters', isOutside)
216
- this.setFilters(true)
248
+ resetFilters () {
217
249
  this.editedFields = []
218
- this.editedInside = false
219
- this.doAction()
250
+ this.setUrlParams(true, {})
251
+ this.$emit('reset-filters', this.flatFilters)
220
252
  },
221
253
  addEditedField (name) {
222
254
  if (!this.editedFields.includes(name)) {
223
255
  this.editedFields.push(name)
224
256
  }
225
257
  },
226
- doAction () {
227
- this.immediate ? this.showResult() : this.requestCount()
258
+ removeDependentFieldsFromEdited (name) {
259
+ const field = this.fields.find(field => field._name === name)
260
+ if (field.reset) {
261
+ const dependentFields = this.fields.filter(field => !field.reset).map(field => field._name)
262
+ this.editedFields = this.editedFields.filter(fieldName => !dependentFields.includes(fieldName))
263
+ }
264
+ },
265
+ doAction (both = false) {
266
+ if (both) {
267
+ this.requestCount()
268
+ this.showResult()
269
+ } else {
270
+ this.immediate ? this.showResult() : this.requestCount()
271
+ }
228
272
  },
229
273
  requestCount () {
230
274
  this.$emit('request-count', this.flatFilters)
@@ -235,25 +279,12 @@ export default {
235
279
  getUrlParams () {
236
280
  return unserialize(window.location.search)
237
281
  },
238
- setUrlParams (reset) {
282
+ setUrlParams (isUpdate, rewriteParams) {
239
283
  if (this.showParams) {
240
- let params = this.getUrlParams()
241
- for (let name in this.filters) {
242
- let filterValue = this.filters[name]
243
- if (this.editedFields.includes(name)) {
244
- if (Array.isArray(filterValue) && filterValue.length > 0) {
245
- params[name] = filterValue.map(val => val._id || val)
246
- } else if (filterValue instanceof Object) {
247
- filterValue = { ...filterValue }
248
- params[name] = [filterValue._id]
249
- }
250
- } else {
251
- delete params[name]
252
- }
253
- }
284
+ const params = rewriteParams || { ...this.flatFilters, ...this.paramsToInclude }
254
285
  const currentParams = this.getUrlParams()
255
286
  const newParamsLength = Object.keys(params).length
256
- if (((newParamsLength && !equals(params, currentParams)) || reset) && !this.humanLink) {
287
+ if (((newParamsLength && !equals(params, currentParams)) || isUpdate || rewriteParams) && !this.humanLink) {
257
288
  let query = serialize(params)
258
289
  let url = window.location.origin + window.location.pathname + `${newParamsLength ? '?' : ''}${query}`
259
290
  history.replaceState({ state: url }, '', url)
@@ -262,7 +293,7 @@ export default {
262
293
  },
263
294
  handleFieldChange (name) {
264
295
  this.addEditedField(name)
265
- this.editedInside = true
296
+ this.removeDependentFieldsFromEdited(name)
266
297
  this.setUrlParams()
267
298
  this.doAction()
268
299
  }