Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b8e12bcdb5 | |||
| 0fff01730e |
@@ -1,14 +0,0 @@
|
|||||||
node_modules
|
|
||||||
**/node_modules
|
|
||||||
npm-debug.log
|
|
||||||
.DS_Store
|
|
||||||
.git
|
|
||||||
.env
|
|
||||||
.vscode
|
|
||||||
.idea
|
|
||||||
frontend/build
|
|
||||||
frontend/dist
|
|
||||||
backend/.env
|
|
||||||
backend/node_modules
|
|
||||||
frontend/node_modules
|
|
||||||
backend/data/*.db*
|
|
||||||
-37
@@ -1,37 +0,0 @@
|
|||||||
node_modules
|
|
||||||
**/node_modules
|
|
||||||
npm-debug.log
|
|
||||||
.DS_Store
|
|
||||||
.git
|
|
||||||
.vscode
|
|
||||||
.idea
|
|
||||||
frontend/build
|
|
||||||
frontend/dist
|
|
||||||
backend/node_modules
|
|
||||||
backend/.env
|
|
||||||
frontend/node_modules
|
|
||||||
docker-compose.dev.yml
|
|
||||||
devscripts
|
|
||||||
backend/data/stackpulse.db
|
|
||||||
backend/data/stackpulse.db-shm
|
|
||||||
backend/data/stackpulse.db-wal
|
|
||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
pnpm-debug.log*
|
|
||||||
lerna-debug.log*
|
|
||||||
pnpm-lock.yaml
|
|
||||||
package-lock.json
|
|
||||||
yarn.lock
|
|
||||||
dist
|
|
||||||
dist-ssr
|
|
||||||
*.local
|
|
||||||
!.vscode/extensions.json
|
|
||||||
*.suo
|
|
||||||
*.ntvs*
|
|
||||||
*.njsproj
|
|
||||||
*.sln
|
|
||||||
*.sw?
|
|
||||||
@@ -0,0 +1,728 @@
|
|||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en" class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" href="/assets/images/favicon.png">
|
||||||
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>Stackpulse Dokumentation</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/assets/stylesheets/main.618322db.min.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
|
||||||
|
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
<body dir="ltr">
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
||||||
|
<label class="md-overlay" for="__drawer"></label>
|
||||||
|
<div data-md-component="skip">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div data-md-component="announce">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<header class="md-header md-header--shadow" data-md-component="header">
|
||||||
|
<nav class="md-header__inner md-grid" aria-label="Header">
|
||||||
|
<a href="/." title="Stackpulse Dokumentation" class="md-header__button md-logo" aria-label="Stackpulse Dokumentation" data-md-component="logo">
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<label class="md-header__button md-icon" for="__drawer">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
|
||||||
|
</label>
|
||||||
|
<div class="md-header__title" data-md-component="header-title">
|
||||||
|
<div class="md-header__ellipsis">
|
||||||
|
<div class="md-header__topic">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Stackpulse Dokumentation
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-header__topic" data-md-component="header-topic">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-header__button md-icon" for="__search">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||||
|
</label>
|
||||||
|
<div class="md-search" data-md-component="search" role="dialog">
|
||||||
|
<label class="md-search__overlay" for="__search"></label>
|
||||||
|
<div class="md-search__inner" role="search">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||||
|
<label class="md-search__icon md-icon" for="__search">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||||
|
</label>
|
||||||
|
<nav class="md-search__options" aria-label="Search">
|
||||||
|
|
||||||
|
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||||
|
</button>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="search-result">
|
||||||
|
<div class="md-search-result__meta">
|
||||||
|
Initializing search
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list" role="presentation"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main" data-md-component="main">
|
||||||
|
<div class="md-main__inner md-grid">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
|
||||||
|
<label class="md-nav__title" for="__drawer">
|
||||||
|
<a href="/." title="Stackpulse Dokumentation" class="md-nav__button md-logo" aria-label="Stackpulse Dokumentation" data-md-component="logo">
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
|
||||||
|
|
||||||
|
</a>
|
||||||
|
Stackpulse Dokumentation
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/." class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Start
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Benutzerhandbuch
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_2">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Benutzerhandbuch
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/user-guide/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Überblick
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/user-guide/setup/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Setup
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/user-guide/stacks/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stacks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/user-guide/logs/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Logs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/user-guide/maintenance/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Wartung
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/user-guide/users/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Benutzer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/user-guide/groups/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Benutzergruppen & Rechte
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Technik
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Technik
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/getting-started/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Getting Started
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/architecture/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Architektur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/backend/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Backend & API
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/frontend/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Frontend
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/operations/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Operations & Wartung
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content" data-md-component="content">
|
||||||
|
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
<h1>404 - Not found</h1>
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-copyright">
|
||||||
|
|
||||||
|
|
||||||
|
Made with
|
||||||
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
||||||
|
Material for MkDocs
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-dialog" data-md-component="dialog">
|
||||||
|
<div class="md-dialog__inner md-typeset"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script id="__config" type="application/json">{"annotate": null, "base": "/", "features": [], "search": "/assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="/assets/javascripts/bundle.e71a0d61.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
-64
@@ -1,64 +0,0 @@
|
|||||||
# ===============================
|
|
||||||
# Stage 1: Frontend Build
|
|
||||||
# ===============================
|
|
||||||
FROM node:20-alpine AS frontend-build
|
|
||||||
|
|
||||||
# Arbeitsverzeichnis
|
|
||||||
WORKDIR /app/frontend
|
|
||||||
|
|
||||||
# Nur package.json & package-lock.json kopieren und Dependencies installieren
|
|
||||||
COPY frontend/package.json frontend/package-lock.json ./
|
|
||||||
RUN npm ci
|
|
||||||
|
|
||||||
# Restliche Frontend-Dateien kopieren
|
|
||||||
COPY frontend/ ./
|
|
||||||
|
|
||||||
# Frontend Build erzeugen (statische Dateien)
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
|
|
||||||
# ===============================
|
|
||||||
# Stage 2: Backend + Frontend
|
|
||||||
# ===============================
|
|
||||||
FROM node:20-alpine AS runtime
|
|
||||||
|
|
||||||
#Install SSH-Client
|
|
||||||
RUN apk add --no-cache openssh-client
|
|
||||||
|
|
||||||
# Arbeitsverzeichnis
|
|
||||||
WORKDIR /app/backend
|
|
||||||
|
|
||||||
# Backend Dependencies installieren
|
|
||||||
COPY backend/package.json backend/package-lock.json ./
|
|
||||||
RUN npm ci --only=production
|
|
||||||
|
|
||||||
# Backend-Code kopieren
|
|
||||||
COPY backend/ ./
|
|
||||||
COPY backend/docker-entrypoint.sh ./docker-entrypoint.sh
|
|
||||||
|
|
||||||
# public leeren
|
|
||||||
RUN rm -rf ./public/*
|
|
||||||
|
|
||||||
# frische Datenbank vorbereiten
|
|
||||||
RUN rm -rf ./data && mkdir -p ./data && chown node:node ./data
|
|
||||||
|
|
||||||
# EntryPoint vorbereiten
|
|
||||||
RUN chmod +x ./docker-entrypoint.sh && chown node:node ./docker-entrypoint.sh
|
|
||||||
|
|
||||||
# Inhalt von dist inklusive Unterordner direkt nach public kopieren
|
|
||||||
COPY --from=frontend-build /app/frontend/dist/. ./public/
|
|
||||||
|
|
||||||
# Environment
|
|
||||||
ENV NODE_ENV=production
|
|
||||||
|
|
||||||
# Ports
|
|
||||||
# Backend intern: 4001
|
|
||||||
# Frontend exposed: 5173
|
|
||||||
EXPOSE 5173
|
|
||||||
|
|
||||||
# Node User
|
|
||||||
USER node
|
|
||||||
|
|
||||||
# Container startet das Backend (liefert statisches Frontend)
|
|
||||||
ENTRYPOINT ["./docker-entrypoint.sh"]
|
|
||||||
CMD ["node", "index.js"]
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||

|
|
||||||
|
|
||||||
# 📦 StackPulse 
|
|
||||||
|
|
||||||
**StackPulse** ist eine kleine Web-App, die über die Portainer-API deine Docker-Stacks verwaltet und aktualisiert.
|
|
||||||
Aktuell funktioniert StackPulse nur mit der Business-Edition von Portainer. Die Communitiy-Edition wird in einem späteren Release implementiert!
|
|
||||||
Sie besteht aus einem **Backend (Node.js/Express)** und einem **Frontend (React/Tailwind)**.
|
|
||||||
|
|
||||||
Ziel:
|
|
||||||
- Übersicht über alle Stacks in deiner Portainer-Instanz
|
|
||||||
- Später: Updates, Deployments und Monitoring
|
|
||||||
- Bereitstellung als **Docker Image**, nutzbar über **docker-compose**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Features & Roadmap
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>✅ v0.1 – Initial Release</summary>
|
|
||||||
|
|
||||||
- Projektstruktur mit Frontend & Backend
|
|
||||||
- Lokales Startskript (`scripts/start-dev.sh`)
|
|
||||||
- Frontend zeigt Stacks an (über Backend)
|
|
||||||
- API-Verbindung zu Portainer
|
|
||||||
- Stack Redeploy
|
|
||||||
- Bereitstellung eines Docker Images über GHCR
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>✅ v0.2 – Release</summary>
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
- [x] Anbindung einer SQLite-Datenbank
|
|
||||||
- [x] Logging der Redeploy-Aktionen in SQLite speichern
|
|
||||||
- [x] API-Endpunkte für Log-Abfragen
|
|
||||||
- [x] Funktionen für Pagination, Löschen und Export
|
|
||||||
|
|
||||||
### Frontend
|
|
||||||
- [x] Anzeige der Logs (inkl. Statusfarben)
|
|
||||||
- [x] UI-Komponenten für Log-Details
|
|
||||||
- [x] Filterfunktionen für die Logs
|
|
||||||
- [x] Pagination, Lösch- und Exportanzeigen
|
|
||||||
|
|
||||||
### Features
|
|
||||||
- [x] Selektive Auswahl: einzelne Stacks oder Services neu deployen
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>✅ v0.3 – Release</summary>
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
- [x] Automatische Datenbereinigung: Duplikate bei Stack-IDs erkennen & entfernen
|
|
||||||
- [x] Erweiterung der Logs
|
|
||||||
- [x] API für Filter & Suche (Stacks nach Name/Status abrufen)
|
|
||||||
|
|
||||||
### Frontend
|
|
||||||
- [x] Filter: Stacks nach Name oder Status durchsuchen
|
|
||||||
- [x] Benachrichtigungen im UI: erfolgreicher/fehlgeschlagener Redeploy (Toast)
|
|
||||||
- [x] Visualisierung der Datenbereinigung (Konflikt/Auto-Fix Meldungen)
|
|
||||||
|
|
||||||
### Features
|
|
||||||
- [x] Frontend-Filter für schnellere Navigation bei vielen Stacks
|
|
||||||
- [x] Echtzeit-Feedback im UI (Notifications)
|
|
||||||
- [x] Datenkonsistenz sichern: keine doppelten Stack-IDs mehr
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details open>
|
|
||||||
<summary>✅ v0.4 – Release</summary>
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
- keine Änderungen
|
|
||||||
|
|
||||||
### Frontend
|
|
||||||
- [x] GUI komplett überarbeitet
|
|
||||||
- [x] Umstellung auf Material Tailwind
|
|
||||||
- [x] Dashboard von Creative Tim als neues Frontend
|
|
||||||
|
|
||||||
### Features
|
|
||||||
- [x] Neue, übersichtliche Oberfläche im Material Design
|
|
||||||
- [x] leicht erweiterbar durch vorgefertigte Komponenten
|
|
||||||
- [x] kleine Bugfixes
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details open>
|
|
||||||
<summary>🔮 Geplante Features (v0.5+)</summary>
|
|
||||||
|
|
||||||
- Notifications (z. B. via Webhooks oder Mail)
|
|
||||||
- Authentifizierung & Benutzerverwaltung
|
|
||||||
- Monitoring (Status, CPU/RAM)
|
|
||||||
- Export/Import von Scheduler-Jobs (z. B. JSON)
|
|
||||||
- Integration Community Edition
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🗂️ Projektstruktur
|
|
||||||
|
|
||||||
```bash
|
|
||||||
stackpulse/
|
|
||||||
├── backend/ # Node.js Backend mit Express
|
|
||||||
│ └── data # SQlite Datenbank
|
|
||||||
│ └── db # Datenbank-Integration
|
|
||||||
├── frontend/ # React Frontend mit Tailwind
|
|
||||||
├── scripts/ # Lokale Hilfsskripte (nicht Teil des Images)
|
|
||||||
│ └── start-dev.sh #Skript für den lokalen Start
|
|
||||||
├── Dockerfile # Multi-Stage Build für Frontend + Backend
|
|
||||||
├── docker-compose.yml
|
|
||||||
└── README.md
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Lokaler Start
|
|
||||||
|
|
||||||
### 1. Dev-Server starten (Frontend + Backend)
|
|
||||||
```bash
|
|
||||||
./scripts/start-dev.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
➡️ Danach:
|
|
||||||
- Frontend → http://Deine-Server-IP:5173
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐳 Docker-Setup
|
|
||||||
|
|
||||||
### Mit Compose starten
|
|
||||||
```bash
|
|
||||||
version: "2.4"
|
|
||||||
services:
|
|
||||||
stackpulse:
|
|
||||||
container_name: stackpulse
|
|
||||||
image: ghcr.io/mboehmlaender/stackpulse
|
|
||||||
ports:
|
|
||||||
- '4001:4001'
|
|
||||||
volumes:
|
|
||||||
- stackpulse_data:/app/backend/data
|
|
||||||
environment:
|
|
||||||
PORTAINER_URL: "Your_Portainer_Server_Address"
|
|
||||||
PORTAINER_API_KEY: "Your_Portainer_API_Key"
|
|
||||||
PORTAINER_ENDPOINT_ID: "Your_Portainer_Endpoint_ID"
|
|
||||||
SELF_STACK_ID: "Stackpulse ID"
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
stackpulse_data:
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Die PORTAINER_ENDPOINT_ID erhältst du, wenn du die die URL im Browser ansiehst, wenn du das Dashboard in Portainer öffnest:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Die 3 wäre in diesem Fall Endpoint-ID.
|
|
||||||
|
|
||||||
Die STACK_SELF_ID findest du, wenn du das Frontend von StackPulse öffnest:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Diese ID kann erst nach dem Deploy von Stackpulse ausgelesen werden. Vergiss daher nicht, nach dem Hinterlegen der ID in den Variablen das Stack noch einmal zu redeployen!
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 Voraussetzungen
|
|
||||||
|
|
||||||
- Node.js >= 20
|
|
||||||
- Docker & Docker Compose
|
|
||||||
- Zugang zu einer Portainer-Instanz (API-Key erforderlich)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🤝 Mitmachen
|
|
||||||
|
|
||||||
1. Repo forken
|
|
||||||
2. Feature-Branch erstellen
|
|
||||||
3. PR gegen `dev` öffnen
|
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 74 KiB |
+16
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+18
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* Lunr languages, `Danish` language
|
||||||
|
* https://github.com/MihaiValentin/lunr-languages
|
||||||
|
*
|
||||||
|
* Copyright 2014, Mihai Valentin
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* based on
|
||||||
|
* Snowball JavaScript Library v0.3
|
||||||
|
* http://code.google.com/p/urim/
|
||||||
|
* http://snowball.tartarus.org/
|
||||||
|
*
|
||||||
|
* Copyright 2010, Oleg Mazko
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d<a&&(d=a)}}function n(){var e,r;if(f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}});
|
||||||
+18
File diff suppressed because one or more lines are too long
+18
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+18
File diff suppressed because one or more lines are too long
+18
File diff suppressed because one or more lines are too long
+18
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}});
|
||||||
+18
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}});
|
||||||
+18
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n<p.length;n++)r?a.push(new e.Token(p[n],{position:[f,p[n].length],index:a.length})):a.push(p[n]),f+=p[n].length;l=c+1}return a},e.ja.stemmer=function(){return function(e){return e}}(),e.Pipeline.registerFunction(e.ja.stemmer,"stemmer-ja"),e.ja.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Za-zA-Z0-90-9",e.ja.trimmer=e.trimmerSupport.generateTrimmer(e.ja.wordCharacters),e.Pipeline.registerFunction(e.ja.trimmer,"trimmer-ja"),e.ja.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.ja.stopWordFilter,"stopWordFilter-ja"),e.jp=e.ja,e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.Pipeline.registerFunction(e.jp.trimmer,"trimmer-jp"),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}});
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
module.exports=require("./lunr.ja");
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.kn=function(){this.pipeline.reset(),this.pipeline.add(e.kn.trimmer,e.kn.stopWordFilter,e.kn.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.kn.stemmer))},e.kn.wordCharacters="ಀ-಄ಅ-ಔಕ-ಹಾ-ೌ಼-ಽೕ-ೖೝ-ೞೠ-ೡೢ-ೣ೦-೯ೱ-ೳ",e.kn.trimmer=e.trimmerSupport.generateTrimmer(e.kn.wordCharacters),e.Pipeline.registerFunction(e.kn.trimmer,"trimmer-kn"),e.kn.stopWordFilter=e.generateStopWordFilter("ಮತ್ತು ಈ ಒಂದು ರಲ್ಲಿ ಹಾಗೂ ಎಂದು ಅಥವಾ ಇದು ರ ಅವರು ಎಂಬ ಮೇಲೆ ಅವರ ತನ್ನ ಆದರೆ ತಮ್ಮ ನಂತರ ಮೂಲಕ ಹೆಚ್ಚು ನ ಆ ಕೆಲವು ಅನೇಕ ಎರಡು ಹಾಗು ಪ್ರಮುಖ ಇದನ್ನು ಇದರ ಸುಮಾರು ಅದರ ಅದು ಮೊದಲ ಬಗ್ಗೆ ನಲ್ಲಿ ರಂದು ಇತರ ಅತ್ಯಂತ ಹೆಚ್ಚಿನ ಸಹ ಸಾಮಾನ್ಯವಾಗಿ ನೇ ಹಲವಾರು ಹೊಸ ದಿ ಕಡಿಮೆ ಯಾವುದೇ ಹೊಂದಿದೆ ದೊಡ್ಡ ಅನ್ನು ಇವರು ಪ್ರಕಾರ ಇದೆ ಮಾತ್ರ ಕೂಡ ಇಲ್ಲಿ ಎಲ್ಲಾ ವಿವಿಧ ಅದನ್ನು ಹಲವು ರಿಂದ ಕೇವಲ ದ ದಕ್ಷಿಣ ಗೆ ಅವನ ಅತಿ ನೆಯ ಬಹಳ ಕೆಲಸ ಎಲ್ಲ ಪ್ರತಿ ಇತ್ಯಾದಿ ಇವು ಬೇರೆ ಹೀಗೆ ನಡುವೆ ಇದಕ್ಕೆ ಎಸ್ ಇವರ ಮೊದಲು ಶ್ರೀ ಮಾಡುವ ಇದರಲ್ಲಿ ರೀತಿಯ ಮಾಡಿದ ಕಾಲ ಅಲ್ಲಿ ಮಾಡಲು ಅದೇ ಈಗ ಅವು ಗಳು ಎ ಎಂಬುದು ಅವನು ಅಂದರೆ ಅವರಿಗೆ ಇರುವ ವಿಶೇಷ ಮುಂದೆ ಅವುಗಳ ಮುಂತಾದ ಮೂಲ ಬಿ ಮೀ ಒಂದೇ ಇನ್ನೂ ಹೆಚ್ಚಾಗಿ ಮಾಡಿ ಅವರನ್ನು ಇದೇ ಯ ರೀತಿಯಲ್ಲಿ ಜೊತೆ ಅದರಲ್ಲಿ ಮಾಡಿದರು ನಡೆದ ಆಗ ಮತ್ತೆ ಪೂರ್ವ ಆತ ಬಂದ ಯಾವ ಒಟ್ಟು ಇತರೆ ಹಿಂದೆ ಪ್ರಮಾಣದ ಗಳನ್ನು ಕುರಿತು ಯು ಆದ್ದರಿಂದ ಅಲ್ಲದೆ ನಗರದ ಮೇಲಿನ ಏಕೆಂದರೆ ರಷ್ಟು ಎಂಬುದನ್ನು ಬಾರಿ ಎಂದರೆ ಹಿಂದಿನ ಆದರೂ ಆದ ಸಂಬಂಧಿಸಿದ ಮತ್ತೊಂದು ಸಿ ಆತನ ".split(" ")),e.kn.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.kn.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var n=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(n).split("|")},e.Pipeline.registerFunction(e.kn.stemmer,"stemmer-kn"),e.Pipeline.registerFunction(e.kn.stopWordFilter,"stopWordFilter-kn")}});
|
||||||
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p<t.length;++p)"en"==t[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[t[p]].wordCharacters,e[t[p]].stopWordFilter&&n.unshift(e[t[p]].stopWordFilter),e[t[p]].stemmer&&(n.push(e[t[p]].stemmer),s.push(e[t[p]].stemmer)));var o=e.trimmerSupport.generateTrimmer(r);return e.Pipeline.registerFunction(o,"lunr-multi-trimmer-"+i),n.unshift(o),function(){this.pipeline.reset(),this.pipeline.add.apply(this.pipeline,n),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add.apply(this.searchPipeline,s))}}}});
|
||||||
+18
File diff suppressed because one or more lines are too long
+18
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* Lunr languages, `Norwegian` language
|
||||||
|
* https://github.com/MihaiValentin/lunr-languages
|
||||||
|
*
|
||||||
|
* Copyright 2014, Mihai Valentin
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* based on
|
||||||
|
* Snowball JavaScript Library v0.3
|
||||||
|
* http://code.google.com/p/urim/
|
||||||
|
* http://snowball.tartarus.org/
|
||||||
|
*
|
||||||
|
* Copyright 2010, Oleg Mazko
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a<s&&(a=s)}}function i(){var e,r,n;if(w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}});
|
||||||
+18
File diff suppressed because one or more lines are too long
+18
File diff suppressed because one or more lines are too long
+18
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWordFilter,e.sa.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sa.stemmer))},e.sa.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿ꣠-꣱ꣲ-ꣷ꣸-ꣻ꣼-ꣽꣾ-ꣿᆰ0-ᆰ9",e.sa.trimmer=e.trimmerSupport.generateTrimmer(e.sa.wordCharacters),e.Pipeline.registerFunction(e.sa.trimmer,"trimmer-sa"),e.sa.stopWordFilter=e.generateStopWordFilter('तथा अयम् एकम् इत्यस्मिन् तथा तत् वा अयम् इत्यस्य ते आहूत उपरि तेषाम् किन्तु तेषाम् तदा इत्यनेन अधिकः इत्यस्य तत् केचन बहवः द्वि तथा महत्वपूर्णः अयम् अस्य विषये अयं अस्ति तत् प्रथमः विषये इत्युपरि इत्युपरि इतर अधिकतमः अधिकः अपि सामान्यतया ठ इतरेतर नूतनम् द न्यूनम् कश्चित् वा विशालः द सः अस्ति तदनुसारम् तत्र अस्ति केवलम् अपि अत्र सर्वे विविधाः तत् बहवः यतः इदानीम् द दक्षिण इत्यस्मै तस्य उपरि नथ अतीव कार्यम् सर्वे एकैकम् इत्यादि। एते सन्ति उत इत्थम् मध्ये एतदर्थं . स कस्य प्रथमः श्री. करोति अस्मिन् प्रकारः निर्मिता कालः तत्र कर्तुं समान अधुना ते सन्ति स एकः अस्ति सः अर्थात् तेषां कृते . स्थितम् विशेषः अग्रिम तेषाम् समान स्रोतः ख म समान इदानीमपि अधिकतया करोतु ते समान इत्यस्य वीथी सह यस्मिन् कृतवान् धृतः तदा पुनः पूर्वं सः आगतः किम् कुल इतर पुरा मात्रा स विषये उ अतएव अपि नगरस्य उपरि यतः प्रतिशतं कतरः कालः साधनानि भूत तथापि जात सम्बन्धि अन्यत् ग अतः अस्माकं स्वकीयाः अस्माकं इदानीं अन्तः इत्यादयः भवन्तः इत्यादयः एते एताः तस्य अस्य इदम् एते तेषां तेषां तेषां तान् तेषां तेषां तेषां समानः सः एकः च तादृशाः बहवः अन्ये च वदन्ति यत् कियत् कस्मै कस्मै यस्मै यस्मै यस्मै यस्मै न अतिनीचः किन्तु प्रथमं सम्पूर्णतया ततः चिरकालानन्तरं पुस्तकं सम्पूर्णतया अन्तः किन्तु अत्र वा इह इव श्रद्धाय अवशिष्यते परन्तु अन्ये वर्गाः सन्ति ते सन्ति शक्नुवन्ति सर्वे मिलित्वा सर्वे एकत्र"'.split(" ")),e.sa.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.sa.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.sa.stemmer,"stemmer-sa"),e.Pipeline.registerFunction(e.sa.stopWordFilter,"stopWordFilter-sa")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.method=s},SnowballProgram:function(){var r;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(t){r=t,this.cursor=0,this.limit=t.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},getCurrent:function(){var t=r;return r=null,t},in_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e>s||e<i)return this.cursor++,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e<i)return this.cursor--,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor+s)!=i.charCodeAt(s))return!1;return this.cursor+=t,!0},eq_s_b:function(t,i){if(this.cursor-this.limit_backward<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor-t+s)!=i.charCodeAt(s))return!1;return this.cursor-=t,!0},find_among:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=l;m<_.s_size;m++){if(n+l==u){f=-1;break}if(f=r.charCodeAt(n+l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=_.s_size-1-l;m>=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}});
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* Lunr languages, `Swedish` language
|
||||||
|
* https://github.com/MihaiValentin/lunr-languages
|
||||||
|
*
|
||||||
|
* Copyright 2014, Mihai Valentin
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* based on
|
||||||
|
* Snowball JavaScript Library v0.3
|
||||||
|
* http://code.google.com/p/urim/
|
||||||
|
* http://snowball.tartarus.org/
|
||||||
|
*
|
||||||
|
* Copyright 2010, Oleg Mazko
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o<a&&(o=a)}}function t(){var e,r=w.limit_backward;if(w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}});
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="-உஊ-ஏஐ-ஙச-ட-னப-யர-ஹ-ிீ-ொ-ௐ---௩௪-௯௰-௹௺-a-zA-Za-zA-Z0-90-9",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}});
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}});
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[-]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}});
|
||||||
+18
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}});
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}});
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
/**
|
||||||
|
* export the module via AMD, CommonJS or as a browser global
|
||||||
|
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
|
||||||
|
*/
|
||||||
|
;(function (root, factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// AMD. Register as an anonymous module.
|
||||||
|
define(factory)
|
||||||
|
} else if (typeof exports === 'object') {
|
||||||
|
/**
|
||||||
|
* Node. Does not work with strict CommonJS, but
|
||||||
|
* only CommonJS-like environments that support module.exports,
|
||||||
|
* like Node.
|
||||||
|
*/
|
||||||
|
module.exports = factory()
|
||||||
|
} else {
|
||||||
|
// Browser globals (root is window)
|
||||||
|
factory()(root.lunr);
|
||||||
|
}
|
||||||
|
}(this, function () {
|
||||||
|
/**
|
||||||
|
* Just return a value to define the module export.
|
||||||
|
* This example returns an object, but the module
|
||||||
|
* can return a function as the exported value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
return function(lunr) {
|
||||||
|
// TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript
|
||||||
|
// (c) 2008 Taku Kudo <taku@chasen.org>
|
||||||
|
// TinySegmenter is freely distributable under the terms of a new BSD licence.
|
||||||
|
// For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt
|
||||||
|
|
||||||
|
function TinySegmenter() {
|
||||||
|
var patterns = {
|
||||||
|
"[一二三四五六七八九十百千万億兆]":"M",
|
||||||
|
"[一-龠々〆ヵヶ]":"H",
|
||||||
|
"[ぁ-ん]":"I",
|
||||||
|
"[ァ-ヴーア-ン゙ー]":"K",
|
||||||
|
"[a-zA-Za-zA-Z]":"A",
|
||||||
|
"[0-90-9]":"N"
|
||||||
|
}
|
||||||
|
this.chartype_ = [];
|
||||||
|
for (var i in patterns) {
|
||||||
|
var regexp = new RegExp(i);
|
||||||
|
this.chartype_.push([regexp, patterns[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.BIAS__ = -332
|
||||||
|
this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378};
|
||||||
|
this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920};
|
||||||
|
this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266};
|
||||||
|
this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352};
|
||||||
|
this.BP2__ = {"BO":60,"OO":-1762};
|
||||||
|
this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965};
|
||||||
|
this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146};
|
||||||
|
this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699};
|
||||||
|
this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973};
|
||||||
|
this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682};
|
||||||
|
this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669};
|
||||||
|
this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990};
|
||||||
|
this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832};
|
||||||
|
this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649};
|
||||||
|
this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393};
|
||||||
|
this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841};
|
||||||
|
this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68};
|
||||||
|
this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591};
|
||||||
|
this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685};
|
||||||
|
this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156};
|
||||||
|
this.TW1__ = {"につい":-4681,"東京都":2026};
|
||||||
|
this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216};
|
||||||
|
this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287};
|
||||||
|
this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865};
|
||||||
|
this.UC1__ = {"A":484,"K":93,"M":645,"O":-505};
|
||||||
|
this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646};
|
||||||
|
this.UC3__ = {"A":-1370,"I":2311};
|
||||||
|
this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646};
|
||||||
|
this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831};
|
||||||
|
this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387};
|
||||||
|
this.UP1__ = {"O":-214};
|
||||||
|
this.UP2__ = {"B":69,"O":935};
|
||||||
|
this.UP3__ = {"B":189};
|
||||||
|
this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422};
|
||||||
|
this.UQ2__ = {"BH":216,"BI":113,"OK":1759};
|
||||||
|
this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212};
|
||||||
|
this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135};
|
||||||
|
this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568};
|
||||||
|
this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278};
|
||||||
|
this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637};
|
||||||
|
this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343};
|
||||||
|
this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496};
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
TinySegmenter.prototype.ctype_ = function(str) {
|
||||||
|
for (var i in this.chartype_) {
|
||||||
|
if (str.match(this.chartype_[i][0])) {
|
||||||
|
return this.chartype_[i][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "O";
|
||||||
|
}
|
||||||
|
|
||||||
|
TinySegmenter.prototype.ts_ = function(v) {
|
||||||
|
if (v) { return v; }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
TinySegmenter.prototype.segment = function(input) {
|
||||||
|
if (input == null || input == undefined || input == "") {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
var result = [];
|
||||||
|
var seg = ["B3","B2","B1"];
|
||||||
|
var ctype = ["O","O","O"];
|
||||||
|
var o = input.split("");
|
||||||
|
for (i = 0; i < o.length; ++i) {
|
||||||
|
seg.push(o[i]);
|
||||||
|
ctype.push(this.ctype_(o[i]))
|
||||||
|
}
|
||||||
|
seg.push("E1");
|
||||||
|
seg.push("E2");
|
||||||
|
seg.push("E3");
|
||||||
|
ctype.push("O");
|
||||||
|
ctype.push("O");
|
||||||
|
ctype.push("O");
|
||||||
|
var word = seg[3];
|
||||||
|
var p1 = "U";
|
||||||
|
var p2 = "U";
|
||||||
|
var p3 = "U";
|
||||||
|
for (var i = 4; i < seg.length - 3; ++i) {
|
||||||
|
var score = this.BIAS__;
|
||||||
|
var w1 = seg[i-3];
|
||||||
|
var w2 = seg[i-2];
|
||||||
|
var w3 = seg[i-1];
|
||||||
|
var w4 = seg[i];
|
||||||
|
var w5 = seg[i+1];
|
||||||
|
var w6 = seg[i+2];
|
||||||
|
var c1 = ctype[i-3];
|
||||||
|
var c2 = ctype[i-2];
|
||||||
|
var c3 = ctype[i-1];
|
||||||
|
var c4 = ctype[i];
|
||||||
|
var c5 = ctype[i+1];
|
||||||
|
var c6 = ctype[i+2];
|
||||||
|
score += this.ts_(this.UP1__[p1]);
|
||||||
|
score += this.ts_(this.UP2__[p2]);
|
||||||
|
score += this.ts_(this.UP3__[p3]);
|
||||||
|
score += this.ts_(this.BP1__[p1 + p2]);
|
||||||
|
score += this.ts_(this.BP2__[p2 + p3]);
|
||||||
|
score += this.ts_(this.UW1__[w1]);
|
||||||
|
score += this.ts_(this.UW2__[w2]);
|
||||||
|
score += this.ts_(this.UW3__[w3]);
|
||||||
|
score += this.ts_(this.UW4__[w4]);
|
||||||
|
score += this.ts_(this.UW5__[w5]);
|
||||||
|
score += this.ts_(this.UW6__[w6]);
|
||||||
|
score += this.ts_(this.BW1__[w2 + w3]);
|
||||||
|
score += this.ts_(this.BW2__[w3 + w4]);
|
||||||
|
score += this.ts_(this.BW3__[w4 + w5]);
|
||||||
|
score += this.ts_(this.TW1__[w1 + w2 + w3]);
|
||||||
|
score += this.ts_(this.TW2__[w2 + w3 + w4]);
|
||||||
|
score += this.ts_(this.TW3__[w3 + w4 + w5]);
|
||||||
|
score += this.ts_(this.TW4__[w4 + w5 + w6]);
|
||||||
|
score += this.ts_(this.UC1__[c1]);
|
||||||
|
score += this.ts_(this.UC2__[c2]);
|
||||||
|
score += this.ts_(this.UC3__[c3]);
|
||||||
|
score += this.ts_(this.UC4__[c4]);
|
||||||
|
score += this.ts_(this.UC5__[c5]);
|
||||||
|
score += this.ts_(this.UC6__[c6]);
|
||||||
|
score += this.ts_(this.BC1__[c2 + c3]);
|
||||||
|
score += this.ts_(this.BC2__[c3 + c4]);
|
||||||
|
score += this.ts_(this.BC3__[c4 + c5]);
|
||||||
|
score += this.ts_(this.TC1__[c1 + c2 + c3]);
|
||||||
|
score += this.ts_(this.TC2__[c2 + c3 + c4]);
|
||||||
|
score += this.ts_(this.TC3__[c3 + c4 + c5]);
|
||||||
|
score += this.ts_(this.TC4__[c4 + c5 + c6]);
|
||||||
|
// score += this.ts_(this.TC5__[c4 + c5 + c6]);
|
||||||
|
score += this.ts_(this.UQ1__[p1 + c1]);
|
||||||
|
score += this.ts_(this.UQ2__[p2 + c2]);
|
||||||
|
score += this.ts_(this.UQ3__[p3 + c3]);
|
||||||
|
score += this.ts_(this.BQ1__[p2 + c2 + c3]);
|
||||||
|
score += this.ts_(this.BQ2__[p2 + c3 + c4]);
|
||||||
|
score += this.ts_(this.BQ3__[p3 + c2 + c3]);
|
||||||
|
score += this.ts_(this.BQ4__[p3 + c3 + c4]);
|
||||||
|
score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);
|
||||||
|
score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);
|
||||||
|
score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);
|
||||||
|
score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);
|
||||||
|
var p = "O";
|
||||||
|
if (score > 0) {
|
||||||
|
result.push(word);
|
||||||
|
word = "";
|
||||||
|
p = "B";
|
||||||
|
}
|
||||||
|
p1 = p2;
|
||||||
|
p2 = p3;
|
||||||
|
p3 = p;
|
||||||
|
word += seg[i];
|
||||||
|
}
|
||||||
|
result.push(word);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
lunr.TinySegmenter = TinySegmenter;
|
||||||
|
};
|
||||||
|
|
||||||
|
}));
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["src/templates/assets/stylesheets/palette/_scheme.scss","../../../../src/templates/assets/stylesheets/palette.scss","src/templates/assets/stylesheets/palette/_accent.scss","src/templates/assets/stylesheets/palette/_primary.scss","src/templates/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"AA2BA,cAGE,6BAME,sDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CACA,mDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CAGA,mDAAA,CACA,gDAAA,CACA,yDAAA,CACA,4DAAA,CAGA,0BAAA,CACA,mCAAA,CAGA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,uDAAA,CACA,6DAAA,CACA,2DAAA,CAGA,iCAAA,CAGA,yDAAA,CACA,iEAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,qDAAA,CACA,uDAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DAAA,CAzEA,iBCiBF,CD6DE,kHAEE,YC3DJ,CDkFE,yDACE,4BChFJ,CD+EE,2DACE,4BC7EJ,CD4EE,gEACE,4BC1EJ,CDyEE,2DACE,4BCvEJ,CDsEE,yDACE,4BCpEJ,CDmEE,0DACE,4BCjEJ,CDgEE,gEACE,4BC9DJ,CD6DE,0DACE,4BC3DJ,CD0DE,2OACE,4BC/CJ,CDsDA,+FAGE,iCCpDF,CACF,CCjDE,2BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD6CN,CCvDE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDoDN,CC9DE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD2DN,CCrEE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDkEN,CC5EE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDyEN,CCnFE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDgFN,CC1FE,kCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDuFN,CCjGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD8FN,CCxGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDqGN,CC/GE,6BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD4GN,CCtHE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDmHN,CC7HE,4BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD6HN,CCpIE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDoIN,CC3IE,6BACE,yBAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD2IN,CClJE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDkJN,CCzJE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDsJN,CE3JE,4BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwJN,CEnKE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgKN,CE3KE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwKN,CEnLE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgLN,CE3LE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwLN,CEnME,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgMN,CE3ME,mCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwMN,CEnNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgNN,CE3NE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwNN,CEnOE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgON,CE3OE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwON,CEnPE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFmPN,CE3PE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCF2PN,CEnQE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFmQN,CE3QE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCF2QN,CEnRE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgRN,CE3RE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwRN,CEnSE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BF4RN,CE5SE,kCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BFqSN,CEtRE,sEACE,4BFyRJ,CE1RE,+DACE,4BF6RJ,CE9RE,iEACE,4BFiSJ,CElSE,gEACE,4BFqSJ,CEtSE,iEACE,4BFySJ,CEhSA,8BACE,mDAAA,CACA,4DAAA,CACA,0DAAA,CACA,oDAAA,CACA,2DAAA,CAGA,4BFiSF,CE9RE,yCACE,+BFgSJ,CE7RI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCFiSN,CG7MI,mCD1EA,+CACE,8CF0RJ,CEvRI,qDACE,8CFyRN,CEpRE,iEACE,mCFsRJ,CACF,CGxNI,sCDvDA,uCACE,oCFkRJ,CACF,CEzQA,8BACE,kDAAA,CACA,4DAAA,CACA,wDAAA,CACA,oDAAA,CACA,6DAAA,CAGA,4BF0QF,CEvQE,yCACE,+BFyQJ,CEtQI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCF0QN,CEnQE,yCACE,6CFqQJ,CG9NI,0CDhCA,8CACE,gDFiQJ,CACF,CGnOI,0CDvBA,iFACE,6CF6PJ,CACF,CG3PI,sCDKA,uCACE,6CFyPJ,CACF","file":"palette.css"}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
PORTAINER_URL=Your_Portainer_Server_Adress
|
|
||||||
PORTAINER_API_KEY=Your_Portainer_API_Key
|
|
||||||
PORTAINER_ENDPOINT_ID=Your_Portainer_Endpoint_ID
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
stackpulse.db
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import Database from 'better-sqlite3';
|
|
||||||
import fs from 'fs';
|
|
||||||
import path from 'path';
|
|
||||||
import { fileURLToPath } from 'url';
|
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
|
||||||
const __dirname = path.dirname(__filename);
|
|
||||||
|
|
||||||
const dataDir = path.join(__dirname, '..', 'data');
|
|
||||||
const dbFile = path.join(dataDir, 'stackpulse.db');
|
|
||||||
|
|
||||||
if (!fs.existsSync(dataDir)) {
|
|
||||||
fs.mkdirSync(dataDir, { recursive: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
const db = new Database(dbFile);
|
|
||||||
db.pragma('journal_mode = WAL');
|
|
||||||
export { db, dbFile };
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import { db } from './index.js';
|
|
||||||
|
|
||||||
const createRedeployLogsTable = `
|
|
||||||
CREATE TABLE IF NOT EXISTS redeploy_logs (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
stack_id TEXT NOT NULL,
|
|
||||||
stack_name TEXT NOT NULL,
|
|
||||||
status TEXT NOT NULL,
|
|
||||||
message TEXT,
|
|
||||||
endpoint INTEGER,
|
|
||||||
redeploy_type TEXT
|
|
||||||
);
|
|
||||||
`;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
db.exec(createRedeployLogsTable);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const columns = db.prepare('PRAGMA table_info(redeploy_logs)').all();
|
|
||||||
const hasRedeployType = columns.some((column) => column.name === 'redeploy_type');
|
|
||||||
if (!hasRedeployType) {
|
|
||||||
db.exec('ALTER TABLE redeploy_logs ADD COLUMN redeploy_type TEXT');
|
|
||||||
console.log('ℹ️ redeploy_type column hinzugefügt');
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error('⚠️ Konnte redeploy_type Spalte nicht prüfen/erstellen:', err.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('✅ redeploy_logs table ready');
|
|
||||||
|
|
||||||
const createSettingsTable = `
|
|
||||||
CREATE TABLE IF NOT EXISTS settings (
|
|
||||||
key TEXT PRIMARY KEY,
|
|
||||||
value TEXT,
|
|
||||||
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
||||||
)
|
|
||||||
`;
|
|
||||||
|
|
||||||
db.exec(createSettingsTable);
|
|
||||||
|
|
||||||
console.log('✅ settings table ready');
|
|
||||||
|
|
||||||
|
|
||||||
db.close();
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
import { db } from './index.js';
|
|
||||||
|
|
||||||
const valueToArray = (value) => {
|
|
||||||
if (!value && value !== 0) return [];
|
|
||||||
const base = Array.isArray(value) ? value : [value];
|
|
||||||
return base
|
|
||||||
.flatMap((entry) => String(entry).split(','))
|
|
||||||
.map((entry) => entry.trim())
|
|
||||||
.filter(Boolean);
|
|
||||||
};
|
|
||||||
|
|
||||||
const singleValue = (value) => {
|
|
||||||
if (value === undefined || value === null) return undefined;
|
|
||||||
return Array.isArray(value) ? value[0] : value;
|
|
||||||
};
|
|
||||||
|
|
||||||
export function buildLogFilter(queryParams = {}) {
|
|
||||||
const filters = [];
|
|
||||||
const params = {};
|
|
||||||
|
|
||||||
const ids = valueToArray(queryParams.ids ?? queryParams.id)
|
|
||||||
.map((entry) => Number(entry))
|
|
||||||
.filter((value) => !Number.isNaN(value));
|
|
||||||
if (ids.length) {
|
|
||||||
const placeholders = ids.map((_, idx) => `@id${idx}`);
|
|
||||||
filters.push(`id IN (${placeholders.join(', ')})`);
|
|
||||||
ids.forEach((value, idx) => {
|
|
||||||
params[`id${idx}`] = value;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const stackIds = valueToArray(queryParams.stackIds ?? queryParams.stackId);
|
|
||||||
if (stackIds.length) {
|
|
||||||
const placeholders = stackIds.map((_, idx) => `@stackId${idx}`);
|
|
||||||
filters.push(`stack_id IN (${placeholders.join(', ')})`);
|
|
||||||
stackIds.forEach((stack, idx) => {
|
|
||||||
params[`stackId${idx}`] = stack;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const statuses = valueToArray(queryParams.statuses ?? queryParams.status);
|
|
||||||
if (statuses.length) {
|
|
||||||
const placeholders = statuses.map((_, idx) => `@status${idx}`);
|
|
||||||
filters.push(`status IN (${placeholders.join(', ')})`);
|
|
||||||
statuses.forEach((entry, idx) => {
|
|
||||||
params[`status${idx}`] = entry;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const endpoints = valueToArray(queryParams.endpoints ?? queryParams.endpoint);
|
|
||||||
if (endpoints.length) {
|
|
||||||
const placeholders = endpoints.map((_, idx) => `@endpoint${idx}`);
|
|
||||||
filters.push(`endpoint IN (${placeholders.join(', ')})`);
|
|
||||||
endpoints.forEach((entry, idx) => {
|
|
||||||
const numeric = Number(entry);
|
|
||||||
params[`endpoint${idx}`] = Number.isNaN(numeric) ? entry : numeric;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const redeployTypes = valueToArray(queryParams.redeployTypes ?? queryParams.redeployType);
|
|
||||||
if (redeployTypes.length) {
|
|
||||||
const placeholders = redeployTypes.map((_, idx) => `@redeployType${idx}`);
|
|
||||||
filters.push(`redeploy_type IN (${placeholders.join(', ')})`);
|
|
||||||
redeployTypes.forEach((entry, idx) => {
|
|
||||||
params[`redeployType${idx}`] = entry;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const messageQuery = singleValue(queryParams.message);
|
|
||||||
if (messageQuery && String(messageQuery).trim()) {
|
|
||||||
filters.push('message LIKE @message');
|
|
||||||
params.message = `%${String(messageQuery).trim()}%`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const from = singleValue(queryParams.from);
|
|
||||||
if (from) {
|
|
||||||
filters.push('timestamp >= @from');
|
|
||||||
params.from = from;
|
|
||||||
}
|
|
||||||
|
|
||||||
const to = singleValue(queryParams.to);
|
|
||||||
if (to) {
|
|
||||||
filters.push('timestamp <= @to');
|
|
||||||
params.to = to;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
whereClause: filters.length ? `WHERE ${filters.join(' AND ')}` : '',
|
|
||||||
params,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const insertRedeployLogStmt = db.prepare(`
|
|
||||||
INSERT INTO redeploy_logs (stack_id, stack_name, status, message, endpoint, redeploy_type)
|
|
||||||
VALUES (@stackId, @stackName, @status, @message, @endpoint, @redeployType)
|
|
||||||
`);
|
|
||||||
|
|
||||||
export function logRedeployEvent({ stackId, stackName, status, message = null, endpoint = null, redeployType = null }) {
|
|
||||||
try {
|
|
||||||
insertRedeployLogStmt.run({
|
|
||||||
stackId: String(stackId),
|
|
||||||
stackName: stackName ?? 'Unknown',
|
|
||||||
status,
|
|
||||||
message,
|
|
||||||
endpoint,
|
|
||||||
redeployType: redeployType ?? null
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
console.error('❌ Fehler beim Speichern des Redeploy-Logs:', err.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function deleteLogById(id) {
|
|
||||||
const stmt = db.prepare('DELETE FROM redeploy_logs WHERE id = ?');
|
|
||||||
const info = stmt.run(id);
|
|
||||||
return info.changes || 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function deleteLogsByFilters(queryParams = {}) {
|
|
||||||
const { whereClause, params } = buildLogFilter(queryParams);
|
|
||||||
const stmt = db.prepare(`DELETE FROM redeploy_logs ${whereClause}`);
|
|
||||||
const info = stmt.run(params);
|
|
||||||
return info.changes || 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function exportLogsByFilters(queryParams = {}, format = 'txt') {
|
|
||||||
const { whereClause, params } = buildLogFilter(queryParams);
|
|
||||||
const rows = db.prepare(`
|
|
||||||
SELECT id, timestamp, stack_id AS stackId, stack_name AS stackName, status, message, endpoint, redeploy_type AS redeployType
|
|
||||||
FROM redeploy_logs
|
|
||||||
${whereClause}
|
|
||||||
ORDER BY datetime(timestamp) DESC
|
|
||||||
`).all(params);
|
|
||||||
|
|
||||||
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
||||||
|
|
||||||
if (format === 'sql') {
|
|
||||||
const statements = rows.map((row) => {
|
|
||||||
const columns = ['id', 'timestamp', 'stack_id', 'stack_name', 'status', 'message', 'endpoint', 'redeploy_type'];
|
|
||||||
const values = [
|
|
||||||
row.id,
|
|
||||||
row.timestamp,
|
|
||||||
row.stackId,
|
|
||||||
row.stackName,
|
|
||||||
row.status,
|
|
||||||
row.message,
|
|
||||||
row.endpoint,
|
|
||||||
row.redeployType
|
|
||||||
].map((value) => {
|
|
||||||
if (value === null || value === undefined) return 'NULL';
|
|
||||||
return `'${String(value).replace(/'/g, "''")}'`;
|
|
||||||
});
|
|
||||||
return `INSERT INTO redeploy_logs (${columns.join(', ')}) VALUES (${values.join(', ')});`;
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
filename: `redeploy-logs-${timestamp}.sql`,
|
|
||||||
contentType: 'application/sql; charset=utf-8',
|
|
||||||
content: statements.join('\n')
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const lines = rows.map((row) => {
|
|
||||||
const parts = [
|
|
||||||
`[${row.id}]`,
|
|
||||||
row.timestamp,
|
|
||||||
`Stack: ${row.stackName ?? 'Unbekannt'} (ID: ${row.stackId})`,
|
|
||||||
`Status: ${row.status}`,
|
|
||||||
`Endpoint: ${row.endpoint ?? '-'}`,
|
|
||||||
`Nachricht: ${row.message ?? '-'}`,
|
|
||||||
`Redeploy: ${row.redeployType ?? '-'}`
|
|
||||||
];
|
|
||||||
return parts.join(' | ');
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
filename: `redeploy-logs-${timestamp}.txt`,
|
|
||||||
contentType: 'text/plain; charset=utf-8',
|
|
||||||
content: lines.join('\n')
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
import { db } from './index.js';
|
|
||||||
|
|
||||||
const getSettingStmt = db.prepare('SELECT key, value, updated_at FROM settings WHERE key = ?');
|
|
||||||
const setSettingStmt = db.prepare(`
|
|
||||||
INSERT INTO settings (key, value, updated_at)
|
|
||||||
VALUES (@key, @value, CURRENT_TIMESTAMP)
|
|
||||||
ON CONFLICT(key) DO UPDATE SET
|
|
||||||
value = excluded.value,
|
|
||||||
updated_at = CURRENT_TIMESTAMP
|
|
||||||
`);
|
|
||||||
const deleteSettingStmt = db.prepare('DELETE FROM settings WHERE key = ?');
|
|
||||||
|
|
||||||
export function getSetting(key) {
|
|
||||||
try {
|
|
||||||
return getSettingStmt.get(key) || null;
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`❌ [Settings] Fehler beim Lesen des Settings "${key}":`, err.message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setSetting(key, value) {
|
|
||||||
try {
|
|
||||||
setSettingStmt.run({ key, value });
|
|
||||||
return true;
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`❌ [Settings] Fehler beim Speichern des Settings "${key}":`, err.message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function deleteSetting(key) {
|
|
||||||
try {
|
|
||||||
deleteSettingStmt.run(key);
|
|
||||||
return true;
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`❌ [Settings] Fehler beim Löschen des Settings "${key}":`, err.message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getJsonSetting(key, defaultValue = null) {
|
|
||||||
const row = getSetting(key);
|
|
||||||
if (!row || row.value === null || row.value === undefined) return defaultValue;
|
|
||||||
try {
|
|
||||||
return JSON.parse(row.value);
|
|
||||||
} catch (err) {
|
|
||||||
console.warn(`⚠️ [Settings] Konnte JSON für Setting "${key}" nicht parsen:`, err.message);
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setJsonSetting(key, value) {
|
|
||||||
try {
|
|
||||||
const payload = value === undefined ? null : JSON.stringify(value);
|
|
||||||
return setSetting(key, payload);
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`❌ [Settings] Fehler beim Serialisieren von Setting "${key}":`, err.message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "🔧 Starte Migration (idempotent)..."
|
|
||||||
node db/migrate.js
|
|
||||||
|
|
||||||
echo "✅ Migration abgeschlossen. Starte Anwendung..."
|
|
||||||
exec "$@"
|
|
||||||
+1429
File diff suppressed because it is too large
Load Diff
-1856
File diff suppressed because it is too large
Load Diff
@@ -1,63 +0,0 @@
|
|||||||
import { getJsonSetting, setJsonSetting } from '../db/settings.js';
|
|
||||||
|
|
||||||
const MAINTENANCE_KEY = 'maintenance_mode';
|
|
||||||
|
|
||||||
const DEFAULT_STATE = {
|
|
||||||
active: false,
|
|
||||||
message: null,
|
|
||||||
activatedAt: null,
|
|
||||||
updatedAt: null,
|
|
||||||
extra: null
|
|
||||||
};
|
|
||||||
|
|
||||||
let maintenanceState = loadState();
|
|
||||||
|
|
||||||
function loadState() {
|
|
||||||
const saved = getJsonSetting(MAINTENANCE_KEY, null);
|
|
||||||
if (!saved) {
|
|
||||||
const initial = { ...DEFAULT_STATE, updatedAt: new Date().toISOString() };
|
|
||||||
setJsonSetting(MAINTENANCE_KEY, initial);
|
|
||||||
return initial;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
...DEFAULT_STATE,
|
|
||||||
...saved
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function persistState(state) {
|
|
||||||
maintenanceState = {
|
|
||||||
...DEFAULT_STATE,
|
|
||||||
...state,
|
|
||||||
updatedAt: new Date().toISOString()
|
|
||||||
};
|
|
||||||
setJsonSetting(MAINTENANCE_KEY, maintenanceState);
|
|
||||||
return maintenanceState;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getMaintenanceState() {
|
|
||||||
return { ...maintenanceState };
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isMaintenanceModeActive() {
|
|
||||||
return Boolean(maintenanceState?.active);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function activateMaintenanceMode({ message = null, extra = null } = {}) {
|
|
||||||
const now = new Date().toISOString();
|
|
||||||
return persistState({
|
|
||||||
active: true,
|
|
||||||
message,
|
|
||||||
extra,
|
|
||||||
activatedAt: now
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function deactivateMaintenanceMode({ message = null } = {}) {
|
|
||||||
return persistState({
|
|
||||||
active: false,
|
|
||||||
message,
|
|
||||||
extra: null,
|
|
||||||
activatedAt: null
|
|
||||||
});
|
|
||||||
}
|
|
||||||
Generated
-1924
File diff suppressed because it is too large
Load Diff
@@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "backend",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"start": "node index.js",
|
|
||||||
"migrate": "node db/migrate.js"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"axios": "^1.7.0",
|
|
||||||
"better-sqlite3": "^9.6.0",
|
|
||||||
"dockerode": "^4.0.7",
|
|
||||||
"dotenv": "^16.0.0",
|
|
||||||
"express": "^4.18.0",
|
|
||||||
"socket.io": "^4.8.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
|
Before Width: | Height: | Size: 156 KiB |
@@ -1,42 +0,0 @@
|
|||||||
<!--
|
|
||||||
=========================================================
|
|
||||||
* Material Tailwind Dashboard React - v2.1.0
|
|
||||||
=========================================================
|
|
||||||
* Product Page: https://www.creative-tim.com/product/material-tailwind-dashboard-react
|
|
||||||
* Copyright 2023 Creative Tim (https://www.creative-tim.com)
|
|
||||||
* Licensed under MIT (https://github.com/creativetimofficial/material-tailwind-dashboard-react/blob/main/LICENSE.md)
|
|
||||||
* Coded by Creative Tim
|
|
||||||
=========================================================
|
|
||||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
-->
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<link rel="icon" type="image/svg+xml" href="/img/favicon.png" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Material Tailwind Dashboard React | By Creative Tim</title>
|
|
||||||
<link
|
|
||||||
href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700;900&display=swap"
|
|
||||||
rel="stylesheet"
|
|
||||||
/>
|
|
||||||
<link
|
|
||||||
rel="stylesheet"
|
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"
|
|
||||||
integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A=="
|
|
||||||
crossorigin="anonymous"
|
|
||||||
referrerpolicy="no-referrer"
|
|
||||||
/>
|
|
||||||
<script defer data-site="YOUR_DOMAIN_HERE" src="https://api.nepcha.com/js/nepcha-analytics.js"></script>
|
|
||||||
|
|
||||||
<!-- Nepcha Analytics (nepcha.com) -->
|
|
||||||
<!-- Nepcha is a easy-to-use web analytics. No cookies and fully compliant with GDPR, CCPA and PECR. -->
|
|
||||||
<script defer data-site="YOUR_DOMAIN_HERE" src="https://api.nepcha.com/js/nepcha-analytics.js"></script>
|
|
||||||
<script type="module" crossorigin src="/assets/index-12a5cbeb.js"></script>
|
|
||||||
<link rel="stylesheet" href="/assets/index-c94d5694.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="root"></div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
version: '3.8'
|
|
||||||
services:
|
|
||||||
app:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
ports:
|
|
||||||
- "4001:4001"
|
|
||||||
volumes:
|
|
||||||
- stackpulse_data:/app/backend/data
|
|
||||||
environment:
|
|
||||||
PORTAINER_URL: "Your_Portainer_Server_Address"
|
|
||||||
PORTAINER_API_KEY: "Your_Portainer_API_Key"
|
|
||||||
PORTAINER_ENDPOINT_ID: "Your_Portainer_Endpoint_ID"
|
|
||||||
SELF_STACK_ID: "Stackpulse ID"
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
stackpulse_data:
|
|
||||||
+1082
-36
File diff suppressed because it is too large
Load Diff
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
|
||||||
"@/*": ["src/*"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "material-tailwind-dashboard-react",
|
|
||||||
"private": true,
|
|
||||||
"version": "2.1.0",
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "vite",
|
|
||||||
"build": "vite build",
|
|
||||||
"preview": "vite preview"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"axios": "1.7.5",
|
|
||||||
"socket.io-client": "4.8.1",
|
|
||||||
"@heroicons/react": "2.0.18",
|
|
||||||
"@material-tailwind/react": "2.1.4",
|
|
||||||
"apexcharts": "3.44.0",
|
|
||||||
"prop-types": "15.8.1",
|
|
||||||
"react": "18.2.0",
|
|
||||||
"react-apexcharts": "1.4.1",
|
|
||||||
"react-dom": "18.2.0",
|
|
||||||
"react-router-dom": "6.17.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/react": "18.2.31",
|
|
||||||
"@types/react-dom": "18.2.14",
|
|
||||||
"@vitejs/plugin-react": "4.1.0",
|
|
||||||
"autoprefixer": "10.4.16",
|
|
||||||
"postcss": "8.4.31",
|
|
||||||
"prettier": "3.0.3",
|
|
||||||
"prettier-plugin-tailwindcss": "0.5.6",
|
|
||||||
"tailwindcss": "3.3.4",
|
|
||||||
"vite": "4.5.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
plugins: {
|
|
||||||
tailwindcss: {},
|
|
||||||
autoprefixer: {},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
tailwindConfig: "./tailwind.config.cjs",
|
|
||||||
plugins: [require("prettier-plugin-tailwindcss")],
|
|
||||||
};
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import { Routes, Route, Navigate } from "react-router-dom";
|
|
||||||
import { Dashboard, Auth } from "@/layouts";
|
|
||||||
|
|
||||||
function App() {
|
|
||||||
return (
|
|
||||||
<Routes>
|
|
||||||
<Route path="/dashboard/*" element={<Dashboard />} />
|
|
||||||
<Route path="/auth/*" element={<Auth />} />
|
|
||||||
<Route path="*" element={<Navigate to="/dashboard/stacks" replace />} />
|
|
||||||
</Routes>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default App;
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 156 KiB |
@@ -1,166 +0,0 @@
|
|||||||
import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
const MaintenanceContext = createContext(null);
|
|
||||||
|
|
||||||
const INITIAL_STATE = {
|
|
||||||
maintenance: null,
|
|
||||||
update: null,
|
|
||||||
script: null,
|
|
||||||
ssh: null,
|
|
||||||
loading: true,
|
|
||||||
error: "",
|
|
||||||
lastUpdated: null
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function MaintenanceProvider({ children }) {
|
|
||||||
const [state, setState] = useState(INITIAL_STATE);
|
|
||||||
const pollingRef = useRef(null);
|
|
||||||
const wasRunningRef = useRef(false);
|
|
||||||
|
|
||||||
const applyState = useCallback((partial) => {
|
|
||||||
setState((prev) => ({
|
|
||||||
...prev,
|
|
||||||
...partial
|
|
||||||
}));
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const fetchConfig = useCallback(async () => {
|
|
||||||
applyState({ loading: true, error: "" });
|
|
||||||
try {
|
|
||||||
const response = await axios.get("/api/maintenance/config");
|
|
||||||
const data = response.data ?? {};
|
|
||||||
applyState({
|
|
||||||
maintenance: data.maintenance ?? null,
|
|
||||||
update: data.update ?? null,
|
|
||||||
script: data.script ?? null,
|
|
||||||
ssh: data.ssh ?? null,
|
|
||||||
loading: false,
|
|
||||||
error: "",
|
|
||||||
lastUpdated: new Date()
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
const message = err.response?.data?.error || err.message || "Fehler beim Laden der Wartungsdaten";
|
|
||||||
applyState({ loading: false, error: message });
|
|
||||||
}
|
|
||||||
}, [applyState]);
|
|
||||||
|
|
||||||
const refreshUpdateStatus = useCallback(async () => {
|
|
||||||
try {
|
|
||||||
const response = await axios.get("/api/maintenance/update-status");
|
|
||||||
const data = response.data ?? {};
|
|
||||||
setState((prev) => ({
|
|
||||||
...prev,
|
|
||||||
maintenance: data.maintenance ?? prev.maintenance,
|
|
||||||
update: data.update ?? prev.update,
|
|
||||||
error: ""
|
|
||||||
}));
|
|
||||||
} catch (err) {
|
|
||||||
const message = err.response?.data?.error || err.message || "Fehler beim Aktualisieren des Wartungsstatus";
|
|
||||||
setState((prev) => ({ ...prev, error: message }));
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
fetchConfig();
|
|
||||||
}, [fetchConfig]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (state.update?.running) {
|
|
||||||
refreshUpdateStatus();
|
|
||||||
const intervalId = setInterval(() => {
|
|
||||||
refreshUpdateStatus();
|
|
||||||
}, 5000);
|
|
||||||
pollingRef.current = intervalId;
|
|
||||||
return () => clearInterval(intervalId);
|
|
||||||
}
|
|
||||||
if (pollingRef.current) {
|
|
||||||
clearInterval(pollingRef.current);
|
|
||||||
pollingRef.current = null;
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}, [state.update?.running, refreshUpdateStatus]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const currentlyRunning = Boolean(state.update?.running);
|
|
||||||
if (!currentlyRunning && wasRunningRef.current) {
|
|
||||||
fetchConfig();
|
|
||||||
}
|
|
||||||
wasRunningRef.current = currentlyRunning;
|
|
||||||
}, [state.update?.running, fetchConfig]);
|
|
||||||
|
|
||||||
const triggerUpdate = useCallback(async (payload = {}) => {
|
|
||||||
await axios.post("/api/maintenance/portainer-update", payload);
|
|
||||||
await refreshUpdateStatus();
|
|
||||||
}, [refreshUpdateStatus]);
|
|
||||||
|
|
||||||
const saveScript = useCallback(async (script) => {
|
|
||||||
await axios.put("/api/maintenance/update-script", { script });
|
|
||||||
await fetchConfig();
|
|
||||||
}, [fetchConfig]);
|
|
||||||
|
|
||||||
const resetScript = useCallback(async () => {
|
|
||||||
await axios.delete("/api/maintenance/update-script");
|
|
||||||
await fetchConfig();
|
|
||||||
}, [fetchConfig]);
|
|
||||||
|
|
||||||
const saveSshConfig = useCallback(async (config) => {
|
|
||||||
await axios.put("/api/maintenance/ssh-config", config);
|
|
||||||
await fetchConfig();
|
|
||||||
}, [fetchConfig]);
|
|
||||||
|
|
||||||
const deleteSshConfig = useCallback(async () => {
|
|
||||||
await axios.delete("/api/maintenance/ssh-config");
|
|
||||||
await fetchConfig();
|
|
||||||
}, [fetchConfig]);
|
|
||||||
|
|
||||||
const setMaintenanceMode = useCallback(async ({ active, message } = {}) => {
|
|
||||||
const payload = { active: Boolean(active) };
|
|
||||||
if (message !== undefined) {
|
|
||||||
payload.message = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await axios.post("/api/maintenance/mode", payload);
|
|
||||||
const nextMaintenance = response.data?.maintenance ?? null;
|
|
||||||
applyState({ maintenance: nextMaintenance, error: "" });
|
|
||||||
return nextMaintenance;
|
|
||||||
}, [applyState]);
|
|
||||||
|
|
||||||
const testSshConnection = useCallback(async (config) => {
|
|
||||||
const response = await axios.post("/api/maintenance/test-ssh", config ?? {});
|
|
||||||
return response.data;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const value = useMemo(() => ({
|
|
||||||
maintenance: state.maintenance,
|
|
||||||
update: state.update,
|
|
||||||
script: state.script,
|
|
||||||
ssh: state.ssh,
|
|
||||||
loading: state.loading,
|
|
||||||
error: state.error,
|
|
||||||
lastUpdated: state.lastUpdated,
|
|
||||||
refreshConfig: fetchConfig,
|
|
||||||
refreshUpdateStatus,
|
|
||||||
setMaintenanceMode,
|
|
||||||
triggerUpdate,
|
|
||||||
saveScript,
|
|
||||||
resetScript,
|
|
||||||
saveSshConfig,
|
|
||||||
deleteSshConfig,
|
|
||||||
testSshConnection
|
|
||||||
}), [state, fetchConfig, refreshUpdateStatus, setMaintenanceMode, triggerUpdate, saveScript, resetScript, saveSshConfig, deleteSshConfig, testSshConnection]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<MaintenanceContext.Provider value={value}>
|
|
||||||
{children}
|
|
||||||
</MaintenanceContext.Provider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function useMaintenance() {
|
|
||||||
const context = useContext(MaintenanceContext);
|
|
||||||
if (!context) {
|
|
||||||
throw new Error('useMaintenance must be used within a MaintenanceProvider');
|
|
||||||
}
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
@@ -1,253 +0,0 @@
|
|||||||
import React, { createContext, useCallback, useContext, useMemo, useRef, useState } from "react";
|
|
||||||
|
|
||||||
const DEFAULT_PER_PAGE_OPTIONS = [
|
|
||||||
{ value: "10", label: "10" },
|
|
||||||
{ value: "25", label: "25" },
|
|
||||||
{ value: "50", label: "50" },
|
|
||||||
{ value: "100", label: "100" },
|
|
||||||
{ value: "all", label: "Alle" }
|
|
||||||
];
|
|
||||||
|
|
||||||
const DEFAULT_PER_PAGE = "50";
|
|
||||||
|
|
||||||
const PageContext = createContext(null);
|
|
||||||
|
|
||||||
const normalizeNumber = (value, fallback) => {
|
|
||||||
const numeric = Number(value);
|
|
||||||
if (Number.isFinite(numeric) && numeric > 0) {
|
|
||||||
return numeric;
|
|
||||||
}
|
|
||||||
const fallbackNumeric = Number(fallback);
|
|
||||||
if (Number.isFinite(fallbackNumeric) && fallbackNumeric > 0) {
|
|
||||||
return fallbackNumeric;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
export function PageProvider({
|
|
||||||
children,
|
|
||||||
initialPage = 1,
|
|
||||||
initialPerPage = DEFAULT_PER_PAGE,
|
|
||||||
perPageOptions = DEFAULT_PER_PAGE_OPTIONS
|
|
||||||
}) {
|
|
||||||
const [page, setPage] = useState(initialPage);
|
|
||||||
const [perPage, setPerPage] = useState(initialPerPage);
|
|
||||||
const [totalItems, setTotalItems] = useState(0);
|
|
||||||
const [visibleItems, setVisibleItems] = useState(0);
|
|
||||||
|
|
||||||
const initialPageRef = useRef(initialPage);
|
|
||||||
const initialPerPageRef = useRef(initialPerPage);
|
|
||||||
|
|
||||||
const validPerPageValues = useMemo(() => new Set(
|
|
||||||
perPageOptions.map((option) => String(option.value))
|
|
||||||
), [perPageOptions]);
|
|
||||||
|
|
||||||
const perPageIsAll = perPage === "all";
|
|
||||||
|
|
||||||
const resolvePerPageNumber = useCallback(() => {
|
|
||||||
if (perPageIsAll) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return normalizeNumber(perPage, initialPerPage);
|
|
||||||
}, [perPage, perPageIsAll, initialPerPage]);
|
|
||||||
|
|
||||||
const updateTotals = useCallback((total, visible) => {
|
|
||||||
setTotalItems(Math.max(0, Number(total) || 0));
|
|
||||||
setVisibleItems(Math.max(0, Number(visible) || 0));
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const resetPagination = useCallback(() => {
|
|
||||||
setPage(initialPageRef.current ?? 1);
|
|
||||||
setPerPage(initialPerPageRef.current ?? DEFAULT_PER_PAGE);
|
|
||||||
setTotalItems(0);
|
|
||||||
setVisibleItems(0);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const setPerPageValue = useCallback((value, { resetPage = true } = {}) => {
|
|
||||||
if (value === undefined || value === null) return;
|
|
||||||
const nextValue = String(value);
|
|
||||||
if (!validPerPageValues.has(nextValue)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setPerPage(nextValue);
|
|
||||||
if (resetPage) {
|
|
||||||
setPage(1);
|
|
||||||
}
|
|
||||||
}, [validPerPageValues]);
|
|
||||||
|
|
||||||
const handlePerPageChange = useCallback((eventOrValue) => {
|
|
||||||
const nextValue = typeof eventOrValue === "string"
|
|
||||||
? eventOrValue
|
|
||||||
: eventOrValue?.target?.value;
|
|
||||||
setPerPageValue(nextValue, { resetPage: true });
|
|
||||||
}, [setPerPageValue]);
|
|
||||||
|
|
||||||
const handlePageChange = useCallback((nextPage) => {
|
|
||||||
if (perPageIsAll) return;
|
|
||||||
|
|
||||||
const numericPage = Number(nextPage);
|
|
||||||
if (!Number.isFinite(numericPage) || numericPage < 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const perPageNumber = resolvePerPageNumber();
|
|
||||||
if (!perPageNumber) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const maxPages = Math.max(1, Math.ceil((totalItems || 0) / perPageNumber));
|
|
||||||
if (numericPage > maxPages) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setPage(numericPage);
|
|
||||||
}, [perPageIsAll, resolvePerPageNumber, totalItems]);
|
|
||||||
|
|
||||||
const totalPages = useMemo(() => {
|
|
||||||
if (perPageIsAll) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
const perPageNumber = resolvePerPageNumber();
|
|
||||||
if (!perPageNumber) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return Math.max(1, Math.ceil((totalItems || 0) / perPageNumber));
|
|
||||||
}, [perPageIsAll, resolvePerPageNumber, totalItems]);
|
|
||||||
|
|
||||||
const rangeStart = useMemo(() => {
|
|
||||||
if (!totalItems) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (perPageIsAll) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
const perPageNumber = resolvePerPageNumber();
|
|
||||||
return (page - 1) * perPageNumber + 1;
|
|
||||||
}, [totalItems, perPageIsAll, resolvePerPageNumber, page]);
|
|
||||||
|
|
||||||
const rangeEnd = useMemo(() => {
|
|
||||||
if (!totalItems) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (perPageIsAll) {
|
|
||||||
return totalItems;
|
|
||||||
}
|
|
||||||
const perPageNumber = resolvePerPageNumber();
|
|
||||||
const estimatedEnd = (page - 1) * perPageNumber + (visibleItems || perPageNumber);
|
|
||||||
return Math.min(totalItems, estimatedEnd);
|
|
||||||
}, [totalItems, perPageIsAll, resolvePerPageNumber, page, visibleItems]);
|
|
||||||
|
|
||||||
const summaryLabel = useMemo(() => {
|
|
||||||
if (!totalItems) {
|
|
||||||
return "Keine Einträge";
|
|
||||||
}
|
|
||||||
if (perPageIsAll) {
|
|
||||||
return `Zeige alle ${totalItems.toLocaleString()} Einträge`;
|
|
||||||
}
|
|
||||||
return `Zeige ${rangeStart.toLocaleString()} – ${rangeEnd.toLocaleString()} von ${totalItems.toLocaleString()} Einträgen`;
|
|
||||||
}, [totalItems, perPageIsAll, rangeStart, rangeEnd]);
|
|
||||||
|
|
||||||
const value = useMemo(() => ({
|
|
||||||
page,
|
|
||||||
perPage,
|
|
||||||
perPageOptions,
|
|
||||||
perPageIsAll,
|
|
||||||
totalItems,
|
|
||||||
visibleItems,
|
|
||||||
totalPages,
|
|
||||||
rangeStart,
|
|
||||||
rangeEnd,
|
|
||||||
summaryLabel,
|
|
||||||
setPage,
|
|
||||||
setPerPage: setPerPageValue,
|
|
||||||
setTotals: updateTotals,
|
|
||||||
setTotalItems,
|
|
||||||
setVisibleItems,
|
|
||||||
handlePageChange,
|
|
||||||
handlePerPageChange,
|
|
||||||
validPerPageValues,
|
|
||||||
resetPagination
|
|
||||||
}), [
|
|
||||||
page,
|
|
||||||
perPage,
|
|
||||||
perPageOptions,
|
|
||||||
perPageIsAll,
|
|
||||||
totalItems,
|
|
||||||
visibleItems,
|
|
||||||
totalPages,
|
|
||||||
rangeStart,
|
|
||||||
rangeEnd,
|
|
||||||
summaryLabel,
|
|
||||||
updateTotals,
|
|
||||||
setPerPageValue,
|
|
||||||
handlePageChange,
|
|
||||||
handlePerPageChange,
|
|
||||||
validPerPageValues,
|
|
||||||
resetPagination
|
|
||||||
]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<PageContext.Provider value={value}>
|
|
||||||
{children}
|
|
||||||
</PageContext.Provider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function usePage() {
|
|
||||||
const context = useContext(PageContext);
|
|
||||||
if (!context) {
|
|
||||||
throw new Error("usePage must be used within a PageProvider");
|
|
||||||
}
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function PaginationControls({ disabled = false }) {
|
|
||||||
const {
|
|
||||||
summaryLabel,
|
|
||||||
perPageIsAll,
|
|
||||||
page,
|
|
||||||
totalPages,
|
|
||||||
handlePageChange
|
|
||||||
} = usePage();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="flex flex-wrap items-center justify-between gap-3">
|
|
||||||
<span>{summaryLabel}</span>
|
|
||||||
{!perPageIsAll && (
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<button
|
|
||||||
onClick={() => handlePageChange(page - 1)}
|
|
||||||
disabled={disabled || page <= 1}
|
|
||||||
className="rounded-md border border-slate-300 p-2.5 text-center text-sm transition-all shadow-sm hover:shadow-lg text-slate-600 hover:text-white hover:bg-slate-800 hover:border-slate-800 focus:text-white focus:bg-slate-800 focus:border-slate-800 active:border-slate-800 active:text-white active:bg-slate-800 disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" className="h-4 w-4">
|
|
||||||
<path d="M11.03 3.97a.75.75 0 0 1 0 1.06l-6.22 6.22H21a.75.75 0 0 1 0 1.5H4.81l6.22 6.22a.75.75 0 1 1-1.06 1.06l-7.5-7.5a.75.75 0 0 1 0-1.06l7.5-7.5a.75.75 0 0 1 1.06 0Z" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<p className="text-slate-600">
|
|
||||||
Seite <strong className="text-slate-800">{page}</strong> /
|
|
||||||
<strong className="text-slate-800">{totalPages}</strong>
|
|
||||||
</p>
|
|
||||||
<button
|
|
||||||
onClick={() => handlePageChange(page + 1)}
|
|
||||||
disabled={disabled || page >= totalPages}
|
|
||||||
className="rounded-md border border-slate-300 p-2.5 text-center text-sm transition-all shadow-sm hover:shadow-lg text-slate-600 hover:text-white hover:bg-slate-800 hover:border-slate-800 focus:text-white focus:bg-slate-800 focus:border-slate-800 active:border-slate-800 active:text-white active:bg-slate-800 disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" className="h-4 w-4">
|
|
||||||
<path d="M12.97 3.97a.75.75 0 0 1 1.06 0l7.5 7.5a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 1 1-1.06-1.06l6.22-6.22H3a.75.75 0 0 1 0-1.5h16.19l-6.22-6.22a.75.75 0 0 1 0-1.06Z" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export const PAGE_DEFAULTS = {
|
|
||||||
perPage: DEFAULT_PER_PAGE,
|
|
||||||
options: DEFAULT_PER_PAGE_OPTIONS
|
|
||||||
};
|
|
||||||
|
|
||||||
export default PageProvider;
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
||||||
|
|
||||||
const ToastContext = createContext(null);
|
|
||||||
|
|
||||||
const VARIANT_STYLES = {
|
|
||||||
success: {
|
|
||||||
container: "border-mossGreen-500/80 bg-mossGreen-900/90 text-white",
|
|
||||||
accent: "bg-mossGreen-400"
|
|
||||||
},
|
|
||||||
warning: {
|
|
||||||
container: "border-warmAmberGlow-500/80 bg-warmAmberGlow-900/90 text-white",
|
|
||||||
accent: "bg-warmAmberGlow-400"
|
|
||||||
},
|
|
||||||
error: {
|
|
||||||
container: "border-sunsetCoral-500/80 bg-sunsetCoral-900/90 text-white",
|
|
||||||
accent: "bg-sunsetCoral-400"
|
|
||||||
},
|
|
||||||
info: {
|
|
||||||
container: "border-arcticBlue-500 bg-arcticBlue-900/90 text-white",
|
|
||||||
accent: "bg-arcticBlue-400"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const DEFAULT_DURATION = 6000;
|
|
||||||
|
|
||||||
export default function ToastProvider({ children }) {
|
|
||||||
const [toasts, setToasts] = useState([]);
|
|
||||||
const timeoutsRef = useRef(new Map());
|
|
||||||
|
|
||||||
const dismissToast = useCallback((id) => {
|
|
||||||
setToasts((prev) => prev.filter((toast) => toast.id !== id));
|
|
||||||
|
|
||||||
const handle = timeoutsRef.current.get(id);
|
|
||||||
if (handle && typeof window !== "undefined") {
|
|
||||||
window.clearTimeout(handle);
|
|
||||||
}
|
|
||||||
timeoutsRef.current.delete(id);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const showToast = useCallback(({ id, title, description, variant = "info", duration = DEFAULT_DURATION } = {}) => {
|
|
||||||
const toastId = id ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
||||||
const normalizedVariant = VARIANT_STYLES[variant] ? variant : "info";
|
|
||||||
|
|
||||||
setToasts((prev) => {
|
|
||||||
const withoutExisting = prev.filter((toast) => toast.id !== toastId);
|
|
||||||
return [
|
|
||||||
...withoutExisting,
|
|
||||||
{
|
|
||||||
id: toastId,
|
|
||||||
title,
|
|
||||||
description,
|
|
||||||
variant: normalizedVariant
|
|
||||||
}
|
|
||||||
];
|
|
||||||
});
|
|
||||||
|
|
||||||
if (duration !== null && duration !== Infinity && typeof window !== "undefined") {
|
|
||||||
const timeoutHandle = window.setTimeout(() => {
|
|
||||||
dismissToast(toastId);
|
|
||||||
}, duration);
|
|
||||||
|
|
||||||
const existingHandle = timeoutsRef.current.get(toastId);
|
|
||||||
if (existingHandle) {
|
|
||||||
window.clearTimeout(existingHandle);
|
|
||||||
}
|
|
||||||
timeoutsRef.current.set(toastId, timeoutHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
return toastId;
|
|
||||||
}, [dismissToast]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
return () => {
|
|
||||||
if (typeof window === "undefined") return;
|
|
||||||
timeoutsRef.current.forEach((handle) => window.clearTimeout(handle));
|
|
||||||
timeoutsRef.current.clear();
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const contextValue = useMemo(() => ({ showToast, dismissToast }), [showToast, dismissToast]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ToastContext.Provider value={contextValue}>
|
|
||||||
{children}
|
|
||||||
<div className="pointer-events-none fixed right-4 top-4 z-50 flex w-80 max-w-full flex-col gap-3">
|
|
||||||
{toasts.map((toast) => {
|
|
||||||
const styles = VARIANT_STYLES[toast.variant] ?? VARIANT_STYLES.info;
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
key={toast.id}
|
|
||||||
className={`pointer-events-auto overflow-hidden rounded-lg border px-4 py-3 shadow-xl backdrop-blur ${styles.container}`}
|
|
||||||
>
|
|
||||||
<div className="flex items-start gap-3">
|
|
||||||
<span className={`mt-1 h-2 flex-shrink-0 w-2 rounded-full ${styles.accent}`}></span>
|
|
||||||
<div className="flex-1">
|
|
||||||
{toast.title && <p className="text-sm font-semibold">{toast.title}</p>}
|
|
||||||
{toast.description && <p className="mt-1 text-sm leading-snug text-white/80">{toast.description}</p>}
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={() => dismissToast(toast.id)}
|
|
||||||
className="ml-2 rounded-md p-1 text-xs uppercase tracking-wide text-white/60 transition hover:text-white/90"
|
|
||||||
>
|
|
||||||
Schließen
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</ToastContext.Provider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function useToast() {
|
|
||||||
const context = useContext(ToastContext);
|
|
||||||
if (!context) {
|
|
||||||
throw new Error('useToast must be used within a ToastProvider');
|
|
||||||
}
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import PropTypes from "prop-types";
|
|
||||||
|
|
||||||
export const MaterialTailwind = React.createContext(null);
|
|
||||||
MaterialTailwind.displayName = "MaterialTailwindContext";
|
|
||||||
|
|
||||||
export function reducer(state, action) {
|
|
||||||
switch (action.type) {
|
|
||||||
case "OPEN_SIDENAV": {
|
|
||||||
return { ...state, openSidenav: action.value };
|
|
||||||
}
|
|
||||||
case "SIDENAV_TYPE": {
|
|
||||||
return { ...state, sidenavType: action.value };
|
|
||||||
}
|
|
||||||
case "SIDENAV_COLOR": {
|
|
||||||
return { ...state, sidenavColor: action.value };
|
|
||||||
}
|
|
||||||
case "TRANSPARENT_NAVBAR": {
|
|
||||||
return { ...state, transparentNavbar: action.value };
|
|
||||||
}
|
|
||||||
case "FIXED_NAVBAR": {
|
|
||||||
return { ...state, fixedNavbar: action.value };
|
|
||||||
}
|
|
||||||
case "OPEN_CONFIGURATOR": {
|
|
||||||
return { ...state, openConfigurator: action.value };
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
throw new Error(`Unhandled action type: ${action.type}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function MaterialTailwindControllerProvider({ children }) {
|
|
||||||
const initialState = {
|
|
||||||
openSidenav: false,
|
|
||||||
sidenavColor: "gray",
|
|
||||||
sidenavType: "white",
|
|
||||||
transparentNavbar: false,
|
|
||||||
fixedNavbar: true,
|
|
||||||
openConfigurator: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
const [controller, dispatch] = React.useReducer(reducer, initialState);
|
|
||||||
const value = React.useMemo(
|
|
||||||
() => [controller, dispatch],
|
|
||||||
[controller, dispatch]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<MaterialTailwind.Provider value={value}>
|
|
||||||
{children}
|
|
||||||
</MaterialTailwind.Provider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function useMaterialTailwindController() {
|
|
||||||
const context = React.useContext(MaterialTailwind);
|
|
||||||
|
|
||||||
if (!context) {
|
|
||||||
throw new Error(
|
|
||||||
"useMaterialTailwindController should be used inside the MaterialTailwindControllerProvider."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
MaterialTailwindControllerProvider.displayName = "/src/context/index.jsx";
|
|
||||||
|
|
||||||
MaterialTailwindControllerProvider.propTypes = {
|
|
||||||
children: PropTypes.node.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setOpenSidenav = (dispatch, value) =>
|
|
||||||
dispatch({ type: "OPEN_SIDENAV", value });
|
|
||||||
export const setSidenavType = (dispatch, value) =>
|
|
||||||
dispatch({ type: "SIDENAV_TYPE", value });
|
|
||||||
export const setSidenavColor = (dispatch, value) =>
|
|
||||||
dispatch({ type: "SIDENAV_COLOR", value });
|
|
||||||
export const setTransparentNavbar = (dispatch, value) =>
|
|
||||||
dispatch({ type: "TRANSPARENT_NAVBAR", value });
|
|
||||||
export const setFixedNavbar = (dispatch, value) =>
|
|
||||||
dispatch({ type: "FIXED_NAVBAR", value });
|
|
||||||
export const setOpenConfigurator = (dispatch, value) =>
|
|
||||||
dispatch({ type: "OPEN_CONFIGURATOR", value });
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
export const chartsConfig = {
|
|
||||||
chart: {
|
|
||||||
toolbar: {
|
|
||||||
show: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
title: {
|
|
||||||
show: "",
|
|
||||||
},
|
|
||||||
dataLabels: {
|
|
||||||
enabled: false,
|
|
||||||
},
|
|
||||||
xaxis: {
|
|
||||||
axisTicks: {
|
|
||||||
show: false,
|
|
||||||
},
|
|
||||||
axisBorder: {
|
|
||||||
show: false,
|
|
||||||
},
|
|
||||||
labels: {
|
|
||||||
style: {
|
|
||||||
colors: "#37474f",
|
|
||||||
fontSize: "13px",
|
|
||||||
fontFamily: "inherit",
|
|
||||||
fontWeight: 300,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
yaxis: {
|
|
||||||
labels: {
|
|
||||||
style: {
|
|
||||||
colors: "#37474f",
|
|
||||||
fontSize: "13px",
|
|
||||||
fontFamily: "inherit",
|
|
||||||
fontWeight: 300,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
show: true,
|
|
||||||
borderColor: "#dddddd",
|
|
||||||
strokeDashArray: 5,
|
|
||||||
xaxis: {
|
|
||||||
lines: {
|
|
||||||
show: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
padding: {
|
|
||||||
top: 5,
|
|
||||||
right: 20,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
fill: {
|
|
||||||
opacity: 0.8,
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
theme: "dark",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default chartsConfig;
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export * from "@/configs/charts-config";
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
export const authorsTableData = [
|
|
||||||
{
|
|
||||||
img: "/img/team-2.jpeg",
|
|
||||||
name: "John Michael",
|
|
||||||
email: "john@creative-tim.com",
|
|
||||||
job: ["Manager", "Organization"],
|
|
||||||
online: true,
|
|
||||||
date: "23/04/18",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/team-1.jpeg",
|
|
||||||
name: "Alexa Liras",
|
|
||||||
email: "alexa@creative-tim.com",
|
|
||||||
job: ["Programator", "Developer"],
|
|
||||||
online: false,
|
|
||||||
date: "11/01/19",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/team-4.jpeg",
|
|
||||||
name: "Laurent Perrier",
|
|
||||||
email: "laurent@creative-tim.com",
|
|
||||||
job: ["Executive", "Projects"],
|
|
||||||
online: true,
|
|
||||||
date: "19/09/17",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/team-3.jpeg",
|
|
||||||
name: "Michael Levi",
|
|
||||||
email: "michael@creative-tim.com",
|
|
||||||
job: ["Programator", "Developer"],
|
|
||||||
online: true,
|
|
||||||
date: "24/12/08",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/bruce-mars.jpeg",
|
|
||||||
name: "Bruce Mars",
|
|
||||||
email: "bruce@creative-tim.com",
|
|
||||||
job: ["Manager", "Executive"],
|
|
||||||
online: false,
|
|
||||||
date: "04/10/21",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/team-2.jpeg",
|
|
||||||
name: "Alexander",
|
|
||||||
email: "alexander@creative-tim.com",
|
|
||||||
job: ["Programator", "Developer"],
|
|
||||||
online: false,
|
|
||||||
date: "14/09/20",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default authorsTableData;
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
export const conversationsData = [
|
|
||||||
{
|
|
||||||
img: "/img/team-1.jpeg",
|
|
||||||
name: "Sophie B.",
|
|
||||||
message: "Hi! I need more information...",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/team-2.jpeg",
|
|
||||||
name: "Alexander",
|
|
||||||
message: "Awesome work, can you...",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/team-3.jpeg",
|
|
||||||
name: "Ivanna",
|
|
||||||
message: "About files I can...",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/team-4.jpeg",
|
|
||||||
name: "Peterson",
|
|
||||||
message: "Have a great afternoon...",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/bruce-mars.jpeg",
|
|
||||||
name: "Bruce Mars",
|
|
||||||
message: "Hi! I need more information...",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default conversationsData;
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
export * from "@/data/statistics-cards-data";
|
|
||||||
export * from "@/data/statistics-charts-data";
|
|
||||||
export * from "@/data/projects-table-data";
|
|
||||||
export * from "@/data/orders-overview-data";
|
|
||||||
export * from "@/data/platform-settings-data";
|
|
||||||
export * from "@/data/conversations-data";
|
|
||||||
export * from "@/data/projects-data";
|
|
||||||
export * from "@/data/authors-table-data";
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import {
|
|
||||||
BellIcon,
|
|
||||||
PlusCircleIcon,
|
|
||||||
ShoppingCartIcon,
|
|
||||||
CreditCardIcon,
|
|
||||||
LockOpenIcon,
|
|
||||||
BanknotesIcon,
|
|
||||||
} from "@heroicons/react/24/solid";
|
|
||||||
|
|
||||||
export const ordersOverviewData = [
|
|
||||||
{
|
|
||||||
icon: BellIcon,
|
|
||||||
color: "text-blue-gray-300",
|
|
||||||
title: "$2400, Design changes",
|
|
||||||
description: "22 DEC 7:20 PM",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: PlusCircleIcon,
|
|
||||||
color: "text-blue-gray-300",
|
|
||||||
title: "New order #1832412",
|
|
||||||
description: "21 DEC 11 PM",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: ShoppingCartIcon,
|
|
||||||
color: "text-blue-gray-300",
|
|
||||||
title: "Server payments for April",
|
|
||||||
description: "21 DEC 9:34 PM",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: CreditCardIcon,
|
|
||||||
color: "text-blue-gray-300",
|
|
||||||
title: "New card added for order #4395133",
|
|
||||||
description: "20 DEC 2:20 AM",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: LockOpenIcon,
|
|
||||||
color: "text-blue-gray-300",
|
|
||||||
title: "Unlock packages for development",
|
|
||||||
description: "18 DEC 4:54 AM",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: BanknotesIcon,
|
|
||||||
color: "text-blue-gray-300",
|
|
||||||
title: "New order #9583120",
|
|
||||||
description: "17 DEC",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default ordersOverviewData;
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
export const platformSettingsData = [
|
|
||||||
{
|
|
||||||
title: "account",
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
checked: true,
|
|
||||||
label: "Email me when someone follows me",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
checked: false,
|
|
||||||
label: "Email me when someone answers on my post",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
checked: true,
|
|
||||||
label: "Email me when someone mentions me",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "application",
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
checked: false,
|
|
||||||
label: "New launches and projects",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
checked: true,
|
|
||||||
label: "Monthly product updates",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
checked: false,
|
|
||||||
label: "Subscribe to newsletter",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default platformSettingsData;
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
export const projectsData = [
|
|
||||||
{
|
|
||||||
img: "/img/home-decor-1.jpeg",
|
|
||||||
title: "Modern",
|
|
||||||
tag: "Project #1",
|
|
||||||
description:
|
|
||||||
"As Uber works through a huge amount of internal management turmoil.",
|
|
||||||
route: "/dashboard/profile",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
{ img: "/img/team-2.jpeg", name: "Ryan Tompson" },
|
|
||||||
{ img: "/img/team-3.jpeg", name: "Jessica Doe" },
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/home-decor-2.jpeg",
|
|
||||||
title: "Scandinavian",
|
|
||||||
tag: "Project #2",
|
|
||||||
description:
|
|
||||||
"Music is something that every person has his or her own specific opinion about.",
|
|
||||||
route: "/dashboard/profile",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
{ img: "/img/team-3.jpeg", name: "Jessica Doe" },
|
|
||||||
{ img: "/img/team-2.jpeg", name: "Ryan Tompson" },
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/home-decor-3.jpeg",
|
|
||||||
title: "Minimalist",
|
|
||||||
tag: "Project #3",
|
|
||||||
description:
|
|
||||||
"Different people have different taste, and various types of music.",
|
|
||||||
route: "/dashboard/profile",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
{ img: "/img/team-2.jpeg", name: "Ryan Tompson" },
|
|
||||||
{ img: "/img/team-3.jpeg", name: "Jessica Doe" },
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/home-decor-4.jpeg",
|
|
||||||
title: "Gothic",
|
|
||||||
tag: "Project #4",
|
|
||||||
description:
|
|
||||||
"Why would anyone pick blue over pink? Pink is obviously a better color.",
|
|
||||||
route: "/dashboard/profile",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
{ img: "/img/team-3.jpeg", name: "Jessica Doe" },
|
|
||||||
{ img: "/img/team-2.jpeg", name: "Ryan Tompson" },
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default projectsData;
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
export const projectsTableData = [
|
|
||||||
{
|
|
||||||
img: "/img/logo-xd.svg",
|
|
||||||
name: "Material XD Version",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
{ img: "/img/team-2.jpeg", name: "Ryan Tompson" },
|
|
||||||
{ img: "/img/team-3.jpeg", name: "Jessica Doe" },
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
],
|
|
||||||
budget: "$14,000",
|
|
||||||
completion: 60,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/logo-atlassian.svg",
|
|
||||||
name: "Add Progress Track",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-2.jpeg", name: "Ryan Tompson" },
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
],
|
|
||||||
budget: "$3,000",
|
|
||||||
completion: 10,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/logo-slack.svg",
|
|
||||||
name: "Fix Platform Errors",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-3.jpeg", name: "Jessica Doe" },
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
],
|
|
||||||
budget: "Not set",
|
|
||||||
completion: 100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/logo-spotify.svg",
|
|
||||||
name: "Launch our Mobile App",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
{ img: "/img/team-3.jpeg", name: "Jessica Doe" },
|
|
||||||
{ img: "/img/team-2.jpeg", name: "Ryan Tompson" },
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
],
|
|
||||||
budget: "$20,500",
|
|
||||||
completion: 100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/logo-jira.svg",
|
|
||||||
name: "Add the New Pricing Page",
|
|
||||||
members: [{ img: "/img/team-4.jpeg", name: "Alexander Smith" }],
|
|
||||||
budget: "$500",
|
|
||||||
completion: 25,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
img: "/img/logo-invision.svg",
|
|
||||||
name: "Redesign New Online Shop",
|
|
||||||
members: [
|
|
||||||
{ img: "/img/team-1.jpeg", name: "Romina Hadid" },
|
|
||||||
{ img: "/img/team-4.jpeg", name: "Alexander Smith" },
|
|
||||||
],
|
|
||||||
budget: "$2,000",
|
|
||||||
completion: 40,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default projectsTableData;
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
import {
|
|
||||||
BanknotesIcon,
|
|
||||||
UserPlusIcon,
|
|
||||||
UsersIcon,
|
|
||||||
ChartBarIcon,
|
|
||||||
} from "@heroicons/react/24/solid";
|
|
||||||
|
|
||||||
export const statisticsCardsData = [
|
|
||||||
{
|
|
||||||
color: "gray",
|
|
||||||
icon: BanknotesIcon,
|
|
||||||
title: "Today's Money",
|
|
||||||
value: "$53k",
|
|
||||||
footer: {
|
|
||||||
color: "text-green-500",
|
|
||||||
value: "+55%",
|
|
||||||
label: "than last week",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: "gray",
|
|
||||||
icon: UsersIcon,
|
|
||||||
title: "Today's Users",
|
|
||||||
value: "2,300",
|
|
||||||
footer: {
|
|
||||||
color: "text-green-500",
|
|
||||||
value: "+3%",
|
|
||||||
label: "than last month",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: "gray",
|
|
||||||
icon: UserPlusIcon,
|
|
||||||
title: "New Clients",
|
|
||||||
value: "3,462",
|
|
||||||
footer: {
|
|
||||||
color: "text-red-500",
|
|
||||||
value: "-2%",
|
|
||||||
label: "than yesterday",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: "gray",
|
|
||||||
icon: ChartBarIcon,
|
|
||||||
title: "Sales",
|
|
||||||
value: "$103,430",
|
|
||||||
footer: {
|
|
||||||
color: "text-green-500",
|
|
||||||
value: "+5%",
|
|
||||||
label: "than yesterday",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default statisticsCardsData;
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
import { chartsConfig } from "@/configs";
|
|
||||||
|
|
||||||
const websiteViewsChart = {
|
|
||||||
type: "bar",
|
|
||||||
height: 220,
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "Views",
|
|
||||||
data: [50, 20, 10, 22, 50, 10, 40],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
...chartsConfig,
|
|
||||||
colors: "#388e3c",
|
|
||||||
plotOptions: {
|
|
||||||
bar: {
|
|
||||||
columnWidth: "16%",
|
|
||||||
borderRadius: 5,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
xaxis: {
|
|
||||||
...chartsConfig.xaxis,
|
|
||||||
categories: ["M", "T", "W", "T", "F", "S", "S"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const dailySalesChart = {
|
|
||||||
type: "line",
|
|
||||||
height: 220,
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "Sales",
|
|
||||||
data: [50, 40, 300, 320, 500, 350, 200, 230, 500],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
...chartsConfig,
|
|
||||||
colors: ["#0288d1"],
|
|
||||||
stroke: {
|
|
||||||
lineCap: "round",
|
|
||||||
},
|
|
||||||
markers: {
|
|
||||||
size: 5,
|
|
||||||
},
|
|
||||||
xaxis: {
|
|
||||||
...chartsConfig.xaxis,
|
|
||||||
categories: [
|
|
||||||
"Apr",
|
|
||||||
"May",
|
|
||||||
"Jun",
|
|
||||||
"Jul",
|
|
||||||
"Aug",
|
|
||||||
"Sep",
|
|
||||||
"Oct",
|
|
||||||
"Nov",
|
|
||||||
"Dec",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const completedTaskChart = {
|
|
||||||
type: "line",
|
|
||||||
height: 220,
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "Sales",
|
|
||||||
data: [50, 40, 300, 320, 500, 350, 200, 230, 500],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
...chartsConfig,
|
|
||||||
colors: ["#388e3c"],
|
|
||||||
stroke: {
|
|
||||||
lineCap: "round",
|
|
||||||
},
|
|
||||||
markers: {
|
|
||||||
size: 5,
|
|
||||||
},
|
|
||||||
xaxis: {
|
|
||||||
...chartsConfig.xaxis,
|
|
||||||
categories: [
|
|
||||||
"Apr",
|
|
||||||
"May",
|
|
||||||
"Jun",
|
|
||||||
"Jul",
|
|
||||||
"Aug",
|
|
||||||
"Sep",
|
|
||||||
"Oct",
|
|
||||||
"Nov",
|
|
||||||
"Dec",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
const completedTasksChart = {
|
|
||||||
...completedTaskChart,
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "Tasks",
|
|
||||||
data: [50, 40, 300, 220, 500, 250, 400, 230, 500],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
export const statisticsChartsData = [
|
|
||||||
{
|
|
||||||
color: "white",
|
|
||||||
title: "Website View",
|
|
||||||
description: "Last Campaign Performance",
|
|
||||||
footer: "campaign sent 2 days ago",
|
|
||||||
chart: websiteViewsChart,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: "white",
|
|
||||||
title: "Daily Sales",
|
|
||||||
description: "15% increase in today sales",
|
|
||||||
footer: "updated 4 min ago",
|
|
||||||
chart: dailySalesChart,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: "white",
|
|
||||||
title: "Completed Tasks",
|
|
||||||
description: "Last Campaign Performance",
|
|
||||||
footer: "just updated",
|
|
||||||
chart: completedTasksChart,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default statisticsChartsData;
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
import { Routes, Route } from "react-router-dom";
|
|
||||||
import {
|
|
||||||
ChartPieIcon,
|
|
||||||
UserIcon,
|
|
||||||
UserPlusIcon,
|
|
||||||
ArrowRightOnRectangleIcon,
|
|
||||||
} from "@heroicons/react/24/solid";
|
|
||||||
import { Navbar, Footer } from "@/widgets/layout";
|
|
||||||
import routes from "@/routes";
|
|
||||||
|
|
||||||
export function Auth() {
|
|
||||||
const navbarRoutes = [
|
|
||||||
{
|
|
||||||
name: "dashboard",
|
|
||||||
path: "/dashboard/home",
|
|
||||||
icon: ChartPieIcon,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "profile",
|
|
||||||
path: "/dashboard/home",
|
|
||||||
icon: UserIcon,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "sign up",
|
|
||||||
path: "/auth/sign-up",
|
|
||||||
icon: UserPlusIcon,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "sign in",
|
|
||||||
path: "/auth/sign-in",
|
|
||||||
icon: ArrowRightOnRectangleIcon,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="relative min-h-screen w-full">
|
|
||||||
<Routes>
|
|
||||||
{routes.map(
|
|
||||||
({ layout, pages }) =>
|
|
||||||
layout === "auth" &&
|
|
||||||
pages.map(({ path, element }) => (
|
|
||||||
<Route exact path={path} element={element} />
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</Routes>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Auth.displayName = "/src/layout/Auth.jsx";
|
|
||||||
|
|
||||||
export default Auth;
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
import { Routes, Route } from "react-router-dom";
|
|
||||||
import { Cog6ToothIcon } from "@heroicons/react/24/solid";
|
|
||||||
import { IconButton } from "@material-tailwind/react";
|
|
||||||
import {
|
|
||||||
Sidenav,
|
|
||||||
DashboardNavbar,
|
|
||||||
Configurator,
|
|
||||||
Footer,
|
|
||||||
} from "@/widgets/layout";
|
|
||||||
import routes from "@/routes";
|
|
||||||
import { useMaterialTailwindController, setOpenConfigurator } from "@/components";
|
|
||||||
|
|
||||||
export function Dashboard() {
|
|
||||||
const [controller, dispatch] = useMaterialTailwindController();
|
|
||||||
const { sidenavType } = controller;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="min-h-screen bg-blue-gray-50/50">
|
|
||||||
<Sidenav
|
|
||||||
routes={routes}
|
|
||||||
brandImg={
|
|
||||||
sidenavType === "dark" ? "/img/logo-ct.png" : "/img/logo-ct-dark.png"
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<div className="p-4 xl:ml-80">
|
|
||||||
<DashboardNavbar />
|
|
||||||
<Configurator />
|
|
||||||
<IconButton
|
|
||||||
size="lg"
|
|
||||||
color="white"
|
|
||||||
className="fixed bottom-8 right-8 z-40 rounded-full shadow-blue-gray-900/10 xl:hidden"
|
|
||||||
ripple={false}
|
|
||||||
onClick={() => setOpenConfigurator(dispatch, true)}
|
|
||||||
>
|
|
||||||
<Cog6ToothIcon className="h-5 w-5" />
|
|
||||||
</IconButton>
|
|
||||||
<Routes>
|
|
||||||
{routes.map(
|
|
||||||
({ layout, pages }) =>
|
|
||||||
layout === "dashboard" &&
|
|
||||||
pages.map(({ path, element }) => (
|
|
||||||
<Route exact path={path} element={element} />
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</Routes>
|
|
||||||
<div className="text-blue-gray-600">
|
|
||||||
<Footer />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Dashboard.displayName = "/src/layout/dashboard.jsx";
|
|
||||||
|
|
||||||
export default Dashboard;
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
export * from "@/layouts/dashboard";
|
|
||||||
export * from "@/layouts/auth";
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
=========================================================
|
|
||||||
* Material Tailwind Dashboard React - v2.1.0
|
|
||||||
=========================================================
|
|
||||||
* Product Page: https://www.creative-tim.com/product/material-tailwind-dashboard-react
|
|
||||||
* Copyright 2023 Creative Tim (https://www.creative-tim.com)
|
|
||||||
* Licensed under MIT (https://github.com/creativetimofficial/material-tailwind-dashboard-react/blob/main/LICENSE.md)
|
|
||||||
* Coded by Creative Tim
|
|
||||||
=========================================================
|
|
||||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
*/
|
|
||||||
import React from "react";
|
|
||||||
import ReactDOM from "react-dom/client";
|
|
||||||
import App from "./App";
|
|
||||||
import { BrowserRouter } from "react-router-dom";
|
|
||||||
import { ThemeProvider } from "@material-tailwind/react";
|
|
||||||
import { MaterialTailwindControllerProvider } from "@/components";
|
|
||||||
import "./tailwind.css";
|
|
||||||
import ToastProvider from "@/components/ToastProvider.jsx";
|
|
||||||
import MaintenanceProvider from "@/components/MaintenanceProvider.jsx";
|
|
||||||
import PageProvider from "@/components/PageProvider.jsx";
|
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById("root")).render(
|
|
||||||
<React.StrictMode>
|
|
||||||
<BrowserRouter>
|
|
||||||
<MaintenanceProvider>
|
|
||||||
<ToastProvider>
|
|
||||||
<PageProvider>
|
|
||||||
<ThemeProvider>
|
|
||||||
<MaterialTailwindControllerProvider>
|
|
||||||
<App />
|
|
||||||
</MaterialTailwindControllerProvider>
|
|
||||||
</ThemeProvider>
|
|
||||||
</PageProvider>
|
|
||||||
</ToastProvider>
|
|
||||||
</MaintenanceProvider>
|
|
||||||
</BrowserRouter>
|
|
||||||
</React.StrictMode>
|
|
||||||
);
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
export * from "@/pages/auth/sign-in";
|
|
||||||
export * from "@/pages/auth/sign-up";
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
import {
|
|
||||||
Card,
|
|
||||||
Input,
|
|
||||||
Checkbox,
|
|
||||||
Button,
|
|
||||||
Typography,
|
|
||||||
} from "@material-tailwind/react";
|
|
||||||
import { Link } from "react-router-dom";
|
|
||||||
|
|
||||||
|
|
||||||
export function SignIn() {
|
|
||||||
return (
|
|
||||||
<section className="m-8 flex gap-4">
|
|
||||||
<div className="w-full lg:w-3/5 mt-24">
|
|
||||||
<div className="text-center">
|
|
||||||
<Typography variant="h2" className="font-bold mb-4">Sign In</Typography>
|
|
||||||
<Typography variant="paragraph" color="blue-gray" className="text-lg font-normal">Enter your email and password to Sign In.</Typography>
|
|
||||||
</div>
|
|
||||||
<form className="mt-8 mb-2 mx-auto w-80 max-w-screen-lg lg:w-1/2">
|
|
||||||
<div className="mb-1 flex flex-col gap-6">
|
|
||||||
<Typography variant="small" color="blue-gray" className="-mb-3 font-medium">
|
|
||||||
Your email
|
|
||||||
</Typography>
|
|
||||||
<Input
|
|
||||||
size="lg"
|
|
||||||
placeholder="name@mail.com"
|
|
||||||
className=" !border-t-blue-gray-200 focus:!border-t-gray-900"
|
|
||||||
labelProps={{
|
|
||||||
className: "before:content-none after:content-none",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<Typography variant="small" color="blue-gray" className="-mb-3 font-medium">
|
|
||||||
Password
|
|
||||||
</Typography>
|
|
||||||
<Input
|
|
||||||
type="password"
|
|
||||||
size="lg"
|
|
||||||
placeholder="********"
|
|
||||||
className=" !border-t-blue-gray-200 focus:!border-t-gray-900"
|
|
||||||
labelProps={{
|
|
||||||
className: "before:content-none after:content-none",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<Checkbox
|
|
||||||
label={
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
color="gray"
|
|
||||||
className="flex items-center justify-start font-medium"
|
|
||||||
>
|
|
||||||
I agree the
|
|
||||||
<a
|
|
||||||
href="#"
|
|
||||||
className="font-normal text-black transition-colors hover:text-gray-900 underline"
|
|
||||||
>
|
|
||||||
Terms and Conditions
|
|
||||||
</a>
|
|
||||||
</Typography>
|
|
||||||
}
|
|
||||||
containerProps={{ className: "-ml-2.5" }}
|
|
||||||
/>
|
|
||||||
<Button className="mt-6" fullWidth>
|
|
||||||
Sign In
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<div className="flex items-center justify-between gap-2 mt-6">
|
|
||||||
<Checkbox
|
|
||||||
label={
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
color="gray"
|
|
||||||
className="flex items-center justify-start font-medium"
|
|
||||||
>
|
|
||||||
Subscribe me to newsletter
|
|
||||||
</Typography>
|
|
||||||
}
|
|
||||||
containerProps={{ className: "-ml-2.5" }}
|
|
||||||
/>
|
|
||||||
<Typography variant="small" className="font-medium text-gray-900">
|
|
||||||
<a href="#">
|
|
||||||
Forgot Password
|
|
||||||
</a>
|
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-4 mt-8">
|
|
||||||
<Button size="lg" color="white" className="flex items-center gap-2 justify-center shadow-md" fullWidth>
|
|
||||||
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g clipPath="url(#clip0_1156_824)">
|
|
||||||
<path d="M16.3442 8.18429C16.3442 7.64047 16.3001 7.09371 16.206 6.55872H8.66016V9.63937H12.9813C12.802 10.6329 12.2258 11.5119 11.3822 12.0704V14.0693H13.9602C15.4741 12.6759 16.3442 10.6182 16.3442 8.18429Z" fill="#4285F4" />
|
|
||||||
<path d="M8.65974 16.0006C10.8174 16.0006 12.637 15.2922 13.9627 14.0693L11.3847 12.0704C10.6675 12.5584 9.7415 12.8347 8.66268 12.8347C6.5756 12.8347 4.80598 11.4266 4.17104 9.53357H1.51074V11.5942C2.86882 14.2956 5.63494 16.0006 8.65974 16.0006Z" fill="#34A853" />
|
|
||||||
<path d="M4.16852 9.53356C3.83341 8.53999 3.83341 7.46411 4.16852 6.47054V4.40991H1.51116C0.376489 6.67043 0.376489 9.33367 1.51116 11.5942L4.16852 9.53356Z" fill="#FBBC04" />
|
|
||||||
<path d="M8.65974 3.16644C9.80029 3.1488 10.9026 3.57798 11.7286 4.36578L14.0127 2.08174C12.5664 0.72367 10.6469 -0.0229773 8.65974 0.000539111C5.63494 0.000539111 2.86882 1.70548 1.51074 4.40987L4.1681 6.4705C4.8001 4.57449 6.57266 3.16644 8.65974 3.16644Z" fill="#EA4335" />
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_1156_824">
|
|
||||||
<rect width="16" height="16" fill="white" transform="translate(0.5)" />
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
<span>Sign in With Google</span>
|
|
||||||
</Button>
|
|
||||||
<Button size="lg" color="white" className="flex items-center gap-2 justify-center shadow-md" fullWidth>
|
|
||||||
<img src="/img/twitter-logo.svg" height={24} width={24} alt="" />
|
|
||||||
<span>Sign in With Twitter</span>
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
<Typography variant="paragraph" className="text-center text-blue-gray-500 font-medium mt-4">
|
|
||||||
Not registered?
|
|
||||||
<Link to="/auth/sign-up" className="text-gray-900 ml-1">Create account</Link>
|
|
||||||
</Typography>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div className="w-2/5 h-full hidden lg:block">
|
|
||||||
<img
|
|
||||||
src="/img/pattern.png"
|
|
||||||
className="h-full w-full object-cover rounded-3xl"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SignIn;
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
import {
|
|
||||||
Card,
|
|
||||||
Input,
|
|
||||||
Checkbox,
|
|
||||||
Button,
|
|
||||||
Typography,
|
|
||||||
} from "@material-tailwind/react";
|
|
||||||
import { Link } from "react-router-dom";
|
|
||||||
|
|
||||||
|
|
||||||
export function SignUp() {
|
|
||||||
return (
|
|
||||||
<section className="m-8 flex">
|
|
||||||
<div className="w-2/5 h-full hidden lg:block">
|
|
||||||
<img
|
|
||||||
src="/img/pattern.png"
|
|
||||||
className="h-full w-full object-cover rounded-3xl"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="w-full lg:w-3/5 flex flex-col items-center justify-center">
|
|
||||||
<div className="text-center">
|
|
||||||
<Typography variant="h2" className="font-bold mb-4">Join Us Today</Typography>
|
|
||||||
<Typography variant="paragraph" color="blue-gray" className="text-lg font-normal">Enter your email and password to register.</Typography>
|
|
||||||
</div>
|
|
||||||
<form className="mt-8 mb-2 mx-auto w-80 max-w-screen-lg lg:w-1/2">
|
|
||||||
<div className="mb-1 flex flex-col gap-6">
|
|
||||||
<Typography variant="small" color="blue-gray" className="-mb-3 font-medium">
|
|
||||||
Your email
|
|
||||||
</Typography>
|
|
||||||
<Input
|
|
||||||
size="lg"
|
|
||||||
placeholder="name@mail.com"
|
|
||||||
className=" !border-t-blue-gray-200 focus:!border-t-gray-900"
|
|
||||||
labelProps={{
|
|
||||||
className: "before:content-none after:content-none",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<Checkbox
|
|
||||||
label={
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
color="gray"
|
|
||||||
className="flex items-center justify-start font-medium"
|
|
||||||
>
|
|
||||||
I agree the
|
|
||||||
<a
|
|
||||||
href="#"
|
|
||||||
className="font-normal text-black transition-colors hover:text-gray-900 underline"
|
|
||||||
>
|
|
||||||
Terms and Conditions
|
|
||||||
</a>
|
|
||||||
</Typography>
|
|
||||||
}
|
|
||||||
containerProps={{ className: "-ml-2.5" }}
|
|
||||||
/>
|
|
||||||
<Button className="mt-6" fullWidth>
|
|
||||||
Register Now
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<div className="space-y-4 mt-8">
|
|
||||||
<Button size="lg" color="white" className="flex items-center gap-2 justify-center shadow-md" fullWidth>
|
|
||||||
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g clipPath="url(#clip0_1156_824)">
|
|
||||||
<path d="M16.3442 8.18429C16.3442 7.64047 16.3001 7.09371 16.206 6.55872H8.66016V9.63937H12.9813C12.802 10.6329 12.2258 11.5119 11.3822 12.0704V14.0693H13.9602C15.4741 12.6759 16.3442 10.6182 16.3442 8.18429Z" fill="#4285F4" />
|
|
||||||
<path d="M8.65974 16.0006C10.8174 16.0006 12.637 15.2922 13.9627 14.0693L11.3847 12.0704C10.6675 12.5584 9.7415 12.8347 8.66268 12.8347C6.5756 12.8347 4.80598 11.4266 4.17104 9.53357H1.51074V11.5942C2.86882 14.2956 5.63494 16.0006 8.65974 16.0006Z" fill="#34A853" />
|
|
||||||
<path d="M4.16852 9.53356C3.83341 8.53999 3.83341 7.46411 4.16852 6.47054V4.40991H1.51116C0.376489 6.67043 0.376489 9.33367 1.51116 11.5942L4.16852 9.53356Z" fill="#FBBC04" />
|
|
||||||
<path d="M8.65974 3.16644C9.80029 3.1488 10.9026 3.57798 11.7286 4.36578L14.0127 2.08174C12.5664 0.72367 10.6469 -0.0229773 8.65974 0.000539111C5.63494 0.000539111 2.86882 1.70548 1.51074 4.40987L4.1681 6.4705C4.8001 4.57449 6.57266 3.16644 8.65974 3.16644Z" fill="#EA4335" />
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_1156_824">
|
|
||||||
<rect width="16" height="16" fill="white" transform="translate(0.5)" />
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
<span>Sign in With Google</span>
|
|
||||||
</Button>
|
|
||||||
<Button size="lg" color="white" className="flex items-center gap-2 justify-center shadow-md" fullWidth>
|
|
||||||
<img src="/img/twitter-logo.svg" height={24} width={24} alt="" />
|
|
||||||
<span>Sign in With Twitter</span>
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
<Typography variant="paragraph" className="text-center text-blue-gray-500 font-medium mt-4">
|
|
||||||
Already have an account?
|
|
||||||
<Link to="/auth/sign-in" className="text-gray-900 ml-1">Sign in</Link>
|
|
||||||
</Typography>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SignUp;
|
|
||||||
@@ -1,258 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import {
|
|
||||||
Typography,
|
|
||||||
Card,
|
|
||||||
CardHeader,
|
|
||||||
CardBody,
|
|
||||||
IconButton,
|
|
||||||
Menu,
|
|
||||||
MenuHandler,
|
|
||||||
MenuList,
|
|
||||||
MenuItem,
|
|
||||||
Avatar,
|
|
||||||
Tooltip,
|
|
||||||
Progress,
|
|
||||||
} from "@material-tailwind/react";
|
|
||||||
import {
|
|
||||||
EllipsisVerticalIcon,
|
|
||||||
ArrowUpIcon,
|
|
||||||
} from "@heroicons/react/24/outline";
|
|
||||||
import { StatisticsCard } from "@/widgets/cards";
|
|
||||||
import { StatisticsChart } from "@/widgets/charts";
|
|
||||||
import {
|
|
||||||
statisticsCardsData,
|
|
||||||
statisticsChartsData,
|
|
||||||
projectsTableData,
|
|
||||||
ordersOverviewData,
|
|
||||||
} from "@/data";
|
|
||||||
import { CheckCircleIcon, ClockIcon } from "@heroicons/react/24/solid";
|
|
||||||
|
|
||||||
export function Home() {
|
|
||||||
return (
|
|
||||||
<div className="mt-12">
|
|
||||||
<div className="mb-12 grid gap-y-10 gap-x-6 md:grid-cols-2 xl:grid-cols-4">
|
|
||||||
{statisticsCardsData.map(({ icon, title, footer, ...rest }) => (
|
|
||||||
<StatisticsCard
|
|
||||||
key={title}
|
|
||||||
{...rest}
|
|
||||||
title={title}
|
|
||||||
icon={React.createElement(icon, {
|
|
||||||
className: "w-6 h-6 text-white",
|
|
||||||
})}
|
|
||||||
footer={
|
|
||||||
<Typography className="font-normal text-blue-gray-600">
|
|
||||||
<strong className={footer.color}>{footer.value}</strong>
|
|
||||||
{footer.label}
|
|
||||||
</Typography>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
<div className="mb-6 grid grid-cols-1 gap-y-12 gap-x-6 md:grid-cols-2 xl:grid-cols-3">
|
|
||||||
{statisticsChartsData.map((props) => (
|
|
||||||
<StatisticsChart
|
|
||||||
key={props.title}
|
|
||||||
{...props}
|
|
||||||
footer={
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
className="flex items-center font-normal text-blue-gray-600"
|
|
||||||
>
|
|
||||||
<ClockIcon strokeWidth={2} className="h-4 w-4 text-blue-gray-400" />
|
|
||||||
{props.footer}
|
|
||||||
</Typography>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
<div className="mb-4 grid grid-cols-1 gap-6 xl:grid-cols-3">
|
|
||||||
<Card className="overflow-hidden xl:col-span-2 border border-blue-gray-100 shadow-sm">
|
|
||||||
<CardHeader
|
|
||||||
floated={false}
|
|
||||||
shadow={false}
|
|
||||||
color="transparent"
|
|
||||||
className="m-0 flex items-center justify-between p-6"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<Typography variant="h6" color="blue-gray" className="mb-1">
|
|
||||||
Projects
|
|
||||||
</Typography>
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
className="flex items-center gap-1 font-normal text-blue-gray-600"
|
|
||||||
>
|
|
||||||
<CheckCircleIcon strokeWidth={3} className="h-4 w-4 text-blue-gray-200" />
|
|
||||||
<strong>30 done</strong> this month
|
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
<Menu placement="left-start">
|
|
||||||
<MenuHandler>
|
|
||||||
<IconButton size="sm" variant="text" color="blue-gray">
|
|
||||||
<EllipsisVerticalIcon
|
|
||||||
strokeWidth={3}
|
|
||||||
fill="currenColor"
|
|
||||||
className="h-6 w-6"
|
|
||||||
/>
|
|
||||||
</IconButton>
|
|
||||||
</MenuHandler>
|
|
||||||
<MenuList>
|
|
||||||
<MenuItem>Action</MenuItem>
|
|
||||||
<MenuItem>Another Action</MenuItem>
|
|
||||||
<MenuItem>Something else here</MenuItem>
|
|
||||||
</MenuList>
|
|
||||||
</Menu>
|
|
||||||
</CardHeader>
|
|
||||||
<CardBody className="overflow-x-scroll px-0 pt-0 pb-2">
|
|
||||||
<table className="w-full min-w-[640px] table-auto">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
{["companies", "members", "budget", "completion"].map(
|
|
||||||
(el) => (
|
|
||||||
<th
|
|
||||||
key={el}
|
|
||||||
className="border-b border-blue-gray-50 py-3 px-6 text-left"
|
|
||||||
>
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
className="text-[11px] font-medium uppercase text-blue-gray-400"
|
|
||||||
>
|
|
||||||
{el}
|
|
||||||
</Typography>
|
|
||||||
</th>
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{projectsTableData.map(
|
|
||||||
({ img, name, members, budget, completion }, key) => {
|
|
||||||
const className = `py-3 px-5 ${
|
|
||||||
key === projectsTableData.length - 1
|
|
||||||
? ""
|
|
||||||
: "border-b border-blue-gray-50"
|
|
||||||
}`;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<tr key={name}>
|
|
||||||
<td className={className}>
|
|
||||||
<div className="flex items-center gap-4">
|
|
||||||
<Avatar src={img} alt={name} size="sm" />
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
color="blue-gray"
|
|
||||||
className="font-bold"
|
|
||||||
>
|
|
||||||
{name}
|
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td className={className}>
|
|
||||||
{members.map(({ img, name }, key) => (
|
|
||||||
<Tooltip key={name} content={name}>
|
|
||||||
<Avatar
|
|
||||||
src={img}
|
|
||||||
alt={name}
|
|
||||||
size="xs"
|
|
||||||
variant="circular"
|
|
||||||
className={`cursor-pointer border-2 border-white ${
|
|
||||||
key === 0 ? "" : "-ml-2.5"
|
|
||||||
}`}
|
|
||||||
/>
|
|
||||||
</Tooltip>
|
|
||||||
))}
|
|
||||||
</td>
|
|
||||||
<td className={className}>
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
className="text-xs font-medium text-blue-gray-600"
|
|
||||||
>
|
|
||||||
{budget}
|
|
||||||
</Typography>
|
|
||||||
</td>
|
|
||||||
<td className={className}>
|
|
||||||
<div className="w-10/12">
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
className="mb-1 block text-xs font-medium text-blue-gray-600"
|
|
||||||
>
|
|
||||||
{completion}%
|
|
||||||
</Typography>
|
|
||||||
<Progress
|
|
||||||
value={completion}
|
|
||||||
variant="gradient"
|
|
||||||
color={completion === 100 ? "green" : "blue"}
|
|
||||||
className="h-1"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
)}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
<Card className="border border-blue-gray-100 shadow-sm">
|
|
||||||
<CardHeader
|
|
||||||
floated={false}
|
|
||||||
shadow={false}
|
|
||||||
color="transparent"
|
|
||||||
className="m-0 p-6"
|
|
||||||
>
|
|
||||||
<Typography variant="h6" color="blue-gray" className="mb-2">
|
|
||||||
Orders Overview
|
|
||||||
</Typography>
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
className="flex items-center gap-1 font-normal text-blue-gray-600"
|
|
||||||
>
|
|
||||||
<ArrowUpIcon
|
|
||||||
strokeWidth={3}
|
|
||||||
className="h-3.5 w-3.5 text-green-500"
|
|
||||||
/>
|
|
||||||
<strong>24%</strong> this month
|
|
||||||
</Typography>
|
|
||||||
</CardHeader>
|
|
||||||
<CardBody className="pt-0">
|
|
||||||
{ordersOverviewData.map(
|
|
||||||
({ icon, color, title, description }, key) => (
|
|
||||||
<div key={title} className="flex items-start gap-4 py-3">
|
|
||||||
<div
|
|
||||||
className={`relative p-1 after:absolute after:-bottom-6 after:left-2/4 after:w-0.5 after:-translate-x-2/4 after:bg-blue-gray-50 after:content-[''] ${
|
|
||||||
key === ordersOverviewData.length - 1
|
|
||||||
? "after:h-0"
|
|
||||||
: "after:h-4/6"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{React.createElement(icon, {
|
|
||||||
className: `!w-5 !h-5 ${color}`,
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<Typography
|
|
||||||
variant="small"
|
|
||||||
color="blue-gray"
|
|
||||||
className="block font-medium"
|
|
||||||
>
|
|
||||||
{title}
|
|
||||||
</Typography>
|
|
||||||
<Typography
|
|
||||||
as="span"
|
|
||||||
variant="small"
|
|
||||||
className="text-xs font-medium text-blue-gray-500"
|
|
||||||
>
|
|
||||||
{description}
|
|
||||||
</Typography>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Home;
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user