Конструктор силабуса

Натисніть тут, щоб відкрити конструктор

import React, { useState, useEffect, useRef } from ‘react’;
import { Printer, Save, FileText, CheckCircle, Plus, Trash2, ChevronDown, ChevronUp, User, Globe, Mail, Phone, BookOpen, Upload, Image as ImageIcon } from ‘lucide-react’;

const SyllabusBuilder = () => {

// — DATABASE OF INSTRUCTORS —
const instructorsDB = [
{
name: “Підгурний Іван Станіславович”,
rank: “кандидат мистецтвознавства, доцент, завідувач кафедри образотворчого і декоративно-прикладного мистецтва та реставрації творів мистецтва”,
email: “pidhurnyy@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/pidgurniy/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=27”,
phone: “”
},
{
name: “Урсу Наталія Олексіївна”,
rank: “доктор мистецтвознавства, професор кафедри”,
email: “ursu@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/ursu/”,
moodle: “”,
phone: “”
},
{
name: “Гуцул Іван Андрійович”,
rank: “кандидат мистецтвознавства, доцент кафедри”,
email: “hutsul@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/hutsul/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=22849”,
phone: “”
},
{
name: “Бренюк Алла Григорівна”,
rank: “кандидат мистецтвознавства, старший викладач кафедри”,
email: “brenyuk@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/brenuk/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=2609”,
phone: “”
},
{
name: “Паур Ірина Василівна”,
rank: “кандидат історичних наук, доцент”,
email: “iryna.paur@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/paur”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=81”,
phone: “”
},
{
name: “Луць Сергій Васильович”,
rank: “кандидат мистецтвознавства, старший викладач кафедри”,
email: “luts@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/lutss/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=24189”,
phone: “”
},
{
name: “Кліщ Оксана Андріївна”,
rank: “кандидат архітектури, старший викладач кафедри”,
email: “klishch@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/klishch/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=1493”,
phone: “”
},
{
name: “Бучковський Володимир Йосипович”,
rank: “асистент кафедри образотворчого і декоративно-прикладного мистецтва та реставрації творів мистецтва”,
email: “buchkovskyy@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/buchk-2/”,
moodle: “”,
phone: “”
},
{
name: “Мендерецька Наталія Вікторівна”,
rank: “асистент кафедри образотворчого і декоративно-прикладного мистецтва та реставрації творів мистецтва”,
email: “menderetska@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/menderecka/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=243”,
phone: “”
},
{
name: “Лашко Ілля Володимирович”,
rank: “асистент кафедри образотворчого і декоративно-прикладного мистецтва та реставрації творів мистецтва”,
email: “lashkoi@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/llashko/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=24178”,
phone: “”
},
{
name: “Кучма Надія Іванівна”,
rank: “асистент кафедри образотворчого і декоративно-прикладного мистецтва та реставрації творів мистецтва”,
email: “kuchma@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/kuchma/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=2734”,
phone: “”
},
{
name: “Такіров Тимур Нігимітуллайович”,
rank: “старший викладач кафедри образотворчого і декоративно-прикладного мистецтва та реставрації творів мистецтва”,
email: “takirov@kpnu.edu.ua”,
profile: “https://art.kpnu.edu.ua/takirov/”,
moodle: “https://moodle.kpnu.edu.ua/user/profile.php?id=22671”,
phone: “”
}
];

// — SPECIALTIES DATA —
const specialtiesDB = {
pre2025: [
{
name: “023 Образотворче мистецтво, декоративне мистецтво, реставрація”,
branch: “02 Культура і мистецтво”,
ep: “Образотворче мистецтво, декоративне мистецтво, реставрація”
},
{
name: “014 Середня освіта (Образотворче мистецтво)”,
branch: “01 Освіта / Педагогіка”,
ep: “Середня освіта (Образотворче мистецтво)”
}
],
post2025: [
{
name: “A4.12 Середня освіта. Мистецтво. Образотворче мистецтво”,
branch: “A Освіта”,
ep: “Середня освіта. (Образотворче мистецтво)”
},
{
name: “B2.01 Графічний дизайн”,
branch: “B Культура, мистецтво та гуманітарні науки”,
ep: “Графічний дизайн”
},
{
name: “B4.02 Реставрація”,
branch: “B Культура, мистецтво та гуманітарні науки”,
ep: “Реставрація творів мистецтва”
}
]
};

// — STATE —
const [data, setData] = useState({
university: “Кам’янець-Подільський національний університет імені Івана Огієнка”,
faculty: “Педагогічний факультет”,
department: “Кафедра образотворчого і декоративно-прикладного мистецтва та реставрації творів мистецтва”,

// Default University Logo
logo: “https://kpnu.edu.ua/wp-content/uploads/2023/10/logo_kpnu_new.png”,

// Course Info – Cleared / Placeholders
discipline: “Назва освітньої компоненти”,
yearStandard: “post2025”,
specialtyIndex: 0,
level: “Бакалавр”,
year: “2025-2026”,
semester: “1”,
credits: “”,
hours: “”,

// New Fields structure – Placeholders
courseFormat: “Очний (денний)”,
consultations: “Відповідно до графіку індивідуальних консультацій викладача (на кафедральному стенді)”,
language: “Українська”,

description: “”,
goal: “”,
tasks: “”,

learningOutcomes: “”,
prerequisites: “”,
techRequirements: “”,
recommendedSources: “1. Бібліотека університету\n2. Репозитарій К-ПНУ\n3. Фахові видання”,

// Instructor Data – Cleared
instructorName: “”,
instructorCustomName: “”,
instructorRank: “”,
instructorEmail: “”,
instructorPhone: “”,
instructorProfile: “”,
instructorMoodle: “”,

themes: [
{ id: 1, title: “”, hours: 0, type: “Лекція” },
],

// Updated Policy Text with Links
policy: `Академічна доброчесність.
Очікується, що роботи здобувачів вищої освіти будуть їх оригінальними дослідженнями чи міркуваннями. Відсутність посилань на використані джерела, фабрикування джерел списування, втручання в роботу інших здобувачів становлять, але не обмежують приклади можливої академічної недоброчесності. Виявлення ознак академічної недоброчесності в письмовій роботі здобувача освіти є підставою для незарахування викладачем, незалежно від масштабів плагіату. Дотримання академічної доброчесності регулюється Кодексом академічної доброчесності Кам’янець-Подільського національного університету імені Івана Огієнка (нова редакція) та Положенням про дотримання академічної доброчесності педагогічними, науково-педагогічними, науковими працівниками та здобувачами вищої освіти в Кам’янець-Подільському національному університеті імені Івана Огієнка (нова редакція) (https://integrity.kpnu.edu.ua/).

Відвідування занять.
Очікується, що здобувачі освіти відвідають усі лекційні та практичні заняття. Здобувачі освіти мають інформувати викладача про неможливість відвідати заняття. У будь-якому випадку здобувачі освіти зобов’язані дотримуватися термінів виконання усіх видів робіт, передбачених навчальною дисципліною. Під час відвідування всіх видів занять і консультацій очікується дотримання Правил внутрішнього розпорядку Кам’янець-Подільського національного університету імені Івана Огієнка (https://drive.google.com/file/d/1kXGZVxEIcG0Cmy33EvqF2c2E7hGHUrT8/view), Положення про організацію освітнього процесу в Кам’янець-Подільському національному університеті імені Івана Огієнка (нова редакція) (https://drive.google.com/file/d/1ZbMN35h-7ZSJBBOVvL2bTCaLtRbcQA86/view) та етичних норм поведінки.

Неформальна освіта.
Визнання результатів навчання окремих тем курсу шляхом неформальної/інформальної освіти здобувачами вищої освіти регламентується Порядком визнання в Кам’янець-Подільському національному університеті імені Івана Огієнка результатів навчання, здобутих шляхом неформальної та/або інформальної освіти (нова редакція) (https://drive.google.com/file/d/19GCSM3y-K496gs8RQJp0mO9FjUJumB4T/view).

Для пошуку рекомендованої літератури здобувачі можуть послуговуватися бібліотекою університету, фахових кафедр та інтернет-ресурсами. Здобувачі заохочуються до використання літератури, якої немає з-поміж рекомендованої.

Креативна ініціатива здобувача вищої освіти підтримується.`,
evaluationScale: “national”
});

const [activeSection, setActiveSection] = useState(‘general’);

// — HANDLERS —
const handleChange = (e) => {
const { name, value } = e.target;

if (name === ‘credits’) {
const credits = parseFloat(value) || 0;
setData(prev => ({
…prev,
[name]: value,
hours: credits * 30
}));
} else {
setData(prev => ({ …prev, [name]: value }));
}
};

const handleInstructorSelect = (e) => {
const selectedName = e.target.value;
const instructor = instructorsDB.find(i => i.name === selectedName);

if (instructor) {
setData(prev => ({
…prev,
instructorName: selectedName,
instructorCustomName: selectedName,
instructorRank: instructor.rank,
instructorEmail: instructor.email,
instructorProfile: instructor.profile,
instructorMoodle: instructor.moodle,
instructorPhone: instructor.phone
}));
} else {
setData(prev => ({
…prev,
instructorName: selectedName,
instructorCustomName: selectedName === ‘Інший’ ? ” : prev.instructorCustomName,
instructorRank: selectedName === ‘Інший’ ? ” : prev.instructorRank
}));
}
};

const handleThemeChange = (id, field, value) => {
const newThemes = data.themes.map(theme =>
theme.id === id ? { …theme, [field]: value } : theme
);
setData(prev => ({ …prev, themes: newThemes }));
};

const addTheme = () => {
const newId = data.themes.length > 0 ? Math.max(…data.themes.map(t => t.id)) + 1 : 1;
setData(prev => ({
…prev,
themes: […prev.themes, { id: newId, title: “”, hours: 0, type: “Лекція” }]
}));
};

const removeTheme = (id) => {
setData(prev => ({
…prev,
themes: prev.themes.filter(t => t.id !== id)
}));
};

const handlePrint = () => {
window.print();
};

// Helper to get current Specialty Object
const getCurrentSpecialty = () => {
const list = specialtiesDB[data.yearStandard];
return list[data.specialtyIndex] || list[0];
};

const currentSpec = getCurrentSpecialty();

// Helper to determine Semester Type
const semesterType = parseInt(data.semester) % 2 === 0 ? “Парний” : “Непарний”;

// — RENDER HELPERS —
const SectionHeader = ({ title, sectionKey, icon: Icon }) => (

{title}

{activeSection === sectionKey ? : }

);

return (

{/* Header Bar */}

Конструктор Силабусу

{/* EDITOR COLUMN (LEFT) */}

Редагування даних

{/* Section 1: General Info */}
{activeSection === ‘general’ && (


{/* Specialty Logic */}






)}

{/* Section 2: Instructor */}
{activeSection === ‘instructor’ && (