atom-nuxt 1.4.2 → 1.4.4

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/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@atomengine/atom-nuxt",
3
3
  "configKey": "atomNuxt",
4
- "version": "1.4.2",
4
+ "version": "1.4.4",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.1",
7
7
  "unbuild": "3.5.0"
@@ -246,6 +246,7 @@ const dialogOpen = computed({
246
246
  });
247
247
  const page = computed(() => props.loaderKey ? parseQuery(route.query[props.loaderKey])?.page ?? 1 : route.query.page ?? 1);
248
248
  const filterValues = props.loaderKey ? ref({ ...props.customFilters, ...parseQuery(route.query[props.loaderKey]) }) : ref({ ...props.customFilters, ...route.query });
249
+ const isInitialLoad = ref(true);
249
250
  const onQueryChange = (page2) => {
250
251
  console.error("QUERY CHANGED");
251
252
  const newQuery = {};
@@ -289,6 +290,11 @@ watch(() => filterValues, () => {
289
290
  console.error("ROUTE CHANGED");
290
291
  debouncedGet();
291
292
  }, { deep: true });
293
+ watch(listPending, (isPending) => {
294
+ if (!isPending && isInitialLoad.value) {
295
+ isInitialLoad.value = false;
296
+ }
297
+ });
292
298
  const debouncedGet = useDebounceFn(() => {
293
299
  console.error("DEBOUNCED GET");
294
300
  getItems(Number.parseInt(page.value) ?? null, null, filterValues.value);
@@ -336,9 +342,46 @@ const createForm = () => {
336
342
  }
337
343
  router.push(newQuery);
338
344
  };
345
+ function deepCloneWithFiles(obj, seen = /* @__PURE__ */ new WeakMap()) {
346
+ if (obj === null || typeof obj !== "object") {
347
+ return obj;
348
+ }
349
+ if (seen.has(obj)) {
350
+ return seen.get(obj);
351
+ }
352
+ if (obj instanceof File || obj instanceof Blob) {
353
+ return obj;
354
+ }
355
+ if (obj instanceof Date) {
356
+ return new Date(obj.getTime());
357
+ }
358
+ if (obj instanceof RegExp) {
359
+ return new RegExp(obj.source, obj.flags);
360
+ }
361
+ if (Array.isArray(obj)) {
362
+ const arrCopy = [];
363
+ seen.set(obj, arrCopy);
364
+ for (let i = 0; i < obj.length; i++) {
365
+ arrCopy[i] = deepCloneWithFiles(obj[i], seen);
366
+ }
367
+ return arrCopy;
368
+ }
369
+ const objCopy = {};
370
+ seen.set(obj, objCopy);
371
+ for (const key in obj) {
372
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
373
+ const value = obj[key];
374
+ if (typeof value === "function") {
375
+ continue;
376
+ }
377
+ objCopy[key] = deepCloneWithFiles(value, seen);
378
+ }
379
+ }
380
+ return objCopy;
381
+ }
339
382
  const saveAction = async () => {
340
383
  formPending.value = true;
341
- let itemToSave = structuredClone(toRaw(item.value));
384
+ let itemToSave = deepCloneWithFiles(toRaw(item.value));
342
385
  if (props.beforeSave != null) {
343
386
  itemToSave = await props.beforeSave(itemToSave);
344
387
  }
@@ -429,43 +472,59 @@ const exportAction = async () => {
429
472
  <div :class="contentClasses">
430
473
  <v-progress-linear :active="listPending" indeterminate color="primary"></v-progress-linear>
431
474
  <v-row>
432
- <v-col v-if="!hideFilters && filters.length > 0" cols="12" md="3">
475
+ <v-col v-if="!hideFilters && (filters.length > 0 || isInitialLoad)" cols="12" md="3">
433
476
  <div>
434
- <slot name="filtersTitle">
435
- <h3 v-if="filtersTitle" class="mb-2">{{ filtersTitle }}</h3>
436
- </slot>
437
- <slot name="filters" :filters="filters">
438
- <div :class="filterClasses">
439
- <crud-filter-list v-model="filterValues" :filters="filters"></crud-filter-list>
440
- </div>
441
- </slot>
477
+ <div v-if="isInitialLoad">
478
+ <v-skeleton-loader
479
+ type="heading, list-item, list-item, list-item"
480
+ class="mb-3"
481
+ ></v-skeleton-loader>
482
+ </div>
483
+ <template v-else>
484
+ <slot name="filtersTitle">
485
+ <h3 v-if="filtersTitle" class="mb-2">{{ filtersTitle }}</h3>
486
+ </slot>
487
+ <slot name="filters" :filters="filters">
488
+ <div :class="filterClasses">
489
+ <crud-filter-list v-model="filterValues" :filters="filters"></crud-filter-list>
490
+ </div>
491
+ </slot>
492
+ </template>
442
493
  </div>
443
494
  </v-col>
444
- <v-col cols="12" :md="hideFilters || filters.length === 0 ? '12' : '9'">
495
+ <v-col cols="12" :md="hideFilters || (filters.length === 0 && !isInitialLoad) ? '12' : '9'">
445
496
  <div class="">
446
- <slot name="resultsTitle">
447
- <h3 v-if="resultsTitle" class="mb-2">{{ resultsTitle }}</h3>
448
- </slot>
449
- <slot v-if="!listPending && totalItems === 0 && !hasListErrors" name="empty" :create-action="createForm">
450
- <v-alert icon="mdi-playlist-remove" type="info" class="pa-5">
451
- {{ noResultsText }}
452
- </v-alert>
453
- </slot>
454
- <slot v-if="hasListErrors" name="error" :errors="listErrors">
455
- <crud-error-display :errors="listErrors"></crud-error-display>
456
- </slot>
457
- <div :class="resultClasses">
458
- <slot
459
- v-if="totalItems > 0"
460
- :items="items"
461
- :pending="listPending"
462
- :update-action="updateForm"
463
- :view-action="viewForm"
464
- :delete-action="deleteForm"
465
- :form-pending="formPending"
466
- >
467
- </slot>
497
+ <div v-if="isInitialLoad">
498
+ <v-skeleton-loader
499
+ type="heading, card, card, card"
500
+ class="mb-3"
501
+ ></v-skeleton-loader>
468
502
  </div>
503
+ <template v-else>
504
+ <slot name="resultsTitle">
505
+ <h3 v-if="resultsTitle" class="mb-2">{{ resultsTitle }}</h3>
506
+ </slot>
507
+ <slot v-if="!listPending && totalItems === 0 && !hasListErrors" name="empty" :create-action="createForm">
508
+ <v-alert icon="mdi-playlist-remove" type="info" class="pa-5">
509
+ {{ noResultsText }}
510
+ </v-alert>
511
+ </slot>
512
+ <slot v-if="hasListErrors" name="error" :errors="listErrors">
513
+ <crud-error-display :errors="listErrors"></crud-error-display>
514
+ </slot>
515
+ <div :class="resultClasses">
516
+ <slot
517
+ v-if="totalItems > 0"
518
+ :items="items"
519
+ :pending="listPending"
520
+ :update-action="updateForm"
521
+ :view-action="viewForm"
522
+ :delete-action="deleteForm"
523
+ :form-pending="formPending"
524
+ >
525
+ </slot>
526
+ </div>
527
+ </template>
469
528
  </div>
470
529
  <div v-if="totalItems > 0 && totalPages > 1" class="pa-3">
471
530
  <span class="d-none d-md-block pa-3">Page {{ currentPage }} of {{ totalPages }} pages with {{ totalItems }} items</span>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom-nuxt",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "My new Nuxt module",
5
5
  "repository": "atomengine/atom-nuxt",
6
6
  "license": "MIT",