merge develop into release
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2026-07-10 13:40:07 +09:00
2 changed files with 30 additions and 15 deletions
+30 -14
View File
@@ -30,6 +30,18 @@ type DisplayForm = {
isEnabled: boolean; isEnabled: boolean;
}; };
const iconOptions = [
{ value: 'code', label: 'Code' },
{ value: 'bar-chart', label: 'Bar chart' },
{ value: 'monitor', label: 'Monitor' },
{ value: 'truck', label: 'Truck' },
{ value: 'graduation', label: 'Graduation' },
{ value: 'activity', label: 'Activity' },
{ value: 'sliders', label: 'Sliders' },
{ value: 'shopping-cart', label: 'Shopping cart' },
{ value: 'map', label: 'Map' },
];
function releaseLabel(link: LauncherAppLink) { function releaseLabel(link: LauncherAppLink) {
return link.release?.version ?? '-'; return link.release?.version ?? '-';
} }
@@ -318,16 +330,10 @@ export function LauncherAppsPage() {
</label> </label>
</div> </div>
</div> </div>
<div className="grid gap-4 md:grid-cols-2"> <label className="block">
<label className="block"> <span className="text-xs font-medium text-muted-foreground">보조 문구</span>
<span className="text-xs font-medium text-muted-foreground">보조 문구</span> <textarea className="mt-2 min-h-20 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.subtitle} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, subtitle: event.target.value } : prev)} />
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.subtitle} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, subtitle: event.target.value } : prev)} /> </label>
</label>
<label className="block">
<span className="text-xs font-medium text-muted-foreground">아이콘 키</span>
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.iconKey} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, iconKey: event.target.value } : prev)} />
</label>
</div>
<label className="block"> <label className="block">
<span className="text-xs font-medium text-muted-foreground">설명</span> <span className="text-xs font-medium text-muted-foreground">설명</span>
<textarea className="mt-2 min-h-20 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.description} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, description: event.target.value } : prev)} /> <textarea className="mt-2 min-h-20 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.description} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, description: event.target.value } : prev)} />
@@ -350,10 +356,20 @@ export function LauncherAppsPage() {
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.execPath} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, execPath: event.target.value } : prev)} /> <input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.execPath} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, execPath: event.target.value } : prev)} />
</label> </label>
</div> </div>
<label className="block"> <div className="grid gap-4 md:grid-cols-2">
<span className="text-xs font-medium text-muted-foreground">소개 영상 경로</span> <label className="block">
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.videoPath} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, videoPath: event.target.value } : prev)} /> <span className="text-xs font-medium text-muted-foreground">소개 영상 경로</span>
</label> <input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={displayForm.videoPath} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, videoPath: event.target.value } : prev)} />
</label>
<label className="block">
<span className="text-xs font-medium text-muted-foreground">아이콘 키</span>
<select className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={iconOptions.some((option) => option.value === displayForm.iconKey) ? displayForm.iconKey : 'code'} onChange={(event) => setDisplayForm((prev) => prev ? { ...prev, iconKey: event.target.value } : prev)}>
{iconOptions.map((option) => (
<option key={option.value} value={option.value}>{option.label}</option>
))}
</select>
</label>
</div>
</form> </form>
) : null} ) : null}
</Modal> </Modal>
@@ -383,7 +383,6 @@ export function OrganizationsPage() {
className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring" className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring"
value={form.name} value={form.name}
onChange={(event) => setForm((prev) => ({ ...prev, name: event.target.value }))} onChange={(event) => setForm((prev) => ({ ...prev, name: event.target.value }))}
placeholder="예: 영남대학교"
/> />
</label> </label>
<label className="block"> <label className="block">