|
286 | 286 | * Determine template type based on path and properties |
287 | 287 | */ |
288 | 288 | function getTemplateType(tmpl) { |
289 | | - const name = tmpl.name || ''; |
290 | | - |
291 | | - if (name.includes('base-templates/')) { |
292 | | - return 'custom'; |
293 | | - } |
294 | | - if (name.includes('userdata-templates/')) { |
295 | | - return 'userdata'; |
296 | | - } |
297 | | - if (name.includes('compose-templates/')) { |
298 | | - return 'compose'; |
| 289 | + // Prefer the template type field from case.json |
| 290 | + if (tmpl.template) { |
| 291 | + const t2 = tmpl.template; |
| 292 | + if (t2 === 'base') return 'custom'; |
| 293 | + if (t2 === 'userdata') return 'userdata'; |
| 294 | + if (t2 === 'compose') return 'compose'; |
| 295 | + if (t2 === 'preset') return 'preset'; |
299 | 296 | } |
| 297 | + // Fallback: detect from path name |
| 298 | + const name = tmpl.name || ''; |
| 299 | + if (name.includes('base-templates/')) return 'custom'; |
| 300 | + if (name.includes('userdata-templates/')) return 'userdata'; |
| 301 | + if (name.includes('compose-templates/')) return 'compose'; |
300 | 302 | return 'preset'; |
301 | 303 | } |
302 | 304 |
|
|
334 | 336 | let exportMessage = $state(''); |
335 | 337 |
|
336 | 338 | // Create template dialog state |
337 | | - let createTemplateDialog = $state({ show: false, name: '', scaffold: 'blank', loading: false, error: '' }); |
| 339 | + let createTemplateDialog = $state({ show: false, name: '', scaffold: 'preset', loading: false, error: '' }); |
338 | 340 |
|
339 | 341 | // File add inline input state (in templateEditor sidebar) |
340 | 342 | let addingFile = $state({ show: false, name: '' }); |
|
410 | 412 | // ============================================================================ |
411 | 413 |
|
412 | 414 | function showCreateTemplateDialog() { |
413 | | - createTemplateDialog = { show: true, name: '', scaffold: 'blank', loading: false, error: '' }; |
| 415 | + createTemplateDialog = { show: true, name: '', scaffold: 'preset', loading: false, error: '' }; |
414 | 416 | } |
415 | 417 |
|
416 | 418 | function cancelCreateTemplate() { |
417 | | - createTemplateDialog = { show: false, name: '', scaffold: 'blank', loading: false, error: '' }; |
| 419 | + createTemplateDialog = { show: false, name: '', scaffold: 'preset', loading: false, error: '' }; |
418 | 420 | } |
419 | 421 |
|
420 | 422 | async function confirmCreateTemplate() { |
|
435 | 437 | createTemplateDialog = { ...createTemplateDialog, loading: true, error: '' }; |
436 | 438 | try { |
437 | 439 | await CreateLocalTemplate(name, createTemplateDialog.scaffold); |
438 | | - createTemplateDialog = { show: false, name: '', scaffold: 'blank', loading: false, error: '' }; |
| 440 | + createTemplateDialog = { show: false, name: '', scaffold: 'preset', loading: false, error: '' }; |
439 | 441 | await loadLocalTemplates(); |
440 | 442 | // Auto-open editor for the new template |
441 | 443 | const newTmpl = localTemplates.find(t => t.name === name); |
|
1157 | 1159 | onkeydown={(e) => { if (e.key === 'Enter') confirmCreateTemplate(); }} |
1158 | 1160 | /> |
1159 | 1161 |
|
1160 | | - <label class="block text-[12px] font-medium text-gray-500 mb-2">{t.scaffoldType || '脚手架类型'}</label> |
| 1162 | + <label class="block text-[12px] font-medium text-gray-500 mb-2">{t.scaffoldType || '模板类型'}</label> |
1161 | 1163 | <div class="grid grid-cols-2 gap-2"> |
1162 | 1164 | <button |
1163 | | - class="px-3 py-2.5 text-left rounded-lg border transition-colors {createTemplateDialog.scaffold === 'blank' ? 'border-emerald-500 bg-emerald-50 text-emerald-700' : 'border-gray-200 text-gray-600 hover:bg-gray-50'}" |
1164 | | - onclick={() => createTemplateDialog = { ...createTemplateDialog, scaffold: 'blank' }} |
| 1165 | + class="px-3 py-2.5 text-left rounded-lg border transition-colors {createTemplateDialog.scaffold === 'preset' ? 'border-emerald-500 bg-emerald-50 text-emerald-700' : 'border-gray-200 text-gray-600 hover:bg-gray-50'}" |
| 1166 | + onclick={() => createTemplateDialog = { ...createTemplateDialog, scaffold: 'preset' }} |
| 1167 | + > |
| 1168 | + <div class="text-[13px] font-medium">{t.scaffoldPreset || '预定义模板'}</div> |
| 1169 | + <div class="text-[11px] mt-0.5 opacity-70">{t.scaffoldPresetDesc || 'Terraform 基础骨架'}</div> |
| 1170 | + </button> |
| 1171 | + <button |
| 1172 | + class="px-3 py-2.5 text-left rounded-lg border transition-colors {createTemplateDialog.scaffold === 'preset-userdata' ? 'border-emerald-500 bg-emerald-50 text-emerald-700' : 'border-gray-200 text-gray-600 hover:bg-gray-50'}" |
| 1173 | + onclick={() => createTemplateDialog = { ...createTemplateDialog, scaffold: 'preset-userdata' }} |
| 1174 | + > |
| 1175 | + <div class="text-[13px] font-medium">{t.scaffoldPresetUserdata || '预定义 + Userdata'}</div> |
| 1176 | + <div class="text-[11px] mt-0.5 opacity-70">{t.scaffoldPresetUserdataDesc || '含初始化脚本文件'}</div> |
| 1177 | + </button> |
| 1178 | + <button |
| 1179 | + class="px-3 py-2.5 text-left rounded-lg border transition-colors {createTemplateDialog.scaffold === 'base' ? 'border-emerald-500 bg-emerald-50 text-emerald-700' : 'border-gray-200 text-gray-600 hover:bg-gray-50'}" |
| 1180 | + onclick={() => createTemplateDialog = { ...createTemplateDialog, scaffold: 'base' }} |
| 1181 | + > |
| 1182 | + <div class="text-[13px] font-medium">{t.scaffoldBase || '自定义模板'}</div> |
| 1183 | + <div class="text-[11px] mt-0.5 opacity-70">{t.scaffoldBaseDesc || '自定义部署场景'}</div> |
| 1184 | + </button> |
| 1185 | + <button |
| 1186 | + class="px-3 py-2.5 text-left rounded-lg border transition-colors {createTemplateDialog.scaffold === 'userdata' ? 'border-emerald-500 bg-emerald-50 text-emerald-700' : 'border-gray-200 text-gray-600 hover:bg-gray-50'}" |
| 1187 | + onclick={() => createTemplateDialog = { ...createTemplateDialog, scaffold: 'userdata' }} |
1165 | 1188 | > |
1166 | | - <div class="text-[13px] font-medium">{t.scaffoldBlank || '空白模板'}</div> |
1167 | | - <div class="text-[11px] mt-0.5 opacity-70">{t.scaffoldBlankDesc || '基础注释,自由编写'}</div> |
| 1189 | + <div class="text-[13px] font-medium">{t.scaffoldUserdata || 'Userdata 模板'}</div> |
| 1190 | + <div class="text-[11px] mt-0.5 opacity-70">{t.scaffoldUserdataDesc || '仅含初始化脚本'}</div> |
1168 | 1191 | </button> |
1169 | 1192 | <button |
1170 | | - class="px-3 py-2.5 text-left rounded-lg border transition-colors {createTemplateDialog.scaffold === 'with-userdata' ? 'border-emerald-500 bg-emerald-50 text-emerald-700' : 'border-gray-200 text-gray-600 hover:bg-gray-50'}" |
1171 | | - onclick={() => createTemplateDialog = { ...createTemplateDialog, scaffold: 'with-userdata' }} |
| 1193 | + class="px-3 py-2.5 text-left rounded-lg border transition-colors col-span-2 {createTemplateDialog.scaffold === 'compose' ? 'border-emerald-500 bg-emerald-50 text-emerald-700' : 'border-gray-200 text-gray-600 hover:bg-gray-50'}" |
| 1194 | + onclick={() => createTemplateDialog = { ...createTemplateDialog, scaffold: 'compose' }} |
1172 | 1195 | > |
1173 | | - <div class="text-[13px] font-medium">{t.scaffoldUserdata || '含 Userdata'}</div> |
1174 | | - <div class="text-[11px] mt-0.5 opacity-70">{t.scaffoldUserdataDesc || '包含初始化脚本文件'}</div> |
| 1196 | + <div class="text-[13px] font-medium">{t.scaffoldCompose || 'Compose 模板'}</div> |
| 1197 | + <div class="text-[11px] mt-0.5 opacity-70">{t.scaffoldComposeDesc || '多云编排部署'}</div> |
1175 | 1198 | </button> |
1176 | 1199 | </div> |
1177 | 1200 |
|
|
0 commit comments