Skip to content

Commit b1a4cfc

Browse files
authored
Merge pull request #1 from angular-experts-io/refine/todo-skeleton-visuals
Refine/todo skeleton visuals
2 parents 41115f9 + af3a91c commit b1a4cfc

File tree

2 files changed

+56
-17
lines changed

2 files changed

+56
-17
lines changed
Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
1-
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
1+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; // Removed inject
2+
import { CommonModule } from '@angular/common';
23
import { MatFormField, MatInput } from '@angular/material/input';
4+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
35

4-
import { restResource } from '@angular-experts/resource';
5-
6+
import { restResource } from '@angular-experts/resource'; // Added back
67
import { Todo } from '../../../model/todo.model';
78
import { TodoItemComponent } from '../../../ui/todo-item/todo-item.component';
89
import { TodoSkeletonComponent } from '../../../ui/todo-skeleton/todo-skeleton.component';
910

1011
@Component({
1112
selector: 'showcase-basic',
12-
imports: [MatInput, MatFormField, TodoItemComponent, TodoSkeletonComponent],
13+
imports: [
14+
CommonModule,
15+
MatInput,
16+
MatFormField,
17+
TodoItemComponent,
18+
TodoSkeletonComponent,
19+
MatProgressSpinnerModule,
20+
],
1321
template: `
1422
<h2>Basic</h2>
1523
<div class="mt-8 flex flex-col gap-8">
@@ -24,22 +32,32 @@ import { TodoSkeletonComponent } from '../../../ui/todo-skeleton/todo-skeleton.c
2432
[value]="newTodo()"
2533
(input)="newTodo.set(todoDescriptionInputRef.value)"
2634
(keyup.enter)="createTodo()"
35+
[disabled]="todos.loading()"
2736
/>
2837
</mat-form-field>
2938
30-
<div class="flex flex-col gap-4">
39+
<div class="relative flex flex-col gap-4">
40+
<!-- Spinner for non-initial loads -->
41+
@if (todos.loading() && !todos.loadingInitial()) {
42+
<div class="absolute inset-0 flex items-center justify-center bg-white bg-opacity-50 z-10">
43+
<mat-progress-spinner diameter="24" mode="indeterminate"></mat-progress-spinner>
44+
</div>
45+
}
46+
3147
@if (todos.loadingInitial()) {
3248
<showcase-todo-skeleton [repeat]="4" />
3349
} @else {
3450
@for (todo of todos.values(); track todo.id) {
3551
<showcase-todo-item
36-
[disabled]="todos.loading()"
52+
[disabled]="todos.loading() && !todos.loadingInitial()"
3753
[todo]="todo"
3854
(toggle)="handleToggle(todo)"
3955
(remove)="handleRemove(todo)"
4056
/>
4157
} @empty {
42-
<span>No todos found, create some...</span>
58+
@if (!todos.loadingInitial()) {
59+
<span>No todos found, create some...</span>
60+
}
4361
}
4462
}
4563
</div>
@@ -54,27 +72,26 @@ import { TodoSkeletonComponent } from '../../../ui/todo-skeleton/todo-skeleton.c
5472
changeDetection: ChangeDetectionStrategy.OnPush,
5573
})
5674
export class BasicComponent {
57-
todos = restResource<Todo, string>('todos', {
75+
todos = restResource<Todo, string>('todos', { // Added back local restResource
5876
create: {
5977
strategy: 'incremental'
6078
}
6179
});
62-
6380
newTodo = signal('');
6481

6582
createTodo() {
66-
const newTodo = this.newTodo();
67-
if (newTodo.length > 0) {
68-
this.todos.create({ description: newTodo, completed: false });
83+
const newTodoValue = this.newTodo();
84+
if (newTodoValue.length > 0) {
85+
this.todos.create({ description: newTodoValue, completed: false }); // Changed to todos.create
6986
}
7087
this.newTodo.set('');
7188
}
7289

7390
handleToggle(todo: Todo) {
74-
this.todos.update({ ...todo, completed: !todo.completed });
91+
this.todos.update({ ...todo, completed: !todo.completed }); // Changed to todos.update
7592
}
7693

7794
handleRemove(todo: Todo) {
78-
this.todos.remove(todo);
95+
this.todos.remove(todo); // Changed to todos.remove
7996
}
8097
}

projects/showcase/src/app/ui/todo-skeleton/todo-skeleton.component.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,39 @@ import {
22
ChangeDetectionStrategy,
33
Component,
44
input,
5-
Input,
65
} from '@angular/core';
6+
import { CommonModule } from '@angular/common';
7+
import { MatCardModule } from '@angular/material/card';
78

89
@Component({
910
selector: 'showcase-todo-skeleton',
10-
imports: [],
11-
template: ` <p>todo-skeleton works!</p> `,
11+
imports: [CommonModule, MatCardModule],
12+
template: `
13+
@for (_ of [].constructor(repeat()); track $index) {
14+
<mat-card class="mb-4 p-4">
15+
<div class="animate-pulse flex items-center justify-between w-full">
16+
<!-- Left part: Placeholder for checkbox/icon and description -->
17+
<div class="flex items-center gap-3 w-full">
18+
<!-- Checkbox placeholder -->
19+
<div class="h-6 w-6 bg-gray-300 rounded"></div>
20+
<!-- Description placeholder -->
21+
<div class="h-4 bg-gray-300 rounded w-3/4"></div>
22+
</div>
23+
<!-- Right part: Placeholders for two icon buttons -->
24+
<div class="flex items-center gap-2">
25+
<div class="h-8 w-8 bg-gray-300 rounded-full"></div> <!-- Placeholder for edit icon button -->
26+
<div class="h-8 w-8 bg-gray-300 rounded-full"></div> <!-- Placeholder for delete icon button -->
27+
</div>
28+
</div>
29+
</mat-card>
30+
}
31+
`,
1232
styles: `
1333
:host {
1434
display: block;
35+
width: 100%; /* Ensure it takes full width available */
1536
}
37+
/* Tailwind will be used for inline classes, but if specific :host styling is needed, it goes here */
1638
`,
1739
changeDetection: ChangeDetectionStrategy.OnPush,
1840
})

0 commit comments

Comments
 (0)