18079408532 1 년 전
부모
커밋
d7c67de345
3개의 변경된 파일103개의 추가작업 그리고 36개의 파일을 삭제
  1. 33 20
      src/app/tab1/tab1.page.html
  2. 47 5
      src/app/tab1/tab1.page.ts
  3. 23 11
      src/app/tab4/tab4.page.ts

+ 33 - 20
src/app/tab1/tab1.page.html

@@ -18,35 +18,34 @@
 
   <ion-list>
     <ion-item-sliding *ngFor="let task of tasks">
-      <ion-item [ngClass]="getTaskStatusClass(task)">
-        <ion-checkbox slot="start" 
-                     [(ngModel)]="task.completed" 
-                     (ionChange)="toggleComplete(task)">
+      <ion-item [class]="getTaskStatusClass(task)">
+        <ion-checkbox 
+          [checked]="task.completed" 
+          (ionChange)="toggleComplete(task)"
+          slot="start">
         </ion-checkbox>
         <ion-label>
-          <div class="task-header">
-            <h2>{{ task.title }}</h2>
-            <ion-badge [color]="getTaskStatusColor(task)">
-              {{ getTaskStatusText(task) }}
-            </ion-badge>
-          </div>
-          <p *ngIf="task.content">{{ task.content }}</p>
-          <p *ngIf="task.startTime || task.endTime">
-            <ion-icon name="calendar-outline"></ion-icon>
-            {{ task.startTime | date:'short' }}
-            <span *ngIf="task.endTime">
-              - {{ task.endTime | date:'short' }}
-            </span>
-          </p>
+          <h2>{{ task.title }}</h2>
+          <p>{{ task.content }}</p>
+          <ion-badge color="{{ getTaskStatusColor(task) }}">
+            {{ getTaskStatusText(task) }}
+          </ion-badge>
         </ion-label>
+        <ion-button 
+          *ngIf="task.getStatus() === TaskStatus.InProgress"
+          slot="end" 
+          color="success" 
+          (click)="completeTask(task)">
+          <ion-icon name="checkmark-circle-outline"></ion-icon>
+        </ion-button>
       </ion-item>
 
       <ion-item-options side="end">
         <ion-item-option color="primary" (click)="editTask(task)">
-          <ion-icon slot="icon-only" name="create-outline"></ion-icon>
+          <ion-icon name="create-outline" slot="icon-only"></ion-icon>
         </ion-item-option>
         <ion-item-option color="danger" (click)="deleteTask(task)">
-          <ion-icon slot="icon-only" name="trash-outline"></ion-icon>
+          <ion-icon name="trash-outline" slot="icon-only"></ion-icon>
         </ion-item-option>
       </ion-item-options>
     </ion-item-sliding>
@@ -55,4 +54,18 @@
   <ion-text color="medium" class="ion-text-center ion-padding" *ngIf="tasks.length === 0">
     <p>暂无任务</p>
   </ion-text>
+
+  <ion-card *ngIf="currentTask">
+    <ion-card-header>
+      <ion-card-title>当前任务</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <h2>{{ currentTask.get('title') }}</h2>
+      <p>{{ currentTask.get('category') }}</p>
+      <ion-button expand="block" color="success" (click)="completeTask(currentTask)">
+        <ion-icon name="checkmark-circle-outline" slot="start"></ion-icon>
+        完成任务
+      </ion-button>
+    </ion-card-content>
+  </ion-card>
 </ion-content>

+ 47 - 5
src/app/tab1/tab1.page.ts

@@ -21,10 +21,15 @@ import {
   IonRefresherContent, 
   IonBadge,
   IonText,
-  AlertController
+  AlertController,
+  ToastController,
+  IonCard,
+  IonCardHeader,
+  IonCardTitle,
+  IonCardContent
 } from '@ionic/angular/standalone';
 import { addIcons } from 'ionicons';
