|
58 | 58 |
|
59 | 59 | <div class="space-y-6"> |
60 | 60 | <!-- Header --> |
61 | | - <header class="animate-fade-slide-in relative overflow-hidden rounded-2xl bg-gradient-to-br from-warning/20 to-error/20 p-6 border border-warning/30"> |
| 61 | + <header |
| 62 | + class="animate-fade-slide-in relative overflow-hidden rounded-2xl border border-warning/30 bg-gradient-to-br from-warning/20 to-error/20 p-6" |
| 63 | + > |
62 | 64 | <!-- Warning decorative elements --> |
63 | 65 | <div class="absolute top-0 -right-10 h-32 w-32 rounded-full bg-warning/30 blur-3xl"></div> |
64 | 66 | <div class="absolute bottom-0 -left-10 h-24 w-24 rounded-full bg-error/20 blur-2xl"></div> |
|
82 | 84 | <div> |
83 | 85 | <p class="font-semibold">This is a heavy operation</p> |
84 | 86 | <p class="text-sm opacity-80"> |
85 | | - This will clone the old ut-code/utcode.net repository and import members, articles, and projects. |
86 | | - Existing entries will be skipped. This operation may take several minutes. |
| 87 | + This will clone the old ut-code/utcode.net repository and import members, articles, and |
| 88 | + projects. Existing entries will be skipped. This operation may take several minutes. |
87 | 89 | </p> |
88 | 90 | </div> |
89 | 91 | </div> |
90 | 92 |
|
91 | 93 | <!-- Status card --> |
92 | | - <div class="card bg-base-100 border border-base-300"> |
| 94 | + <div class="card border border-base-300 bg-base-100"> |
93 | 95 | <div class="card-body"> |
94 | | - <div class="flex items-center justify-between mb-4"> |
| 96 | + <div class="mb-4 flex items-center justify-between"> |
95 | 97 | <h2 class="card-title">Migration Status</h2> |
96 | 98 | <div class="flex items-center gap-2"> |
97 | 99 | {#if migrationState?.status === "idle"} |
98 | 100 | <span class="badge badge-ghost">Idle</span> |
99 | 101 | {:else if migrationState?.status === "running"} |
100 | | - <span class="badge badge-warning gap-1"> |
101 | | - <span class="loading loading-spinner loading-xs"></span> |
| 102 | + <span class="badge gap-1 badge-warning"> |
| 103 | + <span class="loading loading-xs loading-spinner"></span> |
102 | 104 | Running |
103 | 105 | </span> |
104 | 106 | {:else if migrationState?.status === "completed"} |
105 | | - <span class="badge badge-success gap-1"> |
| 107 | + <span class="badge gap-1 badge-success"> |
106 | 108 | <CheckCircle class="h-3 w-3" /> |
107 | 109 | Completed |
108 | 110 | </span> |
109 | 111 | {:else if migrationState?.status === "error"} |
110 | | - <span class="badge badge-error gap-1"> |
| 112 | + <span class="badge gap-1 badge-error"> |
111 | 113 | <XCircle class="h-3 w-3" /> |
112 | 114 | Failed |
113 | 115 | </span> |
|
116 | 118 | </div> |
117 | 119 |
|
118 | 120 | <!-- Action buttons --> |
119 | | - <div class="flex gap-2 mb-4"> |
| 121 | + <div class="mb-4 flex gap-2"> |
120 | 122 | <button |
121 | | - class="btn btn-warning gap-2" |
| 123 | + class="btn gap-2 btn-warning" |
122 | 124 | onclick={handleStart} |
123 | 125 | disabled={migrationState?.status === "running"} |
124 | 126 | > |
125 | 127 | <Play class="h-4 w-4" /> |
126 | 128 | Start Migration |
127 | 129 | </button> |
128 | 130 | {#if migrationState?.status === "completed" || migrationState?.status === "error"} |
129 | | - <button class="btn btn-ghost gap-2" onclick={handleReset}> |
| 131 | + <button class="btn gap-2 btn-ghost" onclick={handleReset}> |
130 | 132 | <RotateCcw class="h-4 w-4" /> |
131 | 133 | Reset |
132 | 134 | </button> |
|
135 | 137 |
|
136 | 138 | <!-- Results summary --> |
137 | 139 | {#if migrationState?.result} |
138 | | - <div class="grid grid-cols-3 gap-4 mb-4"> |
139 | | - <div class="stat bg-base-200 rounded-lg p-4"> |
| 140 | + <div class="mb-4 grid grid-cols-3 gap-4"> |
| 141 | + <div class="stat rounded-lg bg-base-200 p-4"> |
140 | 142 | <div class="stat-title">Members</div> |
141 | | - <div class="stat-value text-lg text-success">{migrationState.result.members.created}</div> |
| 143 | + <div class="stat-value text-lg text-success"> |
| 144 | + {migrationState.result.members.created} |
| 145 | + </div> |
142 | 146 | <div class="stat-desc"> |
143 | | - {migrationState.result.members.skipped} skipped, {migrationState.result.members.errors} errors |
| 147 | + {migrationState.result.members.skipped} skipped, {migrationState.result.members |
| 148 | + .errors} errors |
144 | 149 | </div> |
145 | 150 | </div> |
146 | | - <div class="stat bg-base-200 rounded-lg p-4"> |
| 151 | + <div class="stat rounded-lg bg-base-200 p-4"> |
147 | 152 | <div class="stat-title">Articles</div> |
148 | | - <div class="stat-value text-lg text-success">{migrationState.result.articles.created}</div> |
| 153 | + <div class="stat-value text-lg text-success"> |
| 154 | + {migrationState.result.articles.created} |
| 155 | + </div> |
149 | 156 | <div class="stat-desc"> |
150 | | - {migrationState.result.articles.skipped} skipped, {migrationState.result.articles.errors} errors |
| 157 | + {migrationState.result.articles.skipped} skipped, {migrationState.result.articles |
| 158 | + .errors} errors |
151 | 159 | </div> |
152 | 160 | </div> |
153 | | - <div class="stat bg-base-200 rounded-lg p-4"> |
| 161 | + <div class="stat rounded-lg bg-base-200 p-4"> |
154 | 162 | <div class="stat-title">Projects</div> |
155 | | - <div class="stat-value text-lg text-success">{migrationState.result.projects.created}</div> |
| 163 | + <div class="stat-value text-lg text-success"> |
| 164 | + {migrationState.result.projects.created} |
| 165 | + </div> |
156 | 166 | <div class="stat-desc"> |
157 | | - {migrationState.result.projects.skipped} skipped, {migrationState.result.projects.errors} errors |
| 167 | + {migrationState.result.projects.skipped} skipped, {migrationState.result.projects |
| 168 | + .errors} errors |
158 | 169 | </div> |
159 | 170 | </div> |
160 | 171 | </div> |
161 | 172 | {/if} |
162 | 173 |
|
163 | 174 | <!-- Error display --> |
164 | 175 | {#if migrationState?.error} |
165 | | - <div class="alert alert-error mb-4"> |
| 176 | + <div class="mb-4 alert alert-error"> |
166 | 177 | <XCircle class="h-5 w-5" /> |
167 | 178 | <span>{migrationState.error}</span> |
168 | 179 | </div> |
|
179 | 190 | <pre |
180 | 191 | id="logs" |
181 | 192 | bind:this={logsContainer} |
182 | | - class="bg-base-300 rounded-lg p-4 text-xs font-mono h-80 overflow-auto whitespace-pre-wrap" |
183 | | - >{#if migrationState?.logs.length}{migrationState.logs.join("\n")}{:else}No logs yet. Click "Start Migration" to begin.{/if}</pre> |
| 193 | + class="h-80 overflow-auto rounded-lg bg-base-300 p-4 font-mono text-xs whitespace-pre-wrap">{#if migrationState?.logs.length}{migrationState.logs.join( |
| 194 | + "\n", |
| 195 | + )}{:else}No logs yet. Click "Start Migration" to begin.{/if}</pre> |
184 | 196 | </div> |
185 | 197 |
|
186 | 198 | <!-- Timestamps --> |
187 | 199 | {#if migrationState?.startedAt || migrationState?.completedAt} |
188 | | - <div class="flex gap-4 text-sm text-base-content/60 mt-4"> |
| 200 | + <div class="mt-4 flex gap-4 text-sm text-base-content/60"> |
189 | 201 | {#if migrationState?.startedAt} |
190 | 202 | <span>Started: {new Date(migrationState.startedAt).toLocaleString("ja-JP")}</span> |
191 | 203 | {/if} |
|
0 commit comments