@afeefa/vue-app 0.0.159 → 0.0.161

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- 0.0.159
1
+ 0.0.161
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@afeefa/vue-app",
3
- "version": "0.0.159",
3
+ "version": "0.0.161",
4
4
  "description": "",
5
5
  "author": "Afeefa Kollektiv <kollektiv@afeefa.de>",
6
6
  "license": "MIT",
@@ -47,6 +47,7 @@
47
47
 
48
48
  <template #row="{ model, on }">
49
49
  <v-icon
50
+ v-if="$has.icon"
50
51
  :color="model.getIcon().color"
51
52
  size="1.5rem"
52
53
  class="mr-2"
@@ -70,9 +71,11 @@ import { FormFieldMixin } from '../FormFieldMixin'
70
71
  import { ListAction } from '@a-vue/api-resources/ApiActions'
71
72
 
72
73
  @Component({
73
- props: ['value', 'q', 'listConfig']
74
+ props: ['value', 'q']
74
75
  })
75
76
  export default class FormFieldSearchSelect extends Mixins(FormFieldMixin) {
77
+ $hasOptions = ['icon']
78
+
76
79
  mounted () {
77
80
  if (this.validator) {
78
81
  this.$refs.input.validate()
@@ -4,7 +4,6 @@ import EditForm from './form/EditForm'
4
4
  import EditModal from './form/EditModal'
5
5
  import FormFieldCheckbox from './form/fields/FormFieldCheckbox'
6
6
  import FormFieldDate from './form/fields/FormFieldDate'
7
- import FormFieldTime from './form/fields/FormFieldTime'
8
7
  import FormFieldRadioGroup from './form/fields/FormFieldRadioGroup'
9
8
  import FormFieldRichTextArea from './form/fields/FormFieldRichTextArea'
10
9
  import FormFieldSearchSelect from './form/fields/FormFieldSearchSelect'
@@ -12,9 +11,11 @@ import FormFieldSelect from './form/fields/FormFieldSelect'
12
11
  import FormFieldSelect2 from './form/fields/FormFieldSelect2'
13
12
  import FormFieldText from './form/fields/FormFieldText'
14
13
  import FormFieldTextArea from './form/fields/FormFieldTextArea'
14
+ import FormFieldTime from './form/fields/FormFieldTime'
15
15
  import NestedEditForm from './form/NestedEditForm'
16
16
  import ListFilterPage from './list/filters/ListFilterPage'
17
17
  import ListFilterSearch from './list/filters/ListFilterSearch'
18
+ import ListFilterSearchSelect from './list/filters/ListFilterSearchSelect'
18
19
  import ListFilterSelect from './list/filters/ListFilterSelect'
19
20
 
20
21
  Vue.component('EditForm', EditForm)
@@ -33,3 +34,4 @@ Vue.component('FormFieldSelect2', FormFieldSelect2)
33
34
  Vue.component('ListFilterPage', ListFilterPage)
34
35
  Vue.component('ListFilterSearch', ListFilterSearch)
35
36
  Vue.component('ListFilterSelect', ListFilterSelect)
37
+ Vue.component('ListFilterSearchSelect', ListFilterSearchSelect)
@@ -0,0 +1,138 @@
1
+ <template>
2
+ <a-search-select
3
+ ref="select"
4
+ :listAction="listAction"
5
+ :selectedItems="selectedItems"
6
+ :getSearchInput="() => $refs.searchInput"
7
+ diffXControls="-.5rem"
8
+ diffYControls="-.5rem"
9
+ v-bind="$attrs"
10
+ @select="itemSelected"
11
+ @close="focusInput"
12
+ @beforeOpen="calculateSelectorSize"
13
+ >
14
+ <template #activator="{open}">
15
+ <a-text-field
16
+ ref="input"
17
+ :value="inputModel"
18
+ readonly
19
+ :label="label"
20
+ placeholder="Mausklick oder Space/↓-Taste zum Auswählen"
21
+ :clearable="!!selectedItems.length"
22
+ hide-details
23
+ @keydown.space.prevent="open"
24
+ @keydown.down.prevent="open"
25
+ @keydown.enter.prevent="open"
26
+ @clear="clear"
27
+ />
28
+ </template>
29
+
30
+ <template #filters="{onSearchInputKey}">
31
+ <a-row gap="4">
32
+ <list-filter-search
33
+ ref="searchInput"
34
+ :focus="true"
35
+ tabindex="1"
36
+ maxWidth="100%"
37
+ :label="'Suche ' + label"
38
+ v-on="onSearchInputKey"
39
+ />
40
+
41
+ <list-filter-page
42
+ :has="{page_size: false, page_number: true}"
43
+ :totalVisible="0"
44
+ />
45
+ </a-row>
46
+ </template>
47
+
48
+ <template #row="{ model, on }">
49
+ <v-icon
50
+ v-if="$has.icon"
51
+ :color="model.getIcon().color"
52
+ size="1.5rem"
53
+ class="mr-2"
54
+ v-on="on"
55
+ v-text="model.getIcon().icon"
56
+ />
57
+
58
+ <div
59
+ style="width:100%;"
60
+ v-on="on"
61
+ >
62
+ {{ model.getTitle() }}
63
+ </div>
64
+ </template>
65
+ </a-search-select>
66
+ </template>
67
+
68
+
69
+ <script>
70
+ import { Component, Mixins } from '@a-vue'
71
+ import { ListFilterMixin } from '../ListFilterMixin'
72
+ import { ListAction } from '@a-vue/api-resources/ApiActions'
73
+
74
+ @Component({
75
+ props: ['itemTitle', 'itemValue']
76
+ })
77
+ export default class ListFilterSearchSelect extends Mixins(ListFilterMixin) {
78
+ $hasOptions = ['icon']
79
+
80
+ items = []
81
+ inputModel = 'Alle'
82
+
83
+ async created () {
84
+ if (this.filter.value) {
85
+ const {models} = await this.createListAction()
86
+ .params({
87
+ [this.filter.name]: this.filter.value
88
+ })
89
+ .load()
90
+ if (models.length) {
91
+ this.inputModel = models[0].getTitle()
92
+ }
93
+ }
94
+ }
95
+
96
+ calculateSelectorSize () {
97
+ const input = this.$refs.input.$el
98
+ const inputWidth = input.offsetWidth
99
+ this.$refs.select.setWidth(`calc(${inputWidth}px + 1rem)`)
100
+ }
101
+
102
+ get selectedItems () {
103
+ return [this.filter.value].filter(a => a)
104
+ }
105
+
106
+ get listAction () {
107
+ return this.createListAction()
108
+ }
109
+
110
+ createListAction () {
111
+ const request = this.filter
112
+ .createOptionsRequest()
113
+ return ListAction.fromRequest(request)
114
+ }
115
+
116
+ itemSelected (model) {
117
+ if (model) {
118
+ this.filter.value = model.id
119
+ this.inputModel = model.getTitle()
120
+ } else {
121
+ this.filter.value = null
122
+ }
123
+ this.$emit('select', model)
124
+ }
125
+
126
+ focusInput () {
127
+ this.$refs.input.setFocus(true)
128
+ }
129
+
130
+ clear () {
131
+ this.itemSelected(null)
132
+
133
+ setTimeout(() => { // input clear sets internal model to ''
134
+ this.inputModel = 'Alle'
135
+ }, 100)
136
+ }
137
+ }
138
+ </script>
@@ -73,7 +73,12 @@ export default class SearchSelectList extends Mixins(ListViewMixin) {
73
73
  }
74
74
 
75
75
  isSelected (model) {
76
- return !!this.selectedItems.find(i => i.equals(model))
76
+ return !!this.selectedItems.find(i => {
77
+ if (i.equals) {
78
+ return i.equals(model)
79
+ }
80
+ return i === model // if list item is a string not a model e.g. in filters
81
+ })
77
82
  }
78
83
 
79
84
  _filtersInitialized () {
@@ -15,7 +15,7 @@ import { modelCountService } from './ModelCountService'
15
15
  import { SaveEvent } from '@a-vue/events'
16
16
 
17
17
  @Component({
18
- props: ['action', 'field']
18
+ props: ['action', 'field', 'count']
19
19
  })
20
20
  export default class ModelCount extends Vue {
21
21
  countRequest = null
@@ -24,8 +24,12 @@ export default class ModelCount extends Vue {
24
24
  created () {
25
25
  this.$events.on(SaveEvent.STOP_SAVING, this.loadCount)
26
26
 
27
- this.countRequest = modelCountService.addAction(this.action)
28
- this.loadCount()
27
+ if (this.count) {
28
+ this.content = this.count
29
+ } else {
30
+ this.countRequest = modelCountService.addAction(this.action)
31
+ this.loadCount()
32
+ }
29
33
  }
30
34
 
31
35
  loadCount () {