vue-laravel-crud 1.8.0 → 1.8.1
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 +1 -1
- package/src/vue-laravel-crud.vue +138 -101
package/package.json
CHANGED
package/src/vue-laravel-crud.vue
CHANGED
|
@@ -18,7 +18,7 @@ export default /*#__PURE__*/ {
|
|
|
18
18
|
data() {
|
|
19
19
|
return {
|
|
20
20
|
|
|
21
|
-
crudUuid:"",
|
|
21
|
+
crudUuid: "",
|
|
22
22
|
moment: moment,
|
|
23
23
|
loading: false,
|
|
24
24
|
firstLoad: false,
|
|
@@ -387,7 +387,7 @@ export default /*#__PURE__*/ {
|
|
|
387
387
|
|
|
388
388
|
mounted() {
|
|
389
389
|
const now = Math.floor(Date.now() / 1000);
|
|
390
|
-
this.crudUuid = ''+now;
|
|
390
|
+
this.crudUuid = '' + now;
|
|
391
391
|
this.isMobile = window.matchMedia("(max-width: 1024px)").matches;
|
|
392
392
|
|
|
393
393
|
// Agregar un oyente de eventos para actualizar isMobile cuando cambia el tamaño de la pantalla
|
|
@@ -411,12 +411,12 @@ export default /*#__PURE__*/ {
|
|
|
411
411
|
if (fieldName === primaryKey) {
|
|
412
412
|
continue; // Salta este campo
|
|
413
413
|
}
|
|
414
|
-
|
|
415
|
-
console.debug("debug field",field);
|
|
414
|
+
|
|
415
|
+
console.debug("debug field", field);
|
|
416
416
|
|
|
417
417
|
if (field.type === 'relation') {
|
|
418
418
|
// Si es una relación, inicializa como un objeto vacío.
|
|
419
|
-
console.debug("Relation",field);
|
|
419
|
+
console.debug("Relation", field);
|
|
420
420
|
|
|
421
421
|
if (this.vuexInitRelations == true || (Array.isArray(this.vuexInitRelations) && this.vuexInitRelations.includes(fieldName))) {
|
|
422
422
|
itemDefault[fieldName] = {};
|
|
@@ -425,35 +425,35 @@ export default /*#__PURE__*/ {
|
|
|
425
425
|
} else {
|
|
426
426
|
|
|
427
427
|
|
|
428
|
-
|
|
428
|
+
console.debug("Field", field);
|
|
429
429
|
|
|
430
430
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
431
|
+
// Si no tiene un valor por defecto definido, inicializa según su tipo
|
|
432
|
+
/*switch (field.constructor.name) {
|
|
433
|
+
case 'StringField':
|
|
434
|
+
itemDefault[fieldName] = '';
|
|
435
|
+
break;
|
|
436
|
+
case 'NumberField':
|
|
437
|
+
itemDefault[fieldName] = 0;
|
|
438
|
+
break;
|
|
439
|
+
// Agrega más casos según los tipos de campos que uses en tu modelo
|
|
440
|
+
default:
|
|
441
441
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
442
|
+
console.debug("Undefined constructor ",fieldName,field.constructor.name);
|
|
443
|
+
// Tipo de campo no reconocido, puedes manejarlo de acuerdo a tus necesidades
|
|
444
|
+
itemDefault[fieldName] = null;
|
|
445
|
+
}*/
|
|
446
446
|
|
|
447
447
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
448
|
+
if (typeof field.value === 'function') {
|
|
449
|
+
itemDefault[fieldName] = field.value();
|
|
450
|
+
} else if (field.value) {
|
|
451
|
+
itemDefault[fieldName] = field.value;
|
|
452
|
+
} else {
|
|
453
|
+
itemDefault[fieldName] = null;
|
|
454
|
+
}
|
|
455
|
+
|
|
455
456
|
|
|
456
|
-
|
|
457
457
|
}
|
|
458
458
|
}
|
|
459
459
|
|
|
@@ -761,23 +761,23 @@ export default /*#__PURE__*/ {
|
|
|
761
761
|
},
|
|
762
762
|
|
|
763
763
|
updateData(data, allowCreate = true) {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
764
|
+
// Convertir this.items a un mapa para acceso rápido por id
|
|
765
|
+
const itemsMap = new Map(this.items.map(item => [item.id, item]));
|
|
766
|
+
|
|
767
|
+
// Recorrer cada elemento de data
|
|
768
|
+
data.forEach(newItem => {
|
|
769
|
+
if (itemsMap.has(newItem.id)) {
|
|
770
|
+
// Actualizar el item existente
|
|
771
|
+
const existingItem = itemsMap.get(newItem.id);
|
|
772
|
+
Object.assign(existingItem, newItem);
|
|
773
|
+
} else if (allowCreate) {
|
|
774
|
+
// Agregar el nuevo item si allowCreate es true
|
|
775
|
+
this.items.push(newItem);
|
|
776
|
+
}
|
|
777
|
+
});
|
|
778
778
|
|
|
779
|
-
|
|
780
|
-
|
|
779
|
+
// Convertir el mapa de vuelta a un array, si es necesario
|
|
780
|
+
this.items = Array.from(itemsMap.values());
|
|
781
781
|
},
|
|
782
782
|
showItem(id, itemIndex = null) {
|
|
783
783
|
if (itemIndex == null) {
|
|
@@ -818,7 +818,7 @@ export default /*#__PURE__*/ {
|
|
|
818
818
|
|
|
819
819
|
refresh() {
|
|
820
820
|
this.$emit("refresh", {});
|
|
821
|
-
|
|
821
|
+
|
|
822
822
|
if (this.infiniteScroll) {
|
|
823
823
|
this.pagination.current_page = 1;
|
|
824
824
|
this.infiniteScrollKey++;
|
|
@@ -882,7 +882,7 @@ export default /*#__PURE__*/ {
|
|
|
882
882
|
this.loading = false;
|
|
883
883
|
this.firstLoad = true;
|
|
884
884
|
},
|
|
885
|
-
fetchItemsLocal(){
|
|
885
|
+
fetchItemsLocal() {
|
|
886
886
|
if (this.grouped) {
|
|
887
887
|
this.groupItems(this.models);
|
|
888
888
|
} else {
|
|
@@ -894,8 +894,8 @@ export default /*#__PURE__*/ {
|
|
|
894
894
|
|
|
895
895
|
},
|
|
896
896
|
fetchItems(page = 1, concat = false) {
|
|
897
|
-
|
|
898
|
-
|
|
897
|
+
|
|
898
|
+
|
|
899
899
|
this.$emit("beforeFetch", {});
|
|
900
900
|
if (this.useVuexORM) {
|
|
901
901
|
return this.fetchItemsVuex(page, concat);
|
|
@@ -903,7 +903,7 @@ export default /*#__PURE__*/ {
|
|
|
903
903
|
|
|
904
904
|
|
|
905
905
|
if (!this.ajax) {
|
|
906
|
-
return this.fetchItemsLocal(page,concat);
|
|
906
|
+
return this.fetchItemsLocal(page, concat);
|
|
907
907
|
}
|
|
908
908
|
|
|
909
909
|
this.loading = true;
|
|
@@ -1058,8 +1058,8 @@ export default /*#__PURE__*/ {
|
|
|
1058
1058
|
await this.model.$delete(ids);
|
|
1059
1059
|
|
|
1060
1060
|
} else {
|
|
1061
|
-
let result = await this.model.api().delete(this.apiUrl + "/" + this.modelName+'/bulk-destroy'
|
|
1062
|
-
params: { ids: ids},
|
|
1061
|
+
let result = await this.model.api().delete(this.apiUrl + "/" + this.modelName + '/bulk-destroy', {
|
|
1062
|
+
params: { ids: ids },
|
|
1063
1063
|
delete: ids
|
|
1064
1064
|
});
|
|
1065
1065
|
|
|
@@ -1072,7 +1072,7 @@ export default /*#__PURE__*/ {
|
|
|
1072
1072
|
return;
|
|
1073
1073
|
}
|
|
1074
1074
|
}
|
|
1075
|
-
|
|
1075
|
+
|
|
1076
1076
|
this.toastSuccess("Elemento eliminados.");
|
|
1077
1077
|
},
|
|
1078
1078
|
deleteItem(id, index) {
|
|
@@ -1132,7 +1132,7 @@ export default /*#__PURE__*/ {
|
|
|
1132
1132
|
await this.model.$delete(id);
|
|
1133
1133
|
|
|
1134
1134
|
} else {
|
|
1135
|
-
let result = await this.model.api().delete(this.apiUrl + "/" + this.modelName+'/' + id, {
|
|
1135
|
+
let result = await this.model.api().delete(this.apiUrl + "/" + this.modelName + '/' + id, {
|
|
1136
1136
|
delete: 1
|
|
1137
1137
|
});
|
|
1138
1138
|
|
|
@@ -1179,7 +1179,7 @@ export default /*#__PURE__*/ {
|
|
|
1179
1179
|
}
|
|
1180
1180
|
},
|
|
1181
1181
|
|
|
1182
|
-
showExportModal(){
|
|
1182
|
+
showExportModal() {
|
|
1183
1183
|
this.$refs["modal-export"].show();
|
|
1184
1184
|
},
|
|
1185
1185
|
|
|
@@ -1216,7 +1216,7 @@ export default /*#__PURE__*/ {
|
|
|
1216
1216
|
},
|
|
1217
1217
|
|
|
1218
1218
|
|
|
1219
|
-
showImportModal(){
|
|
1219
|
+
showImportModal() {
|
|
1220
1220
|
this.$refs["modal-import"].show();
|
|
1221
1221
|
},
|
|
1222
1222
|
importItems() {
|
|
@@ -1295,19 +1295,19 @@ export default /*#__PURE__*/ {
|
|
|
1295
1295
|
|
|
1296
1296
|
if (this.vuexLocalforage) {
|
|
1297
1297
|
|
|
1298
|
-
if(this.markDirty){
|
|
1298
|
+
if (this.markDirty) {
|
|
1299
1299
|
this.item.dirty = true;
|
|
1300
1300
|
}
|
|
1301
1301
|
|
|
1302
1302
|
if (this.item.id) {
|
|
1303
|
-
|
|
1304
|
-
result = await this.model.$create({ data:this.item});
|
|
1305
|
-
console.debug("save item 4", this.item,result);
|
|
1303
|
+
|
|
1304
|
+
result = await this.model.$create({ data: this.item });
|
|
1305
|
+
console.debug("save item 4", this.item, result);
|
|
1306
1306
|
create = false;
|
|
1307
1307
|
} else {
|
|
1308
1308
|
|
|
1309
|
-
result = await this.model.$create({ data:this.item});
|
|
1310
|
-
console.debug("save item 5", this.item,result);
|
|
1309
|
+
result = await this.model.$create({ data: this.item });
|
|
1310
|
+
console.debug("save item 5", this.item, result);
|
|
1311
1311
|
create = true;
|
|
1312
1312
|
}
|
|
1313
1313
|
|
|
@@ -1316,7 +1316,7 @@ export default /*#__PURE__*/ {
|
|
|
1316
1316
|
let jsondata = this.item.$toJson();
|
|
1317
1317
|
console.debug("save item 2", this.item, jsondata);
|
|
1318
1318
|
if (this.item.id) {
|
|
1319
|
-
result = await this.model.api().put(this.apiUrl + "/" + this.modelName+'/' + this.item.id, jsondata);
|
|
1319
|
+
result = await this.model.api().put(this.apiUrl + "/" + this.modelName + '/' + this.item.id, jsondata);
|
|
1320
1320
|
create = false;
|
|
1321
1321
|
} else {
|
|
1322
1322
|
result = await this.model.api().post(this.apiUrl + "/" + this.modelName, jsondata);
|
|
@@ -1878,7 +1878,6 @@ export default /*#__PURE__*/ {
|
|
|
1878
1878
|
<span>{{ item.crudgrouplabel }}</span>
|
|
1879
1879
|
</th>
|
|
1880
1880
|
|
|
1881
|
-
|
|
1882
1881
|
<slot name="row" v-bind:item="item" v-else>
|
|
1883
1882
|
<td v-for="(column, indexc) in columns" :key="indexc" :scope="column.prop == 'id' ? 'row' : ''">
|
|
1884
1883
|
<slot :name="'cell-' + column.prop" v-bind:item="item" v-bind:index="index" v-bind:itemindex="index"
|
|
@@ -1952,7 +1951,7 @@ export default /*#__PURE__*/ {
|
|
|
1952
1951
|
</p>
|
|
1953
1952
|
</div>
|
|
1954
1953
|
|
|
1955
|
-
<div v-if="displayMode == displayModes.MODE_CARDS">
|
|
1954
|
+
<div v-else-if="displayMode == displayModes.MODE_CARDS">
|
|
1956
1955
|
<draggable v-model="items" :group="draggableGroup" :draggable="orderable ? '.item' : '.none'" @start="drag = true"
|
|
1957
1956
|
@end="drag = false" @sort="onSort()" @add="onDraggableAdded($event)" @change="onDraggableChange($event)"
|
|
1958
1957
|
:options="draggableOptions">
|
|
@@ -1960,23 +1959,12 @@ export default /*#__PURE__*/ {
|
|
|
1960
1959
|
:cols="{ default: 12 / colLg, 1400: 12 / colXl, 1200: 12 / colLg, 1000: 12 / colMd, 700: 12 / colSm, 400: 12 / colXs }"
|
|
1961
1960
|
:gutter="{ default: '15px', 700: '15px' }">
|
|
1962
1961
|
<div v-for="(item, index) in itemsList" v-bind:key="index" class="item">
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
:index="index"
|
|
1970
|
-
:cardClass="cardClass"
|
|
1971
|
-
:cardHideFooter="cardHideFooter"
|
|
1972
|
-
:itemValue="itemValue"
|
|
1973
|
-
:getStateValue="getStateValue"
|
|
1974
|
-
:getArrayValue="getArrayValue"
|
|
1975
|
-
:showItem="showItem"
|
|
1976
|
-
:updateItem="updateItem"
|
|
1977
|
-
:removeItem="removeItem"
|
|
1978
|
-
/>
|
|
1979
|
-
</slot>
|
|
1962
|
+
<slot name="card" v-bind:item="item">
|
|
1963
|
+
<ItemCard v-for="(item, index) in itemsList" :key="index" :item="item" :columns="columns" :index="index"
|
|
1964
|
+
:cardClass="cardClass" :cardHideFooter="cardHideFooter" :itemValue="itemValue"
|
|
1965
|
+
:getStateValue="getStateValue" :getArrayValue="getArrayValue" :showItem="showItem"
|
|
1966
|
+
:updateItem="updateItem" :removeItem="removeItem" />
|
|
1967
|
+
</slot>
|
|
1980
1968
|
</div>
|
|
1981
1969
|
</masonry>
|
|
1982
1970
|
</draggable>
|
|
@@ -1987,29 +1975,35 @@ export default /*#__PURE__*/ {
|
|
|
1987
1975
|
|
|
1988
1976
|
</div>
|
|
1989
1977
|
|
|
1990
|
-
<div v-if="displayMode == displayModes.MODE_KANBAN">
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
:
|
|
2007
|
-
|
|
2008
|
-
|
|
1978
|
+
<div v-else-if="displayMode == displayModes.MODE_KANBAN">
|
|
1979
|
+
|
|
1980
|
+
|
|
1981
|
+
<div v-for="(column, colIndex) in items" :key="colIndex" class="kanban-column">
|
|
1982
|
+
<div class="kanban-column-header">
|
|
1983
|
+
{{ colIndex }}
|
|
1984
|
+
</div>
|
|
1985
|
+
|
|
1986
|
+
{{ JSON.stringify(column) }}
|
|
1987
|
+
|
|
1988
|
+
|
|
1989
|
+
<draggable v-model="column.items" group="kanban" class="kanban-column-body" @end="onDragEnd">
|
|
1990
|
+
|
|
1991
|
+
<div v-for="(item, index) in itemsList" v-bind:key="index" class="item">
|
|
1992
|
+
<slot name="card" v-bind:item="item">
|
|
1993
|
+
<ItemCard v-for="(item, index) in itemsList" :key="index" :item="item" :columns="columns" :index="index"
|
|
1994
|
+
:cardClass="cardClass" :cardHideFooter="cardHideFooter" :itemValue="itemValue"
|
|
1995
|
+
:getStateValue="getStateValue" :getArrayValue="getArrayValue" :showItem="showItem"
|
|
1996
|
+
:updateItem="updateItem" :removeItem="removeItem" />
|
|
1997
|
+
</slot>
|
|
1998
|
+
</div>
|
|
1999
|
+
|
|
2000
|
+
</draggable>
|
|
2001
|
+
|
|
2009
2002
|
</div>
|
|
2003
|
+
|
|
2010
2004
|
</div>
|
|
2011
2005
|
|
|
2012
|
-
<div v-if="displayMode == displayModes.MODE_CUSTOM">
|
|
2006
|
+
<div v-else-if="displayMode == displayModes.MODE_CUSTOM">
|
|
2013
2007
|
<div :class="listContainerClass">
|
|
2014
2008
|
<p v-if="!loading && items && items.length == 0 && !infiniteScroll" class="p-3">
|
|
2015
2009
|
{{ messageEmptyResults }}
|
|
@@ -2193,4 +2187,47 @@ tr td:first-child {
|
|
|
2193
2187
|
}
|
|
2194
2188
|
}
|
|
2195
2189
|
}
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
.kanban-board {
|
|
2193
|
+
display: flex;
|
|
2194
|
+
gap: 1rem;
|
|
2195
|
+
overflow-x: auto;
|
|
2196
|
+
padding: 1rem;
|
|
2197
|
+
}
|
|
2198
|
+
|
|
2199
|
+
.kanban-column {
|
|
2200
|
+
background: #f4f5f7;
|
|
2201
|
+
border-radius: 8px;
|
|
2202
|
+
width: 300px;
|
|
2203
|
+
display: flex;
|
|
2204
|
+
flex-direction: column;
|
|
2205
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
2206
|
+
}
|
|
2207
|
+
|
|
2208
|
+
.kanban-column-header {
|
|
2209
|
+
font-weight: bold;
|
|
2210
|
+
padding: 0.5rem;
|
|
2211
|
+
background: #dfe1e6;
|
|
2212
|
+
border-radius: 8px 8px 0 0;
|
|
2213
|
+
text-align: center;
|
|
2214
|
+
}
|
|
2215
|
+
|
|
2216
|
+
.kanban-column-body {
|
|
2217
|
+
padding: 0.5rem;
|
|
2218
|
+
min-height: 100px;
|
|
2219
|
+
background: #ffffff;
|
|
2220
|
+
border-radius: 0 0 8px 8px;
|
|
2221
|
+
display: flex;
|
|
2222
|
+
flex-direction: column;
|
|
2223
|
+
gap: 0.5rem;
|
|
2224
|
+
}
|
|
2225
|
+
|
|
2226
|
+
.kanban-card {
|
|
2227
|
+
background: #ffffff;
|
|
2228
|
+
border-radius: 4px;
|
|
2229
|
+
padding: 1rem;
|
|
2230
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
2231
|
+
cursor: grab;
|
|
2232
|
+
}
|
|
2196
2233
|
</style>
|