inertia-bootstrap-forms 1.0.33 → 1.0.34

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": "inertia-bootstrap-forms",
3
- "version": "1.0.33",
3
+ "version": "1.0.34",
4
4
  "description": "Create bootstrap forms with inertia and twitter bootstrap",
5
5
  "main": "dist/inertia-bootstrap-forms.cjs.js",
6
6
  "module": "dist/inertia-bootstrap-forms.es.js",
@@ -30,6 +30,9 @@ export default {
30
30
  computed: {
31
31
  inputID() {
32
32
  return this.form.getID(this) + (this.value || '');
33
+ },
34
+ selectedValue(){
35
+ return (typeof this.modelValue == 'object') ? Object.values(this.modelValue) : (this.modelValue ? [this.modelValue] : null)
33
36
  }
34
37
  },
35
38
  setup(props) {
@@ -59,7 +62,7 @@ export default {
59
62
  }
60
63
  </script>
61
64
  <template>
62
- <label class="form-check-toggle" :class="{'form-check-toggle--active': (Array.isArray(modelValue) ? modelValue : [modelValue]).include(value)}" :for="inputID">
65
+ <label class="form-check-toggle" :class="{'form-check-toggle--active': (selectedValue || []).includes(value)}" :for="inputID">
63
66
  <input
64
67
  :name="name + (group ? '_' + group?.name + '-'+group?.groupID : '')"
65
68
  :id="inputID"
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import Editor from '@tinymce/tinymce-vue';
3
- import {inject} from "vue";
3
+ import {computed, inject} from "vue";
4
4
 
5
5
  export default {
6
6
  components: {Editor},
@@ -27,17 +27,28 @@ export default {
27
27
  },
28
28
  },
29
29
  setup(props) {
30
- let form = inject('form');
30
+ let form = inject('form', {
31
+ errors: {},
32
+ getID(name) {
33
+ return name;
34
+ }
35
+ });
36
+ let group = inject('group', {});
31
37
 
32
- if (form === undefined) {
33
- form = {
34
- errors: {},
35
- getID(name) {
36
- }
37
- };
38
+ const modelValue = computed({
39
+ get() {
40
+ return (group.value && form.value[group.value.name]) ? group.value?.getData(props.name) : form.value[props.name];
41
+ },
42
+ set(value) {
43
+ if (group?.value?.name) {
44
+ group.value.setData(props.name, value);
45
+ } else {
46
+ form.value[props.name] = value;
47
+ }
38
48
  }
49
+ });
39
50
 
40
- return {form};
51
+ return {modelValue, form, group};
41
52
  },
42
53
  emits: ['update:modelValue'],
43
54
  }
@@ -47,7 +58,7 @@ export default {
47
58
  <Editor
48
59
  api-key="tbws10u99swxhai03qolxykukvqw99jd4nw9q8z34aocvc4r"
49
60
  tinymce-script-src="/js/tinymce/tinymce.min.js"
50
- v-model="form[name]"
61
+ v-model="modelValue"
51
62
  :init="{
52
63
  base_url: '/js/tinymce/',
53
64
  disabled: false,
@@ -34,7 +34,11 @@ export default {
34
34
  setup(props) {
35
35
  const formEl = toRef('formEl');
36
36
  const formData = reactive(props.modelValue);
37
- const form = useForm(formData);
37
+ const form = useForm({
38
+ hasMessage: false,
39
+ successMessage: null,
40
+ ...formData
41
+ });
38
42
 
39
43
  form.getID = function (el) {
40
44
  if (typeof el === String) {
@@ -58,6 +62,8 @@ export default {
58
62
  isDirty,
59
63
  errors,
60
64
  hasErrors,
65
+ hasMessage,
66
+ successMessage,
61
67
  processing,
62
68
  progress,
63
69
  wasSuccessful,
@@ -101,7 +107,10 @@ export default {
101
107
  }).submit(this.method.toString(), this.url, {
102
108
  only: this.only,
103
109
  onStart: () => {
104
- this.$emit('onStart');
110
+ this.form.hasMessage = false;
111
+ this.form.successMessage = null;
112
+
113
+ this.$emit('onStart');
105
114
  this.form.clearErrors();
106
115
  },
107
116
  onFinish: (data) => {
@@ -111,6 +120,12 @@ export default {
111
120
  },
112
121
  onSuccess: (data) => {
113
122
  this.reset();
123
+
124
+ if(data?.props?.message){
125
+ this.form.hasMessage = true;
126
+ this.form.successMessage = data?.props?.message;
127
+ }
128
+
114
129
  this.$emit('onSuccess', data);
115
130
  }
116
131
  });
@@ -137,6 +152,9 @@ export default {
137
152
  </ul>
138
153
  </Alert>
139
154
  </slot>
155
+ <slot name="message" v-if="form.hasMessage" :form="form">
156
+ <Alert type="success" v-html="form.successMessage"></Alert>
157
+ </slot>
140
158
  <slot :form="form" :submit="submit"/>
141
159
  </form>
142
160
  </template>
@@ -44,6 +44,10 @@ export default {
44
44
  type: Boolean,
45
45
  default: false
46
46
  },
47
+ hideDropdown: {
48
+ type: Boolean,
49
+ default: false
50
+ },
47
51
  search: {
48
52
  type: Object,
49
53
  default: {
@@ -75,6 +79,15 @@ export default {
75
79
 
76
80
  return {modelValue, form, group};
77
81
  },
82
+ computed: {
83
+ selectedValue() {
84
+ if (!this.multiple) {
85
+ return this.modelValue;
86
+ }
87
+
88
+ return (typeof this.modelValue == 'object') ? Object.values(this.modelValue) : (this.modelValue ? [this.modelValue] : null)
89
+ }
90
+ },
78
91
  methods: {
79
92
  init() {
80
93
  this.choices = new Choices(this.$refs.input, {
@@ -179,7 +192,8 @@ export default {
179
192
  </script>
180
193
  <template>
181
194
  <div class="select2-controller" :class="{
182
- 'is-invalid': form.errors[name]
195
+ 'is-invalid': form.errors[name],
196
+ 'select2-dropdown-hidden': hideDropdown === true
183
197
  }">
184
198
  <select
185
199
  v-bind="$props"
@@ -192,7 +206,9 @@ export default {
192
206
  }"
193
207
  :placeholder="placeholder"
194
208
  ref="input">
195
- <option :value="item.id" v-for="(item, key) in options" :selected="modelValue === item.id">{{ item.name }}
209
+ <option
210
+ :value="(item.id || item)" v-for="(item, key) in options"
211
+ :selected="multiple ? (selectedValue || []).includes(item.id || item) : (item.id || item) === modelValue">{{ item.name || item }}
196
212
  </option>
197
213
  </select>
198
214
  </div>
@@ -84,7 +84,7 @@
84
84
  height: 0;
85
85
  width: 0;
86
86
  border-style: solid;
87
- border-color: #333 transparent transparent;
87
+ border-color: var(--bs-secondary-color, #333) transparent transparent;
88
88
  border-width: 5px;
89
89
  position: absolute;
90
90
  right: 11.5px;
@@ -94,7 +94,7 @@
94
94
  }
95
95
 
96
96
  .choices[data-type*=select-one].is-open::after {
97
- border-color: transparent transparent #333;
97
+ border-color: transparent transparent var(--bs-secondary-color, #333);
98
98
  margin-top: -7.5px
99
99
  }
100
100
 
@@ -137,7 +137,7 @@
137
137
  width: 100%;
138
138
  background-color: var(--bs-body-bg, #ffffff);
139
139
  padding: calc(.5rem - 4px) .75rem calc(.5rem - 4px) .75rem;
140
- border: 1px solid #ddd;
140
+ border: 1px solid var(--bs-border-color, #ddd);
141
141
  border-radius: var(--bs-border-radius);
142
142
  font-size: var(--bs-body-font-size);
143
143
  min-height: 44px;
@@ -148,15 +148,16 @@
148
148
  border-color: var(--bs-danger, #de0021);
149
149
  }
150
150
 
151
- .is-focused .choices__inner, .is-open .choices__inner {
151
+ .is-focused .choices__inner,
152
+ .is-open .choices__inner {
152
153
  border-color: #b7b7b7
153
154
  }
154
155
 
155
- .is-open .choices__inner {
156
+ .select2-controller:not(.select2-dropdown-hidden) .is-open .choices__inner {
156
157
  border-radius: var(--bs-border-radius) var(--bs-border-radius) 0 0
157
158
  }
158
159
 
159
- .is-flipped.is-open .choices__inner {
160
+ .select2-controller:not(.select2-dropdown-hidden) .is-flipped.is-open .choices__inner {
160
161
  border-radius: 0 0 var(--bs-border-radius) var(--bs-border-radius)
161
162
  }
162
163
 
@@ -195,8 +196,8 @@
195
196
  font-weight: 500;
196
197
  margin-right: 3.75px;
197
198
  margin-bottom: 3.75px;
198
- background-color: var(--bs-body-secondary, #999999);
199
- border: 1px solid var(--bs-body-secondary, #999999);
199
+ background-color: var(--bs-secondary-bg, #999999);
200
+ border: 1px solid var(--bs-secondary-bg, #999999);
200
201
  color: var(--bs-body-color, #ffffff);
201
202
  word-break: break-all;
202
203
  box-sizing: border-box
@@ -221,13 +222,17 @@
221
222
  border: 1px solid var(--bs-secondary, #003642)
222
223
  }
223
224
 
225
+ .select2-dropdown-hidden .choices__list--dropdown{
226
+ display: none !important;
227
+ }
228
+
224
229
  .choices__list--dropdown, .choices__list[aria-expanded] {
225
230
  display: none;
226
231
  z-index: 99999;
227
232
  position: absolute;
228
233
  width: 100%;
229
- background-color: var(--bs-secondary-bg, #ddd);
230
- border: 1px solid var(--bs-secondary-bg, #ddd);
234
+ background-color: var(--bs-body-bg, #ddd);
235
+ border: 1px solid var(--bs-body-bg, #ddd);
231
236
  top: 100%;
232
237
  margin-top: -1px;
233
238
  border-bottom-left-radius: var(--bs-border-radius);
@@ -295,7 +300,7 @@
295
300
  }
296
301
 
297
302
  .choices__list--dropdown .choices__item--selectable.is-highlighted, .choices__list[aria-expanded] .choices__item--selectable.is-highlighted {
298
- background-color: #f2f2f2
303
+ background-color: var(--bs-secondary-bg, #ddd)
299
304
  }
300
305
 
301
306
  .choices__list--dropdown .choices__item--selectable.is-highlighted::after, .choices__list[aria-expanded] .choices__item--selectable.is-highlighted::after {
@@ -348,7 +353,7 @@
348
353
  .choices__input {
349
354
  display: inline-block;
350
355
  vertical-align: baseline;
351
- background-color: #f9f9f9;
356
+ background-color: var(--bs-body-bg, #f7f7f7);
352
357
  font-size: var(--bs-body-font-size);
353
358
  border: 0;
354
359
  border-radius: 0;