-import { addOutline, calendarOutline, trashOutline, createOutline } from 'ionicons/icons';
+import { addOutline, calendarOutline, trashOutline, createOutline, checkmarkCircleOutline } from 'ionicons/icons';
 import { Task, TaskStatus } from '../models/Task';
 import * as Parse from 'parse';
 
@@ -54,17 +59,25 @@ import * as Parse from 'parse';
     IonRefresher,
     IonRefresherContent, 
     IonBadge,
-    IonText
+    IonText,
+    IonCard,
+    IonCardHeader,
+    IonCardTitle,
+    IonCardContent
   ]
 })
 export class Tab1Page implements OnInit {
+  TaskStatus = TaskStatus;
   tasks: Task[] = [];
   loading = false;
+  currentTask: Task | null = null;
+  currentFocusRecord: Parse.Object | null = null;
 
   constructor(
-    private alertController: AlertController
+    private alertController: AlertController,
+    private toastController: ToastController
   ) {
-    addIcons({ addOutline, calendarOutline, createOutline, trashOutline });
+    addIcons({addOutline,calendarOutline,createOutline,trashOutline,checkmarkCircleOutline});
   }
 
   ngOnInit() {
@@ -307,4 +320,33 @@ export class Tab1Page implements OnInit {
     });
     await alert.present();
   }
+
+  async completeTask(task: Task) {
+    try {
+      // 更新任务状态为已完成
+      task.completed = true;
+      await task.saveTask();
+
+      // 显示成功消息
+      const toast = await this.toastController.create({
+        message: '任务已完成!',
+        duration: 2000,
+        color: 'success',
+        position: 'top'
+      });
+      await toast.present();
+
+      // 刷新任务列表
+      await this.loadTasks();
+    } catch (error) {
+      console.error('完成任务失败:', error);
+      const toast = await this.toastController.create({
+        message: '完成任务失败,请重试',
+        duration: 2000,
+        color: 'danger',
+        position: 'top'
+      });
+      await toast.present();
+    }
+  }
 }

+ 23 - 11
src/app/tab4/tab4.page.ts

@@ -3,7 +3,7 @@ import { CommonModule } from '@angular/common';
 import { FormsModule } from '@angular/forms';
 import { IonHeader, IonToolbar, IonTitle, IonContent, IonCard, IonCardContent, 
          IonButton, IonCardHeader, IonCardTitle, IonCardSubtitle, IonIcon } from '@ionic/angular/standalone';
-import { ModalController, AlertController } from '@ionic/angular/standalone';
+import { ModalController, AlertController, ToastController } from '@ionic/angular/standalone';
 import { Router } from '@angular/router';
 import { openUserLoginModal } from '../../lib/user/modal-user-login/modal-user-login.component';
 import { CloudUser } from '../../lib/ncloud';
@@ -46,7 +46,8 @@ export class Tab4Page implements OnInit {
     private modalCtrl: ModalController,
     private alertController: AlertController,
     private auth: AuthService,
-    private focusDataService: FocusDataService
+    private focusDataService: FocusDataService,
+    private toastController: ToastController
   ) {}
 
   ngOnInit() {
@@ -108,17 +109,28 @@ export class Tab4Page implements OnInit {
 
   async logout() {
     try {
-      await this.auth.logout();
-      this.currentUser?.logOut();
-      this.currentUser = undefined;
-    } catch (error: any) {
+      await Parse.User.logOut();
+      
+      localStorage.removeItem('currentUser');
+      
+      this.router.navigate(['/login']);
+      
+      const toast = await this.toastController.create({
+        message: '已成功登出',
+        duration: 2000,
+        color: 'success',
+        position: 'top'
+      });
+      await toast.present();
+    } catch (error) {
       console.error('Logout error:', error);
-      const alert = await this.alertController.create({
-        header: '登出失败',
-        message: error.message || '请稍后重试',
-        buttons: ['确定']
+      const toast = await this.toastController.create({
+        message: '登出失败,请重试',
+        duration: 2000,
+        color: 'danger',
+        position: 'top'
       });
-      await alert.present();
+      await toast.present();
     }
   }