Compare commits
2 Commits
a1bc61417e
...
0b26613f6e
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b26613f6e | |||
| 72180e0ea1 |
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "lms",
|
"name": "lms",
|
||||||
"version": "1.0.15",
|
"version": "1.0.18",
|
||||||
"description": "Autonomy Studio LMS Electron app",
|
"description": "Autonomy Studio LMS Electron app",
|
||||||
"main": "./out/main/index.js",
|
"main": "./out/main/index.js",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -655,8 +655,6 @@ function LocalPcWorkspaceMockup({
|
|||||||
const studentSlug = makeStudentSlug(studentEmail)
|
const studentSlug = makeStudentSlug(studentEmail)
|
||||||
const clonePathPreview = makePlatformWorkspaceRoot(configuredWorkspaceRoot, studentSlug, weekNumber, platformKey)
|
const clonePathPreview = makePlatformWorkspaceRoot(configuredWorkspaceRoot, studentSlug, weekNumber, platformKey)
|
||||||
const remoteRuntimeRoot = `/tmp/autonomy-studio/sessions/${`${platformId}-${studentSlug}-week-${weekNumber}`.replace(/[^a-zA-Z0-9_.-]+/g, '-')}`
|
const remoteRuntimeRoot = `/tmp/autonomy-studio/sessions/${`${platformId}-${studentSlug}-week-${weekNumber}`.replace(/[^a-zA-Z0-9_.-]+/g, '-')}`
|
||||||
const draftClonePathPreview = makePlatformWorkspaceRoot(configuredDraftWorkspaceRoot, studentSlug, weekNumber, platformKey)
|
|
||||||
const draftGiteaRepositoryPreview = `${sourceSettingsDraft.giteaBaseUrl.replace(/\/+$/, '')}/${sourceSettingsDraft.giteaOwner}/${studentSlug}-week-${weekNumber}.git`
|
|
||||||
const {
|
const {
|
||||||
visualizationStacks,
|
visualizationStacks,
|
||||||
visualizationStack,
|
visualizationStack,
|
||||||
@@ -1415,8 +1413,8 @@ function LocalPcWorkspaceMockup({
|
|||||||
workspaceRoot: remoteWorkspace
|
workspaceRoot: remoteWorkspace
|
||||||
? platformSourceSettingsDefaults.workspaceRoot
|
? platformSourceSettingsDefaults.workspaceRoot
|
||||||
: sourceSettingsDraft.workspaceRoot.trim() || defaultStudioSourceSettings.workspaceRoot,
|
: sourceSettingsDraft.workspaceRoot.trim() || defaultStudioSourceSettings.workspaceRoot,
|
||||||
giteaBaseUrl: sourceSettingsDraft.giteaBaseUrl.trim().replace(/\/+$/, '') || defaultStudioSourceSettings.giteaBaseUrl,
|
giteaBaseUrl: sourceSettings.giteaBaseUrl,
|
||||||
giteaOwner: sourceSettingsDraft.giteaOwner.trim() || defaultStudioSourceSettings.giteaOwner,
|
giteaOwner: sourceSettings.giteaOwner,
|
||||||
gpuEnabled: sourceSettingsDraft.gpuEnabled,
|
gpuEnabled: sourceSettingsDraft.gpuEnabled,
|
||||||
rosDomainId: sourceSettingsDraft.rosDomainId.trim() || defaultStudioSourceSettings.rosDomainId
|
rosDomainId: sourceSettingsDraft.rosDomainId.trim() || defaultStudioSourceSettings.rosDomainId
|
||||||
})
|
})
|
||||||
@@ -2418,8 +2416,6 @@ function LocalPcWorkspaceMockup({
|
|||||||
configuredDraftWorkspaceRoot={configuredDraftWorkspaceRoot}
|
configuredDraftWorkspaceRoot={configuredDraftWorkspaceRoot}
|
||||||
sourceSettingsDraft={sourceSettingsDraft}
|
sourceSettingsDraft={sourceSettingsDraft}
|
||||||
platformSourceSettingsDefaults={platformSourceSettingsDefaults}
|
platformSourceSettingsDefaults={platformSourceSettingsDefaults}
|
||||||
draftClonePathPreview={draftClonePathPreview}
|
|
||||||
draftGiteaRepositoryPreview={draftGiteaRepositoryPreview}
|
|
||||||
onUpdateSourceSetting={updateSourceSetting}
|
onUpdateSourceSetting={updateSourceSetting}
|
||||||
onResetSourceSettings={setSourceSettingsDraft}
|
onResetSourceSettings={setSourceSettingsDraft}
|
||||||
onSaveSourceSettings={saveSourceSettings}
|
onSaveSourceSettings={saveSourceSettings}
|
||||||
@@ -3013,8 +3009,9 @@ export default function App(): React.JSX.Element {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!courseSelectionVisible) return
|
if (!courseSelectionVisible) return
|
||||||
|
if (studentCoursesLoaded || studentCoursesLoading) return
|
||||||
void loadStudentCourses({ autoSelectSingle: false })
|
void loadStudentCourses({ autoSelectSingle: false })
|
||||||
}, [courseSelectionVisible, loadStudentCourses])
|
}, [courseSelectionVisible, loadStudentCourses, studentCoursesLoaded, studentCoursesLoading])
|
||||||
|
|
||||||
const loadCurriculum = useCallback(async (): Promise<void> => {
|
const loadCurriculum = useCallback(async (): Promise<void> => {
|
||||||
if (!authReady || !studentCoursesLoaded || courseSelectionVisible || !selectedCourseId) return
|
if (!authReady || !studentCoursesLoaded || courseSelectionVisible || !selectedCourseId) return
|
||||||
@@ -4068,10 +4065,7 @@ export default function App(): React.JSX.Element {
|
|||||||
activeLearningStep={activeLearningStep}
|
activeLearningStep={activeLearningStep}
|
||||||
allowFutureLearningSteps={publicGuideCourseActive}
|
allowFutureLearningSteps={publicGuideCourseActive}
|
||||||
onLearningStepSelect={publicGuideCourseActive ? setActiveLearningStep : undefined}
|
onLearningStepSelect={publicGuideCourseActive ? setActiveLearningStep : undefined}
|
||||||
onSubmissionRecorded={() => {
|
onSubmissionRecorded={() => undefined}
|
||||||
setCurriculumRefreshSignal((current) => current + 1)
|
|
||||||
void loadStudentCourses({ autoSelectSingle: false })
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ const LAUNCHER_API_BASE_URL = NOTIFICATION_API_BASE_URL.replace(/\/api$/, '')
|
|||||||
const LMS_AUTH_SESSION_STORAGE_KEY = 'autonomy-studio.lms.auth-session'
|
const LMS_AUTH_SESSION_STORAGE_KEY = 'autonomy-studio.lms.auth-session'
|
||||||
const NOTIFICATION_DROPDOWN_LIMIT = 10
|
const NOTIFICATION_DROPDOWN_LIMIT = 10
|
||||||
const NOTIFICATION_MODAL_PAGE_SIZE = 8
|
const NOTIFICATION_MODAL_PAGE_SIZE = 8
|
||||||
const NOTIFICATION_REFRESH_INTERVAL_MS = 10_000
|
const NOTIFICATION_REFRESH_INTERVAL_MS = 60_000
|
||||||
|
|
||||||
const normalizeNotification = (notification: NotificationMessage): NotificationMessage => ({
|
const normalizeNotification = (notification: NotificationMessage): NotificationMessage => ({
|
||||||
...notification,
|
...notification,
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ type Props = {
|
|||||||
configuredDraftWorkspaceRoot: string
|
configuredDraftWorkspaceRoot: string
|
||||||
sourceSettingsDraft: StudioSourceSettings
|
sourceSettingsDraft: StudioSourceSettings
|
||||||
platformSourceSettingsDefaults: StudioSourceSettings
|
platformSourceSettingsDefaults: StudioSourceSettings
|
||||||
draftClonePathPreview: string
|
|
||||||
draftGiteaRepositoryPreview: string
|
|
||||||
onUpdateSourceSetting: <Key extends keyof StudioSourceSettings>(key: Key, value: StudioSourceSettings[Key]) => void
|
onUpdateSourceSetting: <Key extends keyof StudioSourceSettings>(key: Key, value: StudioSourceSettings[Key]) => void
|
||||||
onResetSourceSettings: (settings: StudioSourceSettings) => void
|
onResetSourceSettings: (settings: StudioSourceSettings) => void
|
||||||
onSaveSourceSettings: () => void
|
onSaveSourceSettings: () => void
|
||||||
@@ -26,8 +24,6 @@ function WorkspaceSettingsView({
|
|||||||
configuredDraftWorkspaceRoot,
|
configuredDraftWorkspaceRoot,
|
||||||
sourceSettingsDraft,
|
sourceSettingsDraft,
|
||||||
platformSourceSettingsDefaults,
|
platformSourceSettingsDefaults,
|
||||||
draftClonePathPreview,
|
|
||||||
draftGiteaRepositoryPreview,
|
|
||||||
onUpdateSourceSetting,
|
onUpdateSourceSetting,
|
||||||
onResetSourceSettings,
|
onResetSourceSettings,
|
||||||
onSaveSourceSettings
|
onSaveSourceSettings
|
||||||
@@ -50,7 +46,7 @@ function WorkspaceSettingsView({
|
|||||||
<div className={['mt-5 rounded-lg border p-4', dark ? 'border-white/10 bg-[#1f1f1f]' : 'border-[#e1e6ef] bg-[#f8fafc]'].join(' ')}>
|
<div className={['mt-5 rounded-lg border p-4', dark ? 'border-white/10 bg-[#1f1f1f]' : 'border-[#e1e6ef] bg-[#f8fafc]'].join(' ')}>
|
||||||
<p className={['text-[13px] font-black', textStrong].join(' ')}>공용 플랫폼 환경</p>
|
<p className={['text-[13px] font-black', textStrong].join(' ')}>공용 플랫폼 환경</p>
|
||||||
<p className={['mt-2 text-[12px] font-semibold leading-relaxed', textMid].join(' ')}>
|
<p className={['mt-2 text-[12px] font-semibold leading-relaxed', textMid].join(' ')}>
|
||||||
원격 플랫폼의 워크스페이스와 저장소 설정은 강사/관리자 설정을 사용합니다.
|
원격 플랫폼의 워크스페이스 설정은 강사/관리자 설정을 사용합니다.
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-4 grid gap-2 text-[12px] font-semibold">
|
<div className="mt-4 grid gap-2 text-[12px] font-semibold">
|
||||||
<div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/62' : 'bg-white text-[#4f596b]'].join(' ')}>
|
<div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/62' : 'bg-white text-[#4f596b]'].join(' ')}>
|
||||||
@@ -76,12 +72,6 @@ function WorkspaceSettingsView({
|
|||||||
onChange={(value) => onUpdateSourceSetting('rosDomainId', value.replace(/[^\d]/g, '').slice(0, 3))}
|
onChange={(value) => onUpdateSourceSetting('rosDomainId', value.replace(/[^\d]/g, '').slice(0, 3))}
|
||||||
dark={dark}
|
dark={dark}
|
||||||
/>
|
/>
|
||||||
<StudioSettingsField
|
|
||||||
label="Gitea 주소"
|
|
||||||
value={sourceSettingsDraft.giteaBaseUrl}
|
|
||||||
onChange={(value) => onUpdateSourceSetting('giteaBaseUrl', value)}
|
|
||||||
dark={dark}
|
|
||||||
/>
|
|
||||||
<StudioSettingsSwitch
|
<StudioSettingsSwitch
|
||||||
label="GPU 가속"
|
label="GPU 가속"
|
||||||
description="ON이면 Docker 실행 시 NVIDIA GPU를 사용합니다."
|
description="ON이면 Docker 실행 시 NVIDIA GPU를 사용합니다."
|
||||||
@@ -91,18 +81,6 @@ function WorkspaceSettingsView({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={['mt-5 rounded-lg border p-4', dark ? 'border-white/10 bg-[#1f1f1f]' : 'border-[#e1e6ef] bg-[#f8fafc]'].join(' ')}>
|
|
||||||
<p className={['text-[12px] font-black', textMid].join(' ')}>저장소</p>
|
|
||||||
<div className="mt-3 grid gap-2 font-mono text-[12px]">
|
|
||||||
<div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/68' : 'bg-white text-[#4f596b]'].join(' ')}>
|
|
||||||
clone path: {draftClonePathPreview}
|
|
||||||
</div>
|
|
||||||
<div className={['rounded-md px-3 py-2', dark ? 'bg-white/[0.05] text-white/68' : 'bg-white text-[#4f596b]'].join(' ')}>
|
|
||||||
repository: {draftGiteaRepositoryPreview}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="mt-5 flex justify-end gap-2">
|
<div className="mt-5 flex justify-end gap-2">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
Reference in New Issue
Block a user