Files
ai_platform/views/ai-explore.ejs
dsyoon f7df18f181 feat: XAVIS 브랜드 이미지를 NCue 로고·favicon으로 교체
로그인·네비·F-Scan 로고, favicon, 페이지 타이틀, 인증 메일 브랜딩을 NCue로 통일.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-26 22:46:40 +09:00

206 lines
10 KiB
Plaintext

<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<%- include('partials/favicon') %>
<title>AI - NCue</title>
<link rel="stylesheet" href="/public/styles.css" />
</head>
<body
data-ai-explore-dev-guest="<%= (typeof aiExploreDevGuestRestricted !== 'undefined' && aiExploreDevGuestRestricted) ? '1' : '0' %>"
class="<%= (typeof aiExploreDevGuestRestricted !== 'undefined' && aiExploreDevGuestRestricted) ? 'ai-explore-page ai-explore-dev-guest' : 'ai-explore-page' %>"
>
<% var aiGuestDev = typeof aiExploreDevGuestRestricted !== 'undefined' && aiExploreDevGuestRestricted; %>
<% var _tclOk = typeof taskChecklistMenuAllowed !== 'undefined' && taskChecklistMenuAllowed; %>
<% var _opsLoggedIn = typeof opsUserEmail !== 'undefined' && opsUserEmail; %>
<div class="app-shell">
<%- include('partials/nav', { activeMenu: 'ai-explore', adminMode: typeof adminMode !== 'undefined' ? adminMode : false }) %>
<div class="content-area">
<header class="topbar">
<h1>AI</h1>
<% if (!_opsLoggedIn) { %>
<% if (aiGuestDev) { %>
<span class="top-action-link ai-explore-action-disabled" aria-disabled="true">AI 추가하기</span>
<% } else { %>
<a class="top-action-link" href="#">AI 추가하기</a>
<% } %>
<% } %>
</header>
<main class="container container-ai-full">
<% if (aiGuestDev) { %>
<p class="chat-api-warning" style="margin-bottom: 16px">로그인 후 이용 가능합니다.</p>
<% } %>
<section class="panel">
<p class="subtitle">지식 시험이나 지식 보강은 물론, 스킬들을 다양하게 조합한 맞춤형 AI를 탐색하고 사용해보세요.</p>
<form class="search-bar-wrap" id="aiExploreSearchForm" role="search">
<input
type="search"
id="aiExploreSearch"
placeholder="제목, 설명으로 검색하세요"
class="search-input"
autocomplete="off"
aria-label="AI 서비스 제목·설명 검색"
<% if (aiGuestDev) { %>disabled aria-disabled="true"<% } %>
/>
<div class="ai-type-filters" role="radiogroup" aria-label="AI 타입 필터">
<label class="ai-type-filter-option">
<input type="radio" name="aiTypeFilter" value="all" checked <% if (aiGuestDev) { %>disabled aria-disabled="true"<% } %> />
<span>전체</span>
</label>
<label class="ai-type-filter-option">
<input type="radio" name="aiTypeFilter" value="general" <% if (aiGuestDev) { %>disabled aria-disabled="true"<% } %> />
<span>일반</span>
</label>
<label class="ai-type-filter-option">
<input type="radio" name="aiTypeFilter" value="xscan" <% if (aiGuestDev) { %>disabled aria-disabled="true"<% } %> />
<span>XScan</span>
</label>
<label class="ai-type-filter-option">
<input type="radio" name="aiTypeFilter" value="fscan" <% if (aiGuestDev) { %>disabled aria-disabled="true"<% } %> />
<span>FScan</span>
</label>
</div>
</form>
</section>
<section class="panel">
<h2>AI 서비스</h2>
<div class="ai-card-grid">
<% if (aiGuestDev) { %>
<article class="ai-card ai-card-disabled" aria-disabled="true" data-ai-type="general">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>회의록 AI</h3>
<p>회의록을 자동으로 작성·요약·정리해주는 AI 서비스입니다.</p>
<div class="tag-row"><span class="tag-chip">#업무관리</span><span class="tag-chip">#회의록</span></div>
</article>
<% } else { %>
<a href="/ai-explore/meeting-minutes" class="ai-card ai-card-link" data-ai-type="general">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>회의록 AI</h3>
<p>회의록을 자동으로 작성·요약·정리해주는 AI 서비스입니다.</p>
<div class="tag-row"><span class="tag-chip">#업무관리</span><span class="tag-chip">#회의록</span></div>
</a>
<% } %>
<% if (_tclOk) { %>
<% if (aiGuestDev) { %>
<article class="ai-card ai-card-disabled" aria-disabled="true" data-ai-type="general">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>(회의록 기반) 업무 체크리스트 AI</h3>
<p>회의록에서 추출된 할 일과 개인 업무를 통합 관리하고, 등록·수정·삭제를 통해 완결성을 높이는 AI 비서입니다.</p>
<div class="tag-row"><span class="tag-chip">#업무관리</span><span class="tag-chip">#체크리스트</span></div>
</article>
<% } else { %>
<a href="/ai-explore/task-checklist" class="ai-card ai-card-link" data-ai-type="general">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>(회의록 기반) 업무 체크리스트 AI</h3>
<p>회의록에서 추출된 할 일과 개인 업무를 통합 관리하고, 등록·수정·삭제를 통해 완결성을 높이는 AI 비서입니다.</p>
<div class="tag-row"><span class="tag-chip">#업무관리</span><span class="tag-chip">#체크리스트</span></div>
</a>
<% } %>
<% } %>
<% if (aiGuestDev) { %>
<article class="ai-card ai-card-disabled" aria-disabled="true" data-ai-type="general">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>일반 채팅</h3>
<p>ChatGPT를 이용한 채팅 서비스입니다.</p>
<div class="tag-row"><span class="tag-chip">#질의응답.</span><span class="tag-chip">ChatGPT</span></div>
</article>
<% } else { %>
<a href="/ai-explore/chat" class="ai-card ai-card-link" data-ai-type="general">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>일반 채팅</h3>
<p>ChatGPT를 이용한 채팅 서비스입니다.</p>
<div class="tag-row"><span class="tag-chip">#질의응답.</span><span class="tag-chip">ChatGPT</span></div>
</a>
<% } %>
<% if (aiGuestDev) { %>
<article class="ai-card ai-card-disabled" aria-disabled="true" data-ai-type="fscan">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>FSCAN 조사각 선정도우미</h3>
<p>검사 대상물 치수(H/W) 기반으로 FSCAN 시리즈 모델 선정을 돕는 도구입니다.</p>
<div class="tag-row"><span class="tag-chip">#FSCAN</span><span class="tag-chip">#선정도우미</span></div>
</article>
<% } else { %>
<a href="/ai-explore/fscan" class="ai-card ai-card-link" data-ai-type="fscan">
<div class="ai-card-header">
<span class="status-chip public">공개중</span>
</div>
<h3>FSCAN 조사각 선정도우미</h3>
<p>검사 대상물 치수(H/W) 기반으로 FSCAN 시리즈 모델 선정을 돕는 도구입니다.</p>
<div class="tag-row"><span class="tag-chip">#FSCAN</span><span class="tag-chip">#선정도우미</span></div>
</a>
<% } %>
</div>
</section>
</main>
</div>
</div>
<script>
(function () {
var form = document.getElementById("aiExploreSearchForm");
var input = document.getElementById("aiExploreSearch");
var grid = document.querySelector(".ai-card-grid");
if (!form || !input || !grid) return;
var devGuest = (document.body.getAttribute("data-ai-explore-dev-guest") || "0") === "1";
if (devGuest) return;
var cards = grid.querySelectorAll(".ai-card");
var typeInputs = form.querySelectorAll('input[name="aiTypeFilter"]');
function cardTitleDescriptionText(el) {
var parts = [];
var h3 = el.querySelector("h3");
if (h3) parts.push(h3.textContent || "");
el.querySelectorAll("p").forEach(function (p) {
if (!p.closest(".tag-row")) parts.push(p.textContent || "");
});
return parts.join(" ").replace(/\s+/g, " ").trim().toLowerCase();
}
function applyFilter() {
var q = (input.value || "").trim().toLowerCase();
var checkedType = form.querySelector('input[name="aiTypeFilter"]:checked');
var selectedType = checkedType ? String(checkedType.value || "all") : "all";
cards.forEach(function (el) {
var text = cardTitleDescriptionText(el);
var cardType = String(el.getAttribute("data-ai-type") || "general").toLowerCase();
var textMatched = !q || text.indexOf(q) !== -1;
var typeMatched = selectedType === "all" || cardType === selectedType;
var show = textMatched && typeMatched;
el.hidden = !show;
el.setAttribute("aria-hidden", show ? "false" : "true");
});
}
input.addEventListener("input", applyFilter);
input.addEventListener("search", applyFilter);
typeInputs.forEach(function (el) {
el.addEventListener("change", applyFilter);
});
form.addEventListener("submit", function (e) {
e.preventDefault();
applyFilter();
});
applyFilter();
})();
</script>
</body>
</html>