diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..6e16f543 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,30 @@ +# top-most EditorConfig file +root = true + +# Default settings for all files +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# For Markdown files, don't trim trailing whitespace (karena kadang dipakai untuk line break) +[*.md] +trim_trailing_whitespace = false + +# For JSON, YAML, and config files +[*.{json,yml,yaml}] +indent_style = space +indent_size = 2 + +# For JS, TS, Vue files +[*.{js,ts,vue}] +indent_style = space +indent_size = 2 + +# For CSS, SCSS, PostCSS +[*.{css,scss,pcss}] +indent_style = space +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..b6721291 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +API_ORIGIN= diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..28b1a8b3 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "useTabs": false, + "tabWidth": 2, + "singleQuote": true, + "trailingComma": "all", + "printWidth": 120, + "semi": false, + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..4b1147d4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/README-nuxt.md b/README-nuxt.md new file mode 100644 index 00000000..25b58212 --- /dev/null +++ b/README-nuxt.md @@ -0,0 +1,75 @@ +# Nuxt Minimal Starter + +Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. + +## Setup + +Make sure to install dependencies: + +```bash +# npm +npm install + +# pnpm +pnpm install + +# yarn +yarn install + +# bun +bun install +``` + +## Development Server + +Start the development server on `http://localhost:3000`: + +```bash +# npm +npm run dev + +# pnpm +pnpm dev + +# yarn +yarn dev + +# bun +bun run dev +``` + +## Production + +Build the application for production: + +```bash +# npm +npm run build + +# pnpm +pnpm build + +# yarn +yarn build + +# bun +bun run build +``` + +Locally preview production build: + +```bash +# npm +npm run preview + +# pnpm +pnpm preview + +# yarn +yarn preview + +# bun +bun run preview +``` + +Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. diff --git a/README.md b/README.md index 078e8c9a..45e4a4e5 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,111 @@ RSSA - Front End -If you see this, the development is still not merged yet. Please check another branch. +> [!IMPORTANT] +> Read this following instructions before doing your job + +## Framework Guide + +- [Vue Style Guide](https://vuejs.org/style-guide) +- [Nuxt Style Guide](https://nuxt.com/docs/4.x/guide) +- [Shadcn Vue @radix-ui](https://radix.shadcn-vue.com/) + +## Configuration + +- `nuxt.config.ts`
Nuxt configuration file +- `.env`
Some environment variables + +## Directory Structure for `app/` + +- `app.vue`: Main layout +- `components` : Contains all reusable UI components. +- `components/content` : Entry point for business logic and workflows. Pages or routes call these content components to handle API requests and process application logic +- `components/app` : View-layer components that manage and present data. These are used within `content/` to render or handle specific parts of the UI, and return results back to the content +- `components/pub` : Public/shared components used across different parts of the app. +- `composables` : Contains reusable logic and utility functions (e.g. composables, hooks).. +- `layouts` : Reusable UI layout patterns used across pages. +- `models` : Contains data definitions or interfaces. +- `schemas` : Contains JSON schemas used for validation. +- `services` : Contains reusable API calls and business logic. + + +## Directory Structure for `app/pages` + +- `pages/auth` : Authentication related pages. +- `pages/(features)` : Grouped feature modules that reflect specific business content or domains. + +## Directory Structure for `server/` + +- `server/api` : API or proxy requests + +## Workflows + +The basic development workflow follows these steps: + +### Define Your Data in `models/` + +- Create data definitions or interfaces. +- These should represent the structure of the data used across your app. + +### Build UI Components in `components/app` + +- Create reusable UI and app specific components. +- Keep components pure, avoid making HTTP requests directly within them. +- They receive data via props and emit events upward. + +### Business Logic in `components/content` + +- This layer connects the UI with the logic (API calls, validations, navigation). +- It composes components from `components/app/`, `components/pub/`, and other content. +- Also responsible for managing state, side effects, and interactions. + +### Create Pages in `pages/` + +- Define permissions and guards for each page. +- Pages load the appropriate content from `components/content/`. +- They do not contain UI or logic directly, just route level layout or guards. + +### Validation + +- UI level validation in `components/app`. help users avoid mistakes before submitting. + - Lightweight/instant validation related to UX. + - Basic formatting (email regex, numeric-only, password length). + - Showing error messages directly under the field. + +- Business level validation in `components/flow`. cannot rely only on the UI, since it often requires server-side checks or rules that may change. + - More complex validation rules tied to business logic. + +## Code Conventions + +- Under the script setup block, putting things in group with the following order: + - Imports → all dependencies, sorted by external, alias (~), and relative imports. + - Props & Emits → clearly define component inputs & outputs. + - State & Computed → all ref, reactive, and computed variables grouped together. + - Lifecycle Hooks → grouped by mounting → updating → unmounting order. + - Functions → async first (fetching, API calls), then utility & event handlers. + - Watchers → if needed, put them at the bottom. + - Template → keep clean and minimal logic, use methods/computed instead of inline JS. +- Declaration Naming + - Uses PascalCase for `type` naming + - Uses camelCase for `variable` and `const` naming + - Underscore can be used to indicates that a variable has derived from an attribute of an object
+ for example: `person_name` indicates it is an attribute `name` from object `person` +- Looping + - Uses `i`, `j`, `k` as variable for `for` looping index + - Uses `item` as object instantition for `forEach` loop callback + - Uses `item` as object instantition for `v-for` loop callback in the template + +## Git Workflows + +The basic git workflow follows these steps: + +1. Create a new branch on `dev` + - branch name should be `feat/` or `fix/` +2. Make your changes +3. Commit your changes + - commit msg format: `[type]: [description]` + - `type` can be `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore`, `revert` + - `description` should be a brief description of the changes + - Example: `feat: add new feature` +4. Push your changes to `dev` +5. Create a pull request from `dev` to `main` diff --git a/app/app.vue b/app/app.vue new file mode 100644 index 00000000..dfe34d61 --- /dev/null +++ b/app/app.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/assets/css/main.css b/app/assets/css/main.css new file mode 100644 index 00000000..4c488385 --- /dev/null +++ b/app/assets/css/main.css @@ -0,0 +1,340 @@ +/* SIMRS RSSA Design System - Pure CSS (No Tailwind) */ + +/* CSS Variables */ +:root { + /* Medical Theme Colors */ + --background: 210 20% 98%; + --foreground: 210 20% 15%; + --card: 0 0% 100%; + --card-foreground: 210 20% 15%; + --popover: 0 0% 100%; + --popover-foreground: 210 20% 15%; + + /* Primary - Medical Green */ + --primary: 150 75% 35%; + --primary-foreground: 0 0% 100%; + --primary-hover: 150 75% 40%; + + /* Secondary - Clean Blue */ + --secondary: 210 50% 96%; + --secondary-foreground: 210 20% 20%; + --muted: 210 25% 95%; + --muted-foreground: 210 15% 50%; + + /* Accent - Neutral Gray */ + --accent: 210 40% 96%; + --accent-foreground: 222.2 84% 4.9%; + --destructive: 0 75% 55%; + --destructive-foreground: 0 0% 100%; + --border: 210 20% 88%; + --input: 210 20% 95%; + --ring: 150 75% 35%; + + /* Medical Status Colors */ + --success: 150 75% 40%; + --success-foreground: 0 0% 100%; + --warning: 45 95% 60%; + --warning-foreground: 210 20% 15%; + --info: 210 100% 50%; + --info-foreground: 0 0% 100%; + + /* Gradients */ + --gradient-primary: linear-gradient(135deg, hsl(150 75% 35%), hsl(150 75% 45%)); + --gradient-medical: linear-gradient(135deg, hsl(150 75% 35%), hsl(210 100% 50%)); + --gradient-subtle: linear-gradient(180deg, hsl(210 20% 98%), hsl(210 25% 95%)); + + /* Shadows */ + --shadow-medical: 0 4px 20px -4px hsl(150 75% 35% / 0.15); + --shadow-card: 0 2px 10px -2px hsl(210 20% 15% / 0.1); + --shadow-glow: 0 0 30px hsl(150 75% 35% / 0.2); + + /* Transitions */ + --transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + --transition-fast: all 0.15s ease-out; + + /* Border Radius */ + --radius: 0.5rem; + --radius-lg: var(--radius); + --radius-md: calc(var(--radius) - 2px); + --radius-sm: calc(var(--radius) - 4px); + + /* Sidebar */ + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + /* .dark { */ + /* --background: 210 25% 8%; */ + /* --foreground: 210 20% 95%; */ + /* --card: 210 25% 10%; */ + /* --card-foreground: 210 20% 95%; */ + /* --popover: 210 25% 10%; */ + /* --popover-foreground: 210 20% 95%; */ + /* --primary: 150 75% 45%; */ + /* --primary-foreground: 0 0% 100%; */ + /* --primary-hover: 150 75% 50%; */ + /* --secondary: 210 25% 15%; */ + /* --secondary-foreground: 210 20% 90%; */ + /* --muted: 210 25% 15%; */ + /* --muted-foreground: 210 15% 65%; */ + /* --accent: 210 100% 55%; */ + /* --accent-foreground: 0 0% 100%; */ + /* --destructive: 0 75% 60%; */ + /* --destructive-foreground: 0 0% 100%; */ + /* --border: 210 25% 20%; */ + /* --input: 210 25% 15%; */ + /* --ring: 150 75% 45%; */ + /* --success: 150 75% 50%; */ + /* --warning: 45 95% 65%; */ + /* --info: 210 100% 60%; */ + /* --gradient-primary: linear-gradient(135deg, hsl(150 75% 45%), hsl(150 75% 55%)); */ + /* --gradient-medical: linear-gradient(135deg, hsl(150 75% 45%), hsl(210 100% 55%)); */ + /* --gradient-subtle: linear-gradient(180deg, hsl(210 25% 8%), hsl(210 25% 12%)); */ + /* --sidebar-background: 240 5.9% 10%; */ + /* --sidebar-foreground: 240 4.8% 95.9%; */ + /* --sidebar-primary: 224.3 76.3% 48%; */ + /* --sidebar-primary-foreground: 0 0% 100%; */ + /* --sidebar-accent: 240 3.7% 15.9%; */ + /* --sidebar-accent-foreground: 240 4.8% 95.9%; */ + /* --sidebar-border: 240 3.7% 15.9%; */ + /* --sidebar-ring: 217.2 91.2% 59.8%; */ +} + +/* Keyframes for Animations */ +@keyframes accordion-down { + from { + height: 0; + } + to { + height: var(--radix-accordion-content-height); + } +} + +@keyframes accordion-up { + from { + height: var(--radix-accordion-content-height); + } + to { + height: 0; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + transform: translateY(10px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slideUp { + 0% { + transform: translateY(100%); + } + 100% { + transform: translateY(0); + } +} + +@keyframes pulseMedical { + 0%, + 100% { + box-shadow: 0 0 0 0 hsl(var(--primary) / 0.4); + } + 50% { + box-shadow: 0 0 0 10px hsl(var(--primary) / 0); + } +} + +/* Base Styles */ +* { + border-color: hsl(var(--border)); + box-sizing: border-box; +} + +body { + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); + line-height: 1.5; + margin: 0; +} + +/* Container */ +.container { + width: 100%; + margin: 0 auto; + padding: 0 2rem; +} + +@media (min-width: 1400px) { + .container { + max-width: 1400px; + } +} + +/* Color Classes */ +.bg-background { + background-color: hsl(var(--background)); +} +.bg-foreground { + background-color: hsl(var(--foreground)); +} +.bg-card { + background-color: hsl(var(--card)); +} +.bg-primary { + background-color: hsl(var(--primary)); +} +.bg-secondary { + background-color: hsl(var(--secondary)); +} +.bg-accent { + background-color: hsl(var(--accent)); +} +.bg-destructive { + background-color: hsl(var(--destructive)); +} +.bg-muted { + background-color: hsl(var(--muted)); +} +.bg-success { + background-color: hsl(var(--success)); +} +.bg-warning { + background-color: hsl(var(--warning)); +} +.bg-info { + background-color: hsl(var(--info)); +} + +.text-background { + color: hsl(var(--background)); +} +.text-foreground { + color: hsl(var(--foreground)); +} +.text-card { + color: hsl(var(--card)); +} +.text-primary { + color: hsl(var(--primary)); +} +.text-secondary { + color: hsl(var(--secondary)); +} +.text-accent { + color: hsl(var(--accent)); +} +.text-destructive { + color: hsl(var(--destructive)); +} +.text-muted { + color: hsl(var(--muted)); +} +.text-success { + color: hsl(var(--success)); +} +.text-warning { + color: hsl(var(--warning)); +} +.text-info { + color: hsl(var(--info)); +} + +.text-primary-foreground { + color: hsl(var(--primary-foreground)); +} +.text-secondary-foreground { + color: hsl(var(--secondary-foreground)); +} +.text-accent-foreground { + color: hsl(var(--accent-foreground)); +} +.text-destructive-foreground { + color: hsl(var(--destructive-foreground)); +} +.text-muted-foreground { + color: hsl(var(--muted-foreground)); +} +.text-success-foreground { + color: hsl(var(--success-foreground)); +} +.text-warning-foreground { + color: hsl(var(--warning-foreground)); +} +.text-info-foreground { + color: hsl(var(--info-foreground)); +} + +.border-primary { + border-color: hsl(var(--primary)); +} +.border-secondary { + border-color: hsl(var(--secondary)); +} +.border-accent { + border-color: hsl(var(--accent)); +} +.border-destructive { + border-color: hsl(var(--destructive)); +} +.border-input { + border-color: hsl(var(--input)); +} + +/* Sidebar Colors */ +.bg-sidebar { + background-color: hsl(var(--sidebar-background)); +} +.text-sidebar { + color: hsl(var(--sidebar-foreground)); +} +.bg-sidebar-primary { + background-color: hsl(var(--sidebar-primary)); +} +.text-sidebar-primary { + color: hsl(var(--sidebar-primary)); +} +.bg-sidebar-accent { + background-color: hsl(var(--sidebar-accent)); +} +.text-sidebar-accent { + color: hsl(var(--sidebar-accent)); +} +.border-sidebar { + border-color: hsl(var(--sidebar-border)); +} + +/* Background Images */ +.bg-gradient-medical { + background-image: var(--gradient-medical); +} +.bg-gradient-primary { + background-image: var(--gradient-primary); +} +.bg-gradient-subtle { + background-image: var(--gradient-subtle); +} + +/* Border Radius */ +.rounded-sm { + border-radius: var(--radius-sm); +} + +/* Form Error Styling */ +.field-error-info { + @apply text-xs ml-1; + color: hsl(var(--destructive)); + /* font-size: 0.875rem; */ + margin-top: 0.25rem; + line-height: 1.25; +} + +/* .rounded-md { border-radius: var */ diff --git a/app/components/app/auth/login.vue b/app/components/app/auth/login.vue new file mode 100644 index 00000000..29fb60b4 --- /dev/null +++ b/app/components/app/auth/login.vue @@ -0,0 +1,74 @@ + + + diff --git a/app/components/app/divison/entry-form.vue b/app/components/app/divison/entry-form.vue new file mode 100644 index 00000000..3008d3c8 --- /dev/null +++ b/app/components/app/divison/entry-form.vue @@ -0,0 +1,125 @@ + + + diff --git a/app/components/app/divison/list-cfg.ts b/app/components/app/divison/list-cfg.ts new file mode 100644 index 00000000..58094521 --- /dev/null +++ b/app/components/app/divison/list-cfg.ts @@ -0,0 +1,86 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-ud.vue')) + +export const cols: Col[] = [ + { width: 100 }, + { }, + { }, + { }, + { width: 50 }, +] + +export const header: Th[][] = [ + [ + { label: 'Id' }, + { label: 'Nama' }, + { label: 'Kode' }, + { label: 'Kelompok' }, + { label: '' }, + ], +] + +export const keys = [ + 'id', + 'firstName', + 'cellphone', + 'birth_place', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + props: { + size: 'sm', + }, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/divison/list.vue b/app/components/app/divison/list.vue new file mode 100644 index 00000000..cf0d5ea2 --- /dev/null +++ b/app/components/app/divison/list.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/app/doctor/entry-form.vue b/app/components/app/doctor/entry-form.vue new file mode 100644 index 00000000..bfa9802e --- /dev/null +++ b/app/components/app/doctor/entry-form.vue @@ -0,0 +1,48 @@ + + + diff --git a/app/components/app/doctor/list-cfg.ts b/app/components/app/doctor/list-cfg.ts new file mode 100644 index 00000000..0cff0cce --- /dev/null +++ b/app/components/app/doctor/list-cfg.ts @@ -0,0 +1,114 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [ + { width: 100 }, + { width: 250 }, + {}, + { width: 100 }, + { width: 100 }, + {}, + {}, + {}, + { width: 120 }, + { width: 100 }, + {}, + {}, +] + +export const header: Th[][] = [ + [ + { label: 'Kode JKN' }, + { label: 'Nama' }, + { label: 'No KTP' }, + { label: 'No SIP' }, + { label: 'No IHS' }, + { label: 'Telpon' }, + { label: 'Fee Ranap' }, + { label: 'Fee Rajal' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'bpjs_code', + 'name', + 'identity_number', + 'sip_no', + 'ihs_number', + 'phone', + 'inPatient_itemPrice', + 'outPatient_itemPrice', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/doctor/list.vue b/app/components/app/doctor/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/doctor/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/doctor/picker.vue b/app/components/app/doctor/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/doctor/search.vue b/app/components/app/doctor/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/doctor/status-badge.vue b/app/components/app/doctor/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/doctor/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/employee/entry-form.vue b/app/components/app/employee/entry-form.vue new file mode 100644 index 00000000..7bb9dfd7 --- /dev/null +++ b/app/components/app/employee/entry-form.vue @@ -0,0 +1,49 @@ + + + diff --git a/app/components/app/employee/list-cfg.ts b/app/components/app/employee/list-cfg.ts new file mode 100644 index 00000000..f697dc88 --- /dev/null +++ b/app/components/app/employee/list-cfg.ts @@ -0,0 +1,109 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +const doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [ + { width: 100 }, + { width: 250 }, + {}, + { width: 100 }, + { width: 100 }, + {}, + {}, + {}, + { width: 100 }, + { width: 100 }, + { width: 100 }, + { width: 50 }, +] + +export const header: Th[][] = [ + [ + { label: 'Kode JKN' }, + { label: 'Nama' }, + { label: 'No KTP' }, + { label: 'No SIP' }, + { label: 'No IHS' }, + { label: 'Telpon' }, + { label: 'Fee Ranap' }, + { label: 'Fee Rajal' }, + { label: 'Status' }, + ], +] + +export const keys = [ + 'bpjs_code', + 'name', + 'identity_number', + 'sip_no', + 'ihs_number', + 'phone', + 'inPatient_itemPrice', + 'outPatient_itemPrice', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + console.log(rec) + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, + status: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return doctorStatus[recX.status_code as keyof typeof doctorStatus] + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/employee/list.vue b/app/components/app/employee/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/employee/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/employee/picker.vue b/app/components/app/employee/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/employee/search.vue b/app/components/app/employee/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/equipment/entry-form.vue b/app/components/app/equipment/entry-form.vue new file mode 100644 index 00000000..759f011d --- /dev/null +++ b/app/components/app/equipment/entry-form.vue @@ -0,0 +1,148 @@ + + + diff --git a/app/components/app/equipment/list-cfg.ts b/app/components/app/equipment/list-cfg.ts new file mode 100644 index 00000000..a2a9f54c --- /dev/null +++ b/app/components/app/equipment/list-cfg.ts @@ -0,0 +1,51 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +export const cols: Col[] = [{ width: 100 }, { width: 250 }, { width: 100 }, { width: 100 }, { width: 100 }, { width: 50 }] + +export const header: Th[][] = [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Stok' }, { label: 'Item' }, { label: 'Satuan' }]] + +export const keys = ['code', 'name', 'stock', 'item_id', 'uom_code', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: Record any> = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.name}`.trim() + }, + item_id: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.item_id + }, + uom_code: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.uom_code + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: Record any> = {} diff --git a/app/components/app/equipment/list.vue b/app/components/app/equipment/list.vue new file mode 100644 index 00000000..c912c977 --- /dev/null +++ b/app/components/app/equipment/list.vue @@ -0,0 +1,38 @@ + + + diff --git a/app/components/app/installation/entry-form.vue b/app/components/app/installation/entry-form.vue new file mode 100644 index 00000000..0b3a0049 --- /dev/null +++ b/app/components/app/installation/entry-form.vue @@ -0,0 +1,124 @@ + + + diff --git a/app/components/app/installation/list-cfg.ts b/app/components/app/installation/list-cfg.ts new file mode 100644 index 00000000..6b8dc5ea --- /dev/null +++ b/app/components/app/installation/list-cfg.ts @@ -0,0 +1,68 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-ud.vue')) + +export const cols: Col[] = [{ width: 100 }, {}, {}, {}, { width: 50 }] + +export const header: Th[][] = [ + [{ label: 'Id' }, { label: 'Nama' }, { label: 'Kode' }, { label: 'Encounter Class' }, { label: '' }], +] + +export const keys = ['id', 'name', 'cellphone', 'religion_code', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.firstName} ${recX.lastName || ''}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + props: { + size: 'sm', + }, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/installation/list.vue b/app/components/app/installation/list.vue new file mode 100644 index 00000000..a6b19eb2 --- /dev/null +++ b/app/components/app/installation/list.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/app/item-price/entry-form.vue b/app/components/app/item-price/entry-form.vue new file mode 100644 index 00000000..e0c97dc8 --- /dev/null +++ b/app/components/app/item-price/entry-form.vue @@ -0,0 +1,50 @@ + + + diff --git a/app/components/app/item-price/list-cfg.ts b/app/components/app/item-price/list-cfg.ts new file mode 100644 index 00000000..e2c72f9c --- /dev/null +++ b/app/components/app/item-price/list-cfg.ts @@ -0,0 +1,46 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [{}, {}, { width: 50 }] + +export const header: Th[][] = [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Aksi' }]] + +export const keys = ['code', 'name', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = {} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/item-price/list.vue b/app/components/app/item-price/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/item-price/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/item-price/picker.vue b/app/components/app/item-price/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/item-price/search.vue b/app/components/app/item-price/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/item-price/status-badge.vue b/app/components/app/item-price/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/item-price/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/item/entry-form.vue b/app/components/app/item/entry-form.vue new file mode 100644 index 00000000..8f6d3abf --- /dev/null +++ b/app/components/app/item/entry-form.vue @@ -0,0 +1,68 @@ + + + diff --git a/app/components/app/item/list-cfg.ts b/app/components/app/item/list-cfg.ts new file mode 100644 index 00000000..e2c72f9c --- /dev/null +++ b/app/components/app/item/list-cfg.ts @@ -0,0 +1,46 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [{}, {}, { width: 50 }] + +export const header: Th[][] = [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Aksi' }]] + +export const keys = ['code', 'name', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = {} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/item/list.vue b/app/components/app/item/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/item/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/item/picker.vue b/app/components/app/item/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/item/search.vue b/app/components/app/item/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/item/status-badge.vue b/app/components/app/item/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/item/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/laborant/entry-form.vue b/app/components/app/laborant/entry-form.vue new file mode 100644 index 00000000..4bf7bc68 --- /dev/null +++ b/app/components/app/laborant/entry-form.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/app/laborant/list-cfg.ts b/app/components/app/laborant/list-cfg.ts new file mode 100644 index 00000000..0cff0cce --- /dev/null +++ b/app/components/app/laborant/list-cfg.ts @@ -0,0 +1,114 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [ + { width: 100 }, + { width: 250 }, + {}, + { width: 100 }, + { width: 100 }, + {}, + {}, + {}, + { width: 120 }, + { width: 100 }, + {}, + {}, +] + +export const header: Th[][] = [ + [ + { label: 'Kode JKN' }, + { label: 'Nama' }, + { label: 'No KTP' }, + { label: 'No SIP' }, + { label: 'No IHS' }, + { label: 'Telpon' }, + { label: 'Fee Ranap' }, + { label: 'Fee Rajal' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'bpjs_code', + 'name', + 'identity_number', + 'sip_no', + 'ihs_number', + 'phone', + 'inPatient_itemPrice', + 'outPatient_itemPrice', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/laborant/list.vue b/app/components/app/laborant/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/laborant/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/laborant/picker.vue b/app/components/app/laborant/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/laborant/search.vue b/app/components/app/laborant/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/laborant/status-badge.vue b/app/components/app/laborant/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/laborant/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/medicine-group/entry-form.vue b/app/components/app/medicine-group/entry-form.vue new file mode 100644 index 00000000..e4f0b60a --- /dev/null +++ b/app/components/app/medicine-group/entry-form.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/components/app/medicine-group/list-cfg.ts b/app/components/app/medicine-group/list-cfg.ts new file mode 100644 index 00000000..e2c72f9c --- /dev/null +++ b/app/components/app/medicine-group/list-cfg.ts @@ -0,0 +1,46 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [{}, {}, { width: 50 }] + +export const header: Th[][] = [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Aksi' }]] + +export const keys = ['code', 'name', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = {} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/medicine-group/list.vue b/app/components/app/medicine-group/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/medicine-group/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/medicine-group/picker.vue b/app/components/app/medicine-group/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/medicine-group/search.vue b/app/components/app/medicine-group/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/medicine-group/status-badge.vue b/app/components/app/medicine-group/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/medicine-group/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/medicine-method/entry-form.vue b/app/components/app/medicine-method/entry-form.vue new file mode 100644 index 00000000..e4f0b60a --- /dev/null +++ b/app/components/app/medicine-method/entry-form.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/components/app/medicine-method/list-cfg.ts b/app/components/app/medicine-method/list-cfg.ts new file mode 100644 index 00000000..e2c72f9c --- /dev/null +++ b/app/components/app/medicine-method/list-cfg.ts @@ -0,0 +1,46 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [{}, {}, { width: 50 }] + +export const header: Th[][] = [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Aksi' }]] + +export const keys = ['code', 'name', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = {} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/medicine-method/list.vue b/app/components/app/medicine-method/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/medicine-method/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/medicine-method/picker.vue b/app/components/app/medicine-method/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/medicine-method/search.vue b/app/components/app/medicine-method/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/medicine/entry-form.vue b/app/components/app/medicine/entry-form.vue new file mode 100644 index 00000000..5d3c495d --- /dev/null +++ b/app/components/app/medicine/entry-form.vue @@ -0,0 +1,80 @@ + + + diff --git a/app/components/app/medicine/list-cfg.ts b/app/components/app/medicine/list-cfg.ts new file mode 100644 index 00000000..e86a0646 --- /dev/null +++ b/app/components/app/medicine/list-cfg.ts @@ -0,0 +1,67 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +export const cols: Col[] = [{}, {}, {}, {}, {}, {}, { width: 50 }] + +export const header: Th[][] = [ + [ + { label: 'Kode' }, + { label: 'Name' }, + { label: 'Kategori' }, + { label: 'Golongan' }, + { label: 'Metode Pemberian' }, + { label: 'Bentuk' }, + { label: 'Stok' }, + { label: 'Aksi' }, + ], +] + +export const keys = ['code', 'name', 'category', 'group', 'method', 'unit', 'total', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + cateogry: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineCategory?.name || '-' + }, + group: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineGroup?.name || '-' + }, + method: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineMethod?.name || '-' + }, + unit: (rec: unknown): unknown => { + return (rec as SmallDetailDto).medicineUnit?.name || '-' + }, +} + +export const funcComponent: RecStrFuncComponent = { + action: (rec: unknown, idx: number): RecComponent => { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + // (_rec) { + // return '-' + // }, +} diff --git a/app/components/app/medicine/list.vue b/app/components/app/medicine/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/medicine/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/medicine/picker.vue b/app/components/app/medicine/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/medicine/search.vue b/app/components/app/medicine/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/medicine/status-badge.vue b/app/components/app/medicine/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/medicine/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/nurse/entry-form.vue b/app/components/app/nurse/entry-form.vue new file mode 100644 index 00000000..4bf7bc68 --- /dev/null +++ b/app/components/app/nurse/entry-form.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/app/nurse/list-cfg.ts b/app/components/app/nurse/list-cfg.ts new file mode 100644 index 00000000..0cff0cce --- /dev/null +++ b/app/components/app/nurse/list-cfg.ts @@ -0,0 +1,114 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [ + { width: 100 }, + { width: 250 }, + {}, + { width: 100 }, + { width: 100 }, + {}, + {}, + {}, + { width: 120 }, + { width: 100 }, + {}, + {}, +] + +export const header: Th[][] = [ + [ + { label: 'Kode JKN' }, + { label: 'Nama' }, + { label: 'No KTP' }, + { label: 'No SIP' }, + { label: 'No IHS' }, + { label: 'Telpon' }, + { label: 'Fee Ranap' }, + { label: 'Fee Rajal' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'bpjs_code', + 'name', + 'identity_number', + 'sip_no', + 'ihs_number', + 'phone', + 'inPatient_itemPrice', + 'outPatient_itemPrice', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/nurse/list.vue b/app/components/app/nurse/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/nurse/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/nurse/picker.vue b/app/components/app/nurse/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/nurse/search.vue b/app/components/app/nurse/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/nurse/status-badge.vue b/app/components/app/nurse/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/nurse/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/nutritionist/entry-form.vue b/app/components/app/nutritionist/entry-form.vue new file mode 100644 index 00000000..4bf7bc68 --- /dev/null +++ b/app/components/app/nutritionist/entry-form.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/app/nutritionist/list-cfg.ts b/app/components/app/nutritionist/list-cfg.ts new file mode 100644 index 00000000..0cff0cce --- /dev/null +++ b/app/components/app/nutritionist/list-cfg.ts @@ -0,0 +1,114 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [ + { width: 100 }, + { width: 250 }, + {}, + { width: 100 }, + { width: 100 }, + {}, + {}, + {}, + { width: 120 }, + { width: 100 }, + {}, + {}, +] + +export const header: Th[][] = [ + [ + { label: 'Kode JKN' }, + { label: 'Nama' }, + { label: 'No KTP' }, + { label: 'No SIP' }, + { label: 'No IHS' }, + { label: 'Telpon' }, + { label: 'Fee Ranap' }, + { label: 'Fee Rajal' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'bpjs_code', + 'name', + 'identity_number', + 'sip_no', + 'ihs_number', + 'phone', + 'inPatient_itemPrice', + 'outPatient_itemPrice', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/nutritionist/list.vue b/app/components/app/nutritionist/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/nutritionist/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/nutritionist/picker.vue b/app/components/app/nutritionist/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/nutritionist/search.vue b/app/components/app/nutritionist/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/nutritionist/status-badge.vue b/app/components/app/nutritionist/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/nutritionist/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/patient/entry-form.vue b/app/components/app/patient/entry-form.vue new file mode 100644 index 00000000..bf0284ec --- /dev/null +++ b/app/components/app/patient/entry-form.vue @@ -0,0 +1,43 @@ + + + diff --git a/app/components/app/patient/list-cfg.ts b/app/components/app/patient/list-cfg.ts new file mode 100644 index 00000000..fd4d0317 --- /dev/null +++ b/app/components/app/patient/list-cfg.ts @@ -0,0 +1,131 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) + +export const cols: Col[] = [ + {}, + {}, + {}, + { width: 100 }, + { width: 120 }, + {}, + {}, + {}, + { width: 100 }, + { width: 100 }, + {}, + { width: 50 }, +] + +export const header: Th[][] = [ + [ + { label: 'Nama' }, + { label: 'Rekam Medis' }, + { label: 'KTP' }, + { label: 'Tgl Lahir' }, + { label: 'Umur' }, + { label: 'JK' }, + { label: 'Pendidikan' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'name', + 'medicalRecord_number', + 'identity_number', + 'birth_date', + 'patient_age', + 'gender', + 'education', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.firstName} ${recX.middleName || ''} ${recX.lastName || ''}` + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + birth_date: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX.birth_date == 'object' && recX.birth_date) { + return (recX.birth_date as Date).toLocaleDateString() + } else if (typeof recX.birth_date == 'string') { + return (recX.birth_date as string).substring(0, 10) + } + return recX.birth_date + }, + patient_age: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.birth_date?.split('T')[0] + }, + gender: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX?.gender_code !== 'number' && recX?.gender_code !== '') { + return 'Tidak Diketahui' + } + return recX.gender_code + }, + education: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX.education_code == 'number' && recX.education_code >= 0) { + return recX.education_code + } else if (typeof recX.education_code) { + return recX.education_code + } + return '-' + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + status(rec, idx) { + if (rec.status === null) { + rec.status_code = 0 + } + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/patient/list.vue b/app/components/app/patient/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/patient/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/patient/picker.vue b/app/components/app/patient/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/patient/search.vue b/app/components/app/patient/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/patient/status-badge.vue b/app/components/app/patient/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/patient/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/person-address/entry-form.vue b/app/components/app/person-address/entry-form.vue new file mode 100644 index 00000000..3160ea82 --- /dev/null +++ b/app/components/app/person-address/entry-form.vue @@ -0,0 +1,170 @@ + + + diff --git a/app/components/app/person-contact/entry-form.vue b/app/components/app/person-contact/entry-form.vue new file mode 100644 index 00000000..a5a4d58c --- /dev/null +++ b/app/components/app/person-contact/entry-form.vue @@ -0,0 +1,111 @@ + + + diff --git a/app/components/app/person-relative/entry-form.vue b/app/components/app/person-relative/entry-form.vue new file mode 100644 index 00000000..fc961520 --- /dev/null +++ b/app/components/app/person-relative/entry-form.vue @@ -0,0 +1,234 @@ + + + diff --git a/app/components/app/person/entry-form.vue b/app/components/app/person/entry-form.vue new file mode 100644 index 00000000..ee365b7b --- /dev/null +++ b/app/components/app/person/entry-form.vue @@ -0,0 +1,340 @@ + + + diff --git a/app/components/app/pharmacist/entry-form.vue b/app/components/app/pharmacist/entry-form.vue new file mode 100644 index 00000000..5dbe9bb0 --- /dev/null +++ b/app/components/app/pharmacist/entry-form.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/app/pharmacist/list-cfg.ts b/app/components/app/pharmacist/list-cfg.ts new file mode 100644 index 00000000..0cff0cce --- /dev/null +++ b/app/components/app/pharmacist/list-cfg.ts @@ -0,0 +1,114 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) +const statusBadge = defineAsyncComponent(() => import('./status-badge.vue')) + +const _doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [ + { width: 100 }, + { width: 250 }, + {}, + { width: 100 }, + { width: 100 }, + {}, + {}, + {}, + { width: 120 }, + { width: 100 }, + {}, + {}, +] + +export const header: Th[][] = [ + [ + { label: 'Kode JKN' }, + { label: 'Nama' }, + { label: 'No KTP' }, + { label: 'No SIP' }, + { label: 'No IHS' }, + { label: 'Telpon' }, + { label: 'Fee Ranap' }, + { label: 'Fee Rajal' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'bpjs_code', + 'name', + 'identity_number', + 'sip_no', + 'ihs_number', + 'phone', + 'inPatient_itemPrice', + 'outPatient_itemPrice', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/pharmacist/list.vue b/app/components/app/pharmacist/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/pharmacist/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/pharmacist/picker.vue b/app/components/app/pharmacist/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/pharmacist/search.vue b/app/components/app/pharmacist/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/pharmacist/status-badge.vue b/app/components/app/pharmacist/status-badge.vue new file mode 100644 index 00000000..32cdfbca --- /dev/null +++ b/app/components/app/pharmacist/status-badge.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/rehab/registration/sep-prosedur/entry-form.vue b/app/components/app/rehab/registration/sep-prosedur/entry-form.vue new file mode 100644 index 00000000..5768c6a0 --- /dev/null +++ b/app/components/app/rehab/registration/sep-prosedur/entry-form.vue @@ -0,0 +1,47 @@ + + + diff --git a/app/components/app/rehab/registration/sep-prosedur/list-cfg.ts b/app/components/app/rehab/registration/sep-prosedur/list-cfg.ts new file mode 100644 index 00000000..24cc80d1 --- /dev/null +++ b/app/components/app/rehab/registration/sep-prosedur/list-cfg.ts @@ -0,0 +1,112 @@ +import type { Col, KeyLabel, RecComponent, RecStrFuncComponent, RecStrFuncUnknown, Th } from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +export const cols: Col[] = [ + {}, + {}, + {}, + { width: 100 }, + { width: 120 }, + {}, + {}, + {}, + { width: 100 }, + { width: 100 }, + {}, + { width: 50 }, +] + +export const header: Th[][] = [ + [ + { label: 'Nama' }, + { label: 'Rekam Medis' }, + { label: 'KTP' }, + { label: 'Tgl Lahir' }, + { label: 'Umur' }, + { label: 'JK' }, + { label: 'Pendidikan' }, + { label: 'Status' }, + { label: '' }, + ], +] + +export const keys = [ + 'name', + 'medicalRecord_number', + 'identity_number', + 'birth_date', + 'patient_age', + 'gender', + 'education', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.firstName} ${recX.middleName || ''} ${recX.lastName || ''}` + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + birth_date: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX.birth_date == 'object' && recX.birth_date) { + return (recX.birth_date as Date).toLocaleDateString() + } else if (typeof recX.birth_date == 'string') { + return (recX.birth_date as string).substring(0, 10) + } + return recX.birth_date + }, + patient_age: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.birth_date?.split('T')[0] + }, + gender: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX?.gender_code !== 'number' && recX?.gender_code !== '') { + return 'Tidak Diketahui' + } + return recX.gender_code + }, + education: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (typeof recX.education_code == 'number' && recX.education_code >= 0) { + return recX.education_code + } else if (typeof recX.education_code) { + return recX.education_code + } + return '-' + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/rehab/registration/sep-prosedur/list.vue b/app/components/app/rehab/registration/sep-prosedur/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/rehab/registration/sep-prosedur/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/rehab/registration/sep-prosedur/picker.vue b/app/components/app/rehab/registration/sep-prosedur/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/rehab/registration/sep-prosedur/search.vue b/app/components/app/rehab/registration/sep-prosedur/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/satusehat/badge-patient.vue b/app/components/app/satusehat/badge-patient.vue new file mode 100644 index 00000000..41202aaf --- /dev/null +++ b/app/components/app/satusehat/badge-patient.vue @@ -0,0 +1,13 @@ + + + diff --git a/app/components/app/satusehat/badge-status.vue b/app/components/app/satusehat/badge-status.vue new file mode 100644 index 00000000..5ff492f0 --- /dev/null +++ b/app/components/app/satusehat/badge-status.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/app/satusehat/badge.vue b/app/components/app/satusehat/badge.vue new file mode 100644 index 00000000..197cb084 --- /dev/null +++ b/app/components/app/satusehat/badge.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/app/satusehat/button-action.vue b/app/components/app/satusehat/button-action.vue new file mode 100644 index 00000000..f8ee85ec --- /dev/null +++ b/app/components/app/satusehat/button-action.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/app/satusehat/card-summary.vue b/app/components/app/satusehat/card-summary.vue new file mode 100644 index 00000000..6d139044 --- /dev/null +++ b/app/components/app/satusehat/card-summary.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/satusehat/entry-form.vue b/app/components/app/satusehat/entry-form.vue new file mode 100644 index 00000000..5768c6a0 --- /dev/null +++ b/app/components/app/satusehat/entry-form.vue @@ -0,0 +1,47 @@ + + + diff --git a/app/components/app/satusehat/list-cfg.ts b/app/components/app/satusehat/list-cfg.ts new file mode 100644 index 00000000..d287a38b --- /dev/null +++ b/app/components/app/satusehat/list-cfg.ts @@ -0,0 +1,78 @@ +import type { Col, KeyLabel, RecComponent, RecStrFuncComponent, RecStrFuncUnknown, Th } from '../../pub/nav/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +export const rowType = { + 1: 'Patient', + 2: 'Encounter', + 3: 'Observation', +} + +export const rowStatus = { + 0: 'Gagal', + 1: 'Pending', + 2: 'Terkirim', +} + +const patientBadge = defineAsyncComponent(() => import('./badge-patient.vue')) +const statusBadge = defineAsyncComponent(() => import('./badge-status.vue')) + +export const cols: Col[] = [ + { width: 100 }, + { width: 100 }, + { width: 100 }, + { width: 100 }, + { width: 100 }, + { width: 100 }, +] + +export const header: Th[][] = [ + [ + { label: 'ID' }, + { label: 'Jenis' }, + { label: 'Pasien' }, + { label: 'Status' }, + { label: 'Terakhir Update' }, + { label: 'FHIR ID' }, + ], +] + +export const keys = ['id', 'resource_type', 'patient', 'status', 'updated_at', 'fhir_id'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.firstName} ${recX.middleName || ''} ${recX.lastName || ''}` + }, +} + +export const funcComponent: RecStrFuncComponent = { + patient(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: patientBadge, + } + return res + }, + status(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: statusBadge, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/satusehat/list.vue b/app/components/app/satusehat/list.vue new file mode 100644 index 00000000..b4730480 --- /dev/null +++ b/app/components/app/satusehat/list.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/app/satusehat/picker.vue b/app/components/app/satusehat/picker.vue new file mode 100644 index 00000000..29f282d7 --- /dev/null +++ b/app/components/app/satusehat/picker.vue @@ -0,0 +1,51 @@ + + + diff --git a/app/components/app/satusehat/search.vue b/app/components/app/satusehat/search.vue new file mode 100644 index 00000000..9e2d2405 --- /dev/null +++ b/app/components/app/satusehat/search.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/app/tools/entry-form.vue b/app/components/app/tools/entry-form.vue new file mode 100644 index 00000000..f1413f62 --- /dev/null +++ b/app/components/app/tools/entry-form.vue @@ -0,0 +1,129 @@ + + + diff --git a/app/components/app/tools/list-cfg.ts b/app/components/app/tools/list-cfg.ts new file mode 100644 index 00000000..71ca97f6 --- /dev/null +++ b/app/components/app/tools/list-cfg.ts @@ -0,0 +1,52 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +export const cols: Col[] = [{ width: 100 }, { width: 250 }, { width: 100 }, { width: 100 }, { width: 50 }] + +export const header: Th[][] = [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Item' }, { label: 'Satuan' }]] + +export const keys = ['code', 'name', 'item_id', 'uom_code', 'action'] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: Record any> = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.name}`.trim() + }, + item_id: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.item_id + }, + uom_code: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.uom_code + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: Record any> = {} diff --git a/app/components/app/tools/list.vue b/app/components/app/tools/list.vue new file mode 100644 index 00000000..5e6d4382 --- /dev/null +++ b/app/components/app/tools/list.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/app/unit/entry-form.vue b/app/components/app/unit/entry-form.vue new file mode 100644 index 00000000..463a6683 --- /dev/null +++ b/app/components/app/unit/entry-form.vue @@ -0,0 +1,125 @@ + + + diff --git a/app/components/app/unit/list-cfg.ts b/app/components/app/unit/list-cfg.ts new file mode 100644 index 00000000..00423066 --- /dev/null +++ b/app/components/app/unit/list-cfg.ts @@ -0,0 +1,86 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-ud.vue')) + +export const cols: Col[] = [ + { width: 100 }, + { }, + { }, + { }, + { width: 50 }, +] + +export const header: Th[][] = [ + [ + { label: 'Id' }, + { label: 'Nama' }, + { label: 'Kode' }, + { label: 'Instalasi' }, + { label: '' }, + ], +] + +export const keys = [ + 'id', + 'firstName', + 'cellphone', + 'birth_place', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + props: { + size: 'sm', + }, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/unit/list.vue b/app/components/app/unit/list.vue new file mode 100644 index 00000000..1baaa6ba --- /dev/null +++ b/app/components/app/unit/list.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/app/user/entry-form.vue b/app/components/app/user/entry-form.vue new file mode 100644 index 00000000..8e2f9a6b --- /dev/null +++ b/app/components/app/user/entry-form.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/components/app/user/list-cfg.ts b/app/components/app/user/list-cfg.ts new file mode 100644 index 00000000..f697dc88 --- /dev/null +++ b/app/components/app/user/list-cfg.ts @@ -0,0 +1,109 @@ +import type { + Col, + KeyLabel, + RecComponent, + RecStrFuncComponent, + RecStrFuncUnknown, + Th, +} from '~/components/pub/custom-ui/data/types' +import { defineAsyncComponent } from 'vue' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue')) + +const doctorStatus = { + 0: 'Tidak Aktif', + 1: 'Aktif', +} + +export const cols: Col[] = [ + { width: 100 }, + { width: 250 }, + {}, + { width: 100 }, + { width: 100 }, + {}, + {}, + {}, + { width: 100 }, + { width: 100 }, + { width: 100 }, + { width: 50 }, +] + +export const header: Th[][] = [ + [ + { label: 'Kode JKN' }, + { label: 'Nama' }, + { label: 'No KTP' }, + { label: 'No SIP' }, + { label: 'No IHS' }, + { label: 'Telpon' }, + { label: 'Fee Ranap' }, + { label: 'Fee Rajal' }, + { label: 'Status' }, + ], +] + +export const keys = [ + 'bpjs_code', + 'name', + 'identity_number', + 'sip_no', + 'ihs_number', + 'phone', + 'inPatient_itemPrice', + 'outPatient_itemPrice', + 'status', + 'action', +] + +export const delKeyNames: KeyLabel[] = [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, +] + +export const funcParsed: RecStrFuncUnknown = { + name: (rec: unknown): unknown => { + console.log(rec) + const recX = rec as SmallDetailDto + return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim() + }, + identity_number: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + if (recX.identity_number?.substring(0, 5) === 'BLANK') { + return '(TANPA NIK)' + } + return recX.identity_number + }, + inPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID') + }, + outPatient_itemPrice: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID') + }, + status: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return doctorStatus[recX.status_code as keyof typeof doctorStatus] + }, +} + +export const funcComponent: RecStrFuncComponent = { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + } + return res + }, +} + +export const funcHtml: RecStrFuncUnknown = { + patient_address(_rec) { + return '-' + }, +} diff --git a/app/components/app/user/list.vue b/app/components/app/user/list.vue new file mode 100644 index 00000000..5b8778d9 --- /dev/null +++ b/app/components/app/user/list.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/app/user/picker.vue b/app/components/app/user/picker.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/app/user/search.vue b/app/components/app/user/search.vue new file mode 100644 index 00000000..e69de29b diff --git a/app/components/content/auth/login.vue b/app/components/content/auth/login.vue new file mode 100644 index 00000000..c933b813 --- /dev/null +++ b/app/components/content/auth/login.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/app/components/content/dashboard/index.vue b/app/components/content/dashboard/index.vue new file mode 100644 index 00000000..2195b428 --- /dev/null +++ b/app/components/content/dashboard/index.vue @@ -0,0 +1,181 @@ + + + diff --git a/app/components/content/device/entry.vue b/app/components/content/device/entry.vue new file mode 100644 index 00000000..79a5b022 --- /dev/null +++ b/app/components/content/device/entry.vue @@ -0,0 +1,62 @@ + + + diff --git a/app/components/content/device/list.vue b/app/components/content/device/list.vue new file mode 100644 index 00000000..8c7bd672 --- /dev/null +++ b/app/components/content/device/list.vue @@ -0,0 +1,65 @@ + + + diff --git a/app/components/content/division/entry.ts b/app/components/content/division/entry.ts new file mode 100644 index 00000000..60617c45 --- /dev/null +++ b/app/components/content/division/entry.ts @@ -0,0 +1,58 @@ +import * as z from 'zod' + +export const division = { + msg: { + placeholder: '---pilih divisi utama', + search: 'kode, nama divisi', + empty: 'divisi tidak ditemukan', + }, + items: [ + { value: '1', label: 'Medical', code: 'MED' }, + { value: '2', label: 'Nursing', code: 'NUR' }, + { value: '3', label: 'Admin', code: 'ADM' }, + { value: '4', label: 'Support', code: 'SUP' }, + { value: '5', label: 'Education', code: 'EDU' }, + { value: '6', label: 'Pharmacy', code: 'PHA' }, + { value: '7', label: 'Radiology', code: 'RAD' }, + { value: '8', label: 'Laboratory', code: 'LAB' }, + { value: '9', label: 'Finance', code: 'FIN' }, + { value: '10', label: 'Human Resources', code: 'HR' }, + { value: '11', label: 'IT Services', code: 'ITS' }, + { value: '12', label: 'Maintenance', code: 'MNT' }, + { value: '13', label: 'Catering', code: 'CAT' }, + { value: '14', label: 'Security', code: 'SEC' }, + { value: '15', label: 'Emergency', code: 'EMR' }, + { value: '16', label: 'Surgery', code: 'SUR' }, + { value: '17', label: 'Outpatient', code: 'OUT' }, + { value: '18', label: 'Inpatient', code: 'INP' }, + { value: '19', label: 'Rehabilitation', code: 'REB' }, + { value: '20', label: 'Research', code: 'RSH' }, + ], +} + +export const schema = z.object({ + name: z.string({ + required_error: 'Nama wajib diisi', + }).min(1, 'Nama divisi wajib diisi'), + + code: z.string({ + required_error: 'Kode wajib diisi', + }).min(1, 'Kode divisi wajib diisi'), + + parentId: z.preprocess( + (input: unknown) => { + if (typeof input === 'string') { + // Handle empty string case + if (input.trim() === '') { + return undefined + } + return Number(input) + } + + return input + }, + z.number({ + required_error: 'Kelompok wajib dipilih', + }).min(1, 'Kelompok wajib dipilih'), + ), +}) diff --git a/app/components/content/division/list.vue b/app/components/content/division/list.vue new file mode 100644 index 00000000..f4bf78e6 --- /dev/null +++ b/app/components/content/division/list.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/app/components/content/employee/entry.vue b/app/components/content/employee/entry.vue new file mode 100644 index 00000000..509baad0 --- /dev/null +++ b/app/components/content/employee/entry.vue @@ -0,0 +1,57 @@ + + + diff --git a/app/components/content/employee/list.vue b/app/components/content/employee/list.vue new file mode 100644 index 00000000..e03c976b --- /dev/null +++ b/app/components/content/employee/list.vue @@ -0,0 +1,63 @@ + + + diff --git a/app/components/content/equipment/list.vue b/app/components/content/equipment/list.vue new file mode 100644 index 00000000..61d2a0b0 --- /dev/null +++ b/app/components/content/equipment/list.vue @@ -0,0 +1,211 @@ + + + diff --git a/app/components/content/installation/entry.ts b/app/components/content/installation/entry.ts new file mode 100644 index 00000000..c003a029 --- /dev/null +++ b/app/components/content/installation/entry.ts @@ -0,0 +1,37 @@ +import * as z from 'zod' + +export const installationConf = { + msg: { + placeholder: '---pilih encounter class (fhir7)', + }, + items: [ + { value: '1', label: 'Ambulatory', code: 'AMB' }, + { value: '2', label: 'Inpatient', code: 'IMP' }, + { value: '3', label: 'Emergency', code: 'EMER' }, + { value: '4', label: 'Observation', code: 'OBSENC' }, + { value: '5', label: 'Pre-admission', code: 'PRENC' }, + { value: '6', label: 'Short Stay', code: 'SS' }, + { value: '7', label: 'Virtual', code: 'VR' }, + { value: '8', label: 'Home Health', code: 'HH' }, + ], +} + +export const schemaConf = z.object({ + name: z + .string({ + required_error: 'Nama instalasi harus diisi', + }) + .min(3, 'Nama instalasi minimal 3 karakter'), + + code: z + .string({ + required_error: 'Kode instalasi harus diisi', + }) + .min(3, 'Kode instalasi minimal 3 karakter'), + + encounterClassCode: z + .string({ + required_error: 'Kelompok encounter class harus dipilih', + }) + .min(1, 'Kelompok encounter class harus dipilih'), +}) diff --git a/app/components/content/installation/list.vue b/app/components/content/installation/list.vue new file mode 100644 index 00000000..01a05baf --- /dev/null +++ b/app/components/content/installation/list.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/app/components/content/item-price/list.vue b/app/components/content/item-price/list.vue new file mode 100644 index 00000000..9a5f567b --- /dev/null +++ b/app/components/content/item-price/list.vue @@ -0,0 +1,71 @@ + + + diff --git a/app/components/content/item/list.vue b/app/components/content/item/list.vue new file mode 100644 index 00000000..41c7311f --- /dev/null +++ b/app/components/content/item/list.vue @@ -0,0 +1,71 @@ + + + diff --git a/app/components/content/material/entry.vue b/app/components/content/material/entry.vue new file mode 100644 index 00000000..50d68455 --- /dev/null +++ b/app/components/content/material/entry.vue @@ -0,0 +1,34 @@ + + + diff --git a/app/components/content/material/list.vue b/app/components/content/material/list.vue new file mode 100644 index 00000000..fa719f46 --- /dev/null +++ b/app/components/content/material/list.vue @@ -0,0 +1,65 @@ + + + diff --git a/app/components/content/medicine-group/list.vue b/app/components/content/medicine-group/list.vue new file mode 100644 index 00000000..93afabff --- /dev/null +++ b/app/components/content/medicine-group/list.vue @@ -0,0 +1,75 @@ + + + diff --git a/app/components/content/medicine-method/list.vue b/app/components/content/medicine-method/list.vue new file mode 100644 index 00000000..43d7a03f --- /dev/null +++ b/app/components/content/medicine-method/list.vue @@ -0,0 +1,74 @@ + + + diff --git a/app/components/content/medicine/entry.vue b/app/components/content/medicine/entry.vue new file mode 100644 index 00000000..3c3b4cfd --- /dev/null +++ b/app/components/content/medicine/entry.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/content/medicine/list.vue b/app/components/content/medicine/list.vue new file mode 100644 index 00000000..19497a7e --- /dev/null +++ b/app/components/content/medicine/list.vue @@ -0,0 +1,63 @@ + + + diff --git a/app/components/content/patient/add.vue b/app/components/content/patient/add.vue new file mode 100644 index 00000000..fd42e0a6 --- /dev/null +++ b/app/components/content/patient/add.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/components/content/patient/list.vue b/app/components/content/patient/list.vue new file mode 100644 index 00000000..7c849395 --- /dev/null +++ b/app/components/content/patient/list.vue @@ -0,0 +1,121 @@ + + + diff --git a/app/components/content/rehab/registration/home.vue b/app/components/content/rehab/registration/home.vue new file mode 100644 index 00000000..7fe1e669 --- /dev/null +++ b/app/components/content/rehab/registration/home.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/app/components/content/rehab/registration/sep-prosedur/add.vue b/app/components/content/rehab/registration/sep-prosedur/add.vue new file mode 100644 index 00000000..128cf74a --- /dev/null +++ b/app/components/content/rehab/registration/sep-prosedur/add.vue @@ -0,0 +1,3 @@ + diff --git a/app/components/content/rehab/registration/sep-prosedur/list.vue b/app/components/content/rehab/registration/sep-prosedur/list.vue new file mode 100644 index 00000000..7f8cf7e1 --- /dev/null +++ b/app/components/content/rehab/registration/sep-prosedur/list.vue @@ -0,0 +1,64 @@ + + + diff --git a/app/components/content/satusehat/const.ts b/app/components/content/satusehat/const.ts new file mode 100644 index 00000000..8dee79cc --- /dev/null +++ b/app/components/content/satusehat/const.ts @@ -0,0 +1,97 @@ +import type { ServiceStatus } from '~/components/pub/base/service-status/type' +import type { Summary } from '~/components/pub/base/summary-card/type' +import type { HeaderPrep, RefSearchNav } from '~/components/pub/custom-ui/data/types' +import { CircleCheckBig, CircleDashed, CircleX, Send } from 'lucide-vue-next' + +export const tabs = [ + { + value: 'all', + label: 'Semua Resource', + }, + { + value: 'patient', + label: 'Patient', + }, + { + value: 'encounter', + label: 'Encounter', + }, + { + value: 'observation', + label: 'Observation', + }, +] + +export const actions = [ + { + value: 'export', + label: 'Ekspor', + icon: 'i-lucide-download', + }, +] + +// Status filter options +export const statusOptions = [ + { value: '0', label: 'Failed' }, + { value: '1', label: 'Pending' }, + { value: '2', label: 'Success' }, +] +export const summaryData: Summary[] = [ + { + title: 'Resource Terkirim', + icon: Send, + metric: 1245, + trend: 0, + timeframe: 'daily', + }, + { + title: 'Sync Success', + icon: CircleCheckBig, + metric: '97%', + trend: 0, + timeframe: 'daily', + }, + { + title: 'Pending Queue', + icon: CircleDashed, + metric: 32, + trend: 0, + timeframe: 'daily', + }, + { + title: 'Failed Items', + icon: CircleX, + metric: 10, + trend: 0, + timeframe: 'daily', + }, +] + +// SATUSEHAT Service integration +export const service = reactive({ + serviceName: 'SATUSEHAT', + serviceDesc: 'SATUSEHAT - FHIR R4 Compliant', + sessionActive: false, + status: 'connecting', + isSkeleton: false, +}) + +export const headerPrep: HeaderPrep = { + title: 'SATUSEHAT Integration', + icon: 'i-lucide-box', + addNav: { + label: 'Kirim Resource', + icon: 'i-lucide-send', + // onClick: () => navigateTo('/patient/add'), + }, +} + +export const refSearchNav: RefSearchNav = { + onClick: () => { + // open filter modal + }, + onInput: (_val: string) => { + }, + onClear: () => { + }, +} diff --git a/app/components/content/satusehat/list.vue b/app/components/content/satusehat/list.vue new file mode 100644 index 00000000..879a3fed --- /dev/null +++ b/app/components/content/satusehat/list.vue @@ -0,0 +1,232 @@ + + + diff --git a/app/components/content/satusehat/schema.query.ts b/app/components/content/satusehat/schema.query.ts new file mode 100644 index 00000000..aab8340f --- /dev/null +++ b/app/components/content/satusehat/schema.query.ts @@ -0,0 +1,23 @@ +import * as z from 'zod' + +const resourceTabEnum = z.enum(['all', 'patient', 'encounter', 'observation']) + +export const tabSwitcher = resourceTabEnum.default('all').catch('all') +export const querySchema = z.object({ + q: z.string().min(3).optional().catch(''), + resource_type: tabSwitcher, + date_from: z.string().optional().catch(''), + date_to: z.string().optional().catch(''), + page: z.coerce.number().int().min(1).default(1).catch(1), + limit: z.coerce.number().int().min(1).max(20).default(10).catch(10), +}) + +export const defaultQuery = { + q: '', + status: '', + resource_type: 'all', + date_from: '', + date_to: '', + page: 1, + limit: 10, +} diff --git a/app/components/content/tools/list.vue b/app/components/content/tools/list.vue new file mode 100644 index 00000000..580dda40 --- /dev/null +++ b/app/components/content/tools/list.vue @@ -0,0 +1,211 @@ + + + diff --git a/app/components/content/unit/entry.ts b/app/components/content/unit/entry.ts new file mode 100644 index 00000000..bf85a0ed --- /dev/null +++ b/app/components/content/unit/entry.ts @@ -0,0 +1,63 @@ +import * as z from 'zod' + +export const unitConf = { + msg: { + placeholder: '--- pilih instalasi', + search: 'kode, nama instalasi', + empty: 'instalasi tidak ditemukan', + }, + items: [ + { value: '1', label: 'Instalasi Medis', code: 'MED' }, + { value: '2', label: 'Instalasi Keperawatan', code: 'NUR' }, + { value: '3', label: 'Instalasi Administrasi', code: 'ADM' }, + { value: '4', label: 'Instalasi Penunjang Non-Medis', code: 'SUP' }, + { value: '5', label: 'Instalasi Pendidikan & Pelatihan', code: 'EDU' }, + { value: '6', label: 'Instalasi Farmasi', code: 'PHA' }, + { value: '7', label: 'Instalasi Radiologi', code: 'RAD' }, + { value: '8', label: 'Instalasi Laboratorium', code: 'LAB' }, + { value: '9', label: 'Instalasi Keuangan', code: 'FIN' }, + { value: '10', label: 'Instalasi SDM', code: 'HR' }, + { value: '11', label: 'Instalasi Teknologi Informasi', code: 'ITS' }, + { value: '12', label: 'Instalasi Pemeliharaan & Sarana', code: 'MNT' }, + { value: '13', label: 'Instalasi Gizi / Catering', code: 'CAT' }, + { value: '14', label: 'Instalasi Keamanan', code: 'SEC' }, + { value: '15', label: 'Instalasi Gawat Darurat', code: 'EMR' }, + { value: '16', label: 'Instalasi Bedah Sentral', code: 'SUR' }, + { value: '17', label: 'Instalasi Rawat Jalan', code: 'OUT' }, + { value: '18', label: 'Instalasi Rawat Inap', code: 'INP' }, + { value: '19', label: 'Instalasi Rehabilitasi Medik', code: 'REB' }, + { value: '20', label: 'Instalasi Penelitian & Pengembangan', code: 'RSH' }, + ], +} + +export const schemaConf = z.object({ + name: z + .string({ + required_error: 'Nama unit harus diisi', + }) + .min(1, 'Nama unit harus diisi'), + + code: z + .string({ + required_error: 'Kode unit harus diisi', + }) + .min(1, 'Kode unit harus diisi'), + parentId: z.preprocess( + (input: unknown) => { + if (typeof input === 'string') { + // Handle empty string case + if (input.trim() === '') { + return 0 + } + return Number(input) + } + + return input + }, + z + .number({ + required_error: 'Instalasi induk harus dipilih', + }) + .refine((num) => num > 0, 'Instalasi induk harus dipilih'), + ), +}) diff --git a/app/components/content/unit/list.vue b/app/components/content/unit/list.vue new file mode 100644 index 00000000..404da13e --- /dev/null +++ b/app/components/content/unit/list.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/app/components/content/user/entry.vue b/app/components/content/user/entry.vue new file mode 100644 index 00000000..7fb4d66d --- /dev/null +++ b/app/components/content/user/entry.vue @@ -0,0 +1,34 @@ + + + diff --git a/app/components/content/user/list.vue b/app/components/content/user/list.vue new file mode 100644 index 00000000..e03c976b --- /dev/null +++ b/app/components/content/user/list.vue @@ -0,0 +1,63 @@ + + + diff --git a/app/components/layout/AppSidebar.vue b/app/components/layout/AppSidebar.vue new file mode 100644 index 00000000..4f51e42c --- /dev/null +++ b/app/components/layout/AppSidebar.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/app/components/layout/Auth.vue b/app/components/layout/Auth.vue new file mode 100644 index 00000000..7ead292a --- /dev/null +++ b/app/components/layout/Auth.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/app/components/layout/Header.vue b/app/components/layout/Header.vue new file mode 100644 index 00000000..369b29ea --- /dev/null +++ b/app/components/layout/Header.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/app/components/layout/SidebarNavFooter.vue b/app/components/layout/SidebarNavFooter.vue new file mode 100644 index 00000000..68d8d9a2 --- /dev/null +++ b/app/components/layout/SidebarNavFooter.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/app/components/layout/SidebarNavGroup.vue b/app/components/layout/SidebarNavGroup.vue new file mode 100644 index 00000000..f9d1a73f --- /dev/null +++ b/app/components/layout/SidebarNavGroup.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/app/components/layout/SidebarNavHeader.vue b/app/components/layout/SidebarNavHeader.vue new file mode 100644 index 00000000..351f7d83 --- /dev/null +++ b/app/components/layout/SidebarNavHeader.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/app/components/layout/SidebarNavLink.vue b/app/components/layout/SidebarNavLink.vue new file mode 100644 index 00000000..07c954ea --- /dev/null +++ b/app/components/layout/SidebarNavLink.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/app/components/pub/base/data-table/data-table.vue b/app/components/pub/base/data-table/data-table.vue new file mode 100644 index 00000000..ccb41100 --- /dev/null +++ b/app/components/pub/base/data-table/data-table.vue @@ -0,0 +1,107 @@ + + + diff --git a/app/components/pub/base/data-table/type.ts b/app/components/pub/base/data-table/type.ts new file mode 100644 index 00000000..019bb037 --- /dev/null +++ b/app/components/pub/base/data-table/type.ts @@ -0,0 +1,4 @@ +export interface DataTableLoader { + isTableLoading: boolean + [key: string]: boolean +} diff --git a/app/components/pub/base/error/error.vue b/app/components/pub/base/error/error.vue new file mode 100644 index 00000000..7f7bc4ea --- /dev/null +++ b/app/components/pub/base/error/error.vue @@ -0,0 +1,51 @@ + + + diff --git a/app/components/pub/base/modal/dialog.vue b/app/components/pub/base/modal/dialog.vue new file mode 100644 index 00000000..548af287 --- /dev/null +++ b/app/components/pub/base/modal/dialog.vue @@ -0,0 +1,54 @@ + + + diff --git a/app/components/pub/base/modal/modal.vue b/app/components/pub/base/modal/modal.vue new file mode 100644 index 00000000..147079e5 --- /dev/null +++ b/app/components/pub/base/modal/modal.vue @@ -0,0 +1,51 @@ + + + diff --git a/app/components/pub/base/service-status/service-status.vue b/app/components/pub/base/service-status/service-status.vue new file mode 100644 index 00000000..3ba2736f --- /dev/null +++ b/app/components/pub/base/service-status/service-status.vue @@ -0,0 +1,72 @@ + + + diff --git a/app/components/pub/base/service-status/type.ts b/app/components/pub/base/service-status/type.ts new file mode 100644 index 00000000..f3d15cd0 --- /dev/null +++ b/app/components/pub/base/service-status/type.ts @@ -0,0 +1,7 @@ +export interface ServiceStatus { + serviceName: string + serviceDesc: string + sessionActive: boolean + status: 'connected' | 'connecting' | 'error' | 'disconnected' + isSkeleton?: boolean +} diff --git a/app/components/pub/base/summary-card/summary-card.vue b/app/components/pub/base/summary-card/summary-card.vue new file mode 100644 index 00000000..35a5b17f --- /dev/null +++ b/app/components/pub/base/summary-card/summary-card.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/app/components/pub/base/summary-card/type.ts b/app/components/pub/base/summary-card/type.ts new file mode 100644 index 00000000..be04a9ce --- /dev/null +++ b/app/components/pub/base/summary-card/type.ts @@ -0,0 +1,7 @@ +export interface Summary { + title: string + icon: Component + metric: number | string + trend: number + timeframe: 'yearly' | 'monthly' | 'weekly' | 'daily' +} diff --git a/app/components/pub/custom-ui/confirmation/README.md b/app/components/pub/custom-ui/confirmation/README.md new file mode 100644 index 00000000..5ee90e58 --- /dev/null +++ b/app/components/pub/custom-ui/confirmation/README.md @@ -0,0 +1,137 @@ +# Confirmation Modal Components + +Sistem confirmation modal yang modular dan dapat digunakan kembali di seluruh aplikasi. + +## Components + +### 1. `confirmation.vue` - Base Confirmation Modal + +Komponen dasar untuk modal konfirmasi yang dapat dikustomisasi. + +**Props:** +- `open?: boolean` - Status modal (terbuka/tertutup) +- `title?: string` - Judul modal (default: "Konfirmasi") +- `message?: string` - Pesan konfirmasi (default: "Apakah Anda yakin ingin melanjutkan?") +- `confirmText?: string` - Text tombol konfirmasi (default: "Ya") +- `cancelText?: string` - Text tombol batal (default: "Batal") +- `variant?: 'default' | 'destructive' | 'warning'` - Varian tampilan (default: "default") +- `size?: 'sm' | 'md' | 'lg' | 'xl'` - Ukuran modal (default: "md") + +**Events:** +- `@confirm` - Dipanggil saat tombol konfirmasi diklik +- `@cancel` - Dipanggil saat tombol batal diklik +- `@update:open` - Dipanggil saat status modal berubah + +**Contoh penggunaan:** +```vue + +``` + +### 2. `record-confirmation.vue` - Record-specific Confirmation + +Komponen khusus untuk konfirmasi operasi pada record/data tertentu. + +**Props:** +- `open?: boolean` - Status modal +- `action?: 'delete' | 'deactivate' | 'activate' | 'archive' | 'restore'` - Jenis aksi (default: "delete") +- `record?: RecordData | null` - Data record yang akan diproses +- `customTitle?: string` - Custom judul (opsional) +- `customMessage?: string` - Custom pesan (opsional) +- `customConfirmText?: string` - Custom text tombol konfirmasi (opsional) +- `customCancelText?: string` - Custom text tombol batal (opsional) + +**Events:** +- `@confirm` - Dipanggil dengan parameter `(record, action)` +- `@cancel` - Dipanggil saat batal +- `@update:open` - Update status modal + +**Contoh penggunaan:** +```vue + +``` + +## Action Types + +Record confirmation mendukung beberapa jenis aksi dengan konfigurasi default: + +- **delete**: Hapus data (variant: destructive, warna merah) +- **deactivate**: Nonaktifkan data (variant: warning, warna kuning) +- **activate**: Aktifkan data (variant: default, warna biru) +- **archive**: Arsipkan data (variant: warning, warna kuning) +- **restore**: Pulihkan data (variant: default, warna biru) + +## Integration Example + +Contoh implementasi di komponen list: + +```vue + + + +``` + +## Styling + +Komponen menggunakan Tailwind CSS dan shadcn/ui components. Pastikan dependencies berikut tersedia: +- `~/components/pub/custom-ui/modal/dialog.vue` +- `~/components/pub/ui/button` diff --git a/app/components/pub/custom-ui/confirmation/confirmation.vue b/app/components/pub/custom-ui/confirmation/confirmation.vue new file mode 100644 index 00000000..e408b31a --- /dev/null +++ b/app/components/pub/custom-ui/confirmation/confirmation.vue @@ -0,0 +1,99 @@ + + + diff --git a/app/components/pub/custom-ui/confirmation/record-confirmation.vue b/app/components/pub/custom-ui/confirmation/record-confirmation.vue new file mode 100644 index 00000000..a544e5b0 --- /dev/null +++ b/app/components/pub/custom-ui/confirmation/record-confirmation.vue @@ -0,0 +1,131 @@ + + + diff --git a/app/components/pub/custom-ui/data/dropdown-action-du.vue b/app/components/pub/custom-ui/data/dropdown-action-du.vue new file mode 100644 index 00000000..b44fafee --- /dev/null +++ b/app/components/pub/custom-ui/data/dropdown-action-du.vue @@ -0,0 +1,70 @@ + + + diff --git a/app/components/pub/custom-ui/data/dropdown-action-ducd.vue b/app/components/pub/custom-ui/data/dropdown-action-ducd.vue new file mode 100644 index 00000000..7cdb781c --- /dev/null +++ b/app/components/pub/custom-ui/data/dropdown-action-ducd.vue @@ -0,0 +1,90 @@ + + + diff --git a/app/components/pub/custom-ui/data/dropdown-action-dud.vue b/app/components/pub/custom-ui/data/dropdown-action-dud.vue new file mode 100644 index 00000000..aa6b8bc8 --- /dev/null +++ b/app/components/pub/custom-ui/data/dropdown-action-dud.vue @@ -0,0 +1,83 @@ + + + diff --git a/app/components/pub/custom-ui/data/dropdown-action-ud.vue b/app/components/pub/custom-ui/data/dropdown-action-ud.vue new file mode 100644 index 00000000..cf29d15d --- /dev/null +++ b/app/components/pub/custom-ui/data/dropdown-action-ud.vue @@ -0,0 +1,75 @@ + + + diff --git a/app/components/pub/custom-ui/data/types.ts b/app/components/pub/custom-ui/data/types.ts new file mode 100644 index 00000000..fe9f9ebd --- /dev/null +++ b/app/components/pub/custom-ui/data/types.ts @@ -0,0 +1,108 @@ +// import type { ComponentType } from '@unovis/ts' +import type { Component } from 'vue' + +export interface ListItemDto { + id: number + name: string + code: string +} + +export type ComponentType = Component + +export interface RecComponent { + idx?: number + rec: object + props?: any + component: ComponentType +} + +export interface Col { + span?: number + classVal?: string + style?: string + width?: number // specific for width + widthUnit?: string // specific for width +} + +export interface Th { + label: string + colSpan?: number + rowSpan?: number + classVal?: string + childClassVal?: string + style?: string + childStyle?: string + hideOnSm?: boolean +} + +export interface ButtonNav { + variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link' + classVal?: string + classValExt?: string + icon?: string + label: string + onClick?: () => void +} + +export interface QuickSearchNav { + inputClass?: string + inputPlaceHolder?: string + btnClass?: string + btnIcon?: string + btnLabel?: string + mainField?: string + searchParams: object + onSubmit?: (searchParams: object) => void +} + +export interface RefSearchNav { + modelValue?: string + placeholder?: string + minLength?: number + debounceMs?: number + inputClass?: string + showValidationFeedback?: boolean + onInput: (val: string) => void + onClick: () => void + onClear: () => void +} + +// prepared header for relatively common usage +export interface HeaderPrep { + title?: string + icon?: string + refSearchNav?: RefSearchNav + quickSearchNav?: QuickSearchNav + filterNav?: ButtonNav + addNav?: ButtonNav + printNav?: ButtonNav +} + +export interface KeyLabel { + key: string + label: string +} +export type FuncRecUnknown = (rec: unknown, idx: number) => unknown +export type FuncComponent = (rec: unknown, idx: number) => RecComponent +export type RecStrFuncUnknown = Record +export type RecStrFuncComponent = Record + +export interface KeyNames { + key: string + label: string +} + +export interface LinkItem { + label: string + icon?: string + href?: string // to cover the needs of stating full external origins full url + action?: string // for local paths + onClick?: (event: Event) => void + headerStatus?: boolean +} + +export const ActionEvents = { + showConfirmDelete: 'showConfirmDel', + showEdit: 'showEdit', + showDetail: 'showDetail', +} diff --git a/app/components/pub/custom-ui/form/block.vue b/app/components/pub/custom-ui/form/block.vue new file mode 100644 index 00000000..27015f7a --- /dev/null +++ b/app/components/pub/custom-ui/form/block.vue @@ -0,0 +1,11 @@ + + + diff --git a/app/components/pub/custom-ui/form/combobox.vue b/app/components/pub/custom-ui/form/combobox.vue new file mode 100644 index 00000000..23f9401f --- /dev/null +++ b/app/components/pub/custom-ui/form/combobox.vue @@ -0,0 +1,112 @@ + + + diff --git a/app/components/pub/custom-ui/form/field-group.vue b/app/components/pub/custom-ui/form/field-group.vue new file mode 100644 index 00000000..48d1be1f --- /dev/null +++ b/app/components/pub/custom-ui/form/field-group.vue @@ -0,0 +1,43 @@ + + + diff --git a/app/components/pub/custom-ui/form/field.vue b/app/components/pub/custom-ui/form/field.vue new file mode 100644 index 00000000..96497be5 --- /dev/null +++ b/app/components/pub/custom-ui/form/field.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/custom-ui/form/label.vue b/app/components/pub/custom-ui/form/label.vue new file mode 100644 index 00000000..42274ee6 --- /dev/null +++ b/app/components/pub/custom-ui/form/label.vue @@ -0,0 +1,55 @@ + + + diff --git a/app/components/pub/custom-ui/form/select.vue b/app/components/pub/custom-ui/form/select.vue new file mode 100644 index 00000000..53911bb8 --- /dev/null +++ b/app/components/pub/custom-ui/form/select.vue @@ -0,0 +1,85 @@ + + + diff --git a/app/components/pub/custom-ui/nav-footer/ba-dr-su-pr.vue b/app/components/pub/custom-ui/nav-footer/ba-dr-su-pr.vue new file mode 100644 index 00000000..5e6f69ab --- /dev/null +++ b/app/components/pub/custom-ui/nav-footer/ba-dr-su-pr.vue @@ -0,0 +1,32 @@ + + + diff --git a/app/components/pub/custom-ui/nav-footer/ba-dr-su.vue b/app/components/pub/custom-ui/nav-footer/ba-dr-su.vue new file mode 100644 index 00000000..17dbd6dc --- /dev/null +++ b/app/components/pub/custom-ui/nav-footer/ba-dr-su.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/components/pub/custom-ui/nav-footer/ba-ed-de-pri.vue b/app/components/pub/custom-ui/nav-footer/ba-ed-de-pri.vue new file mode 100644 index 00000000..18e67b86 --- /dev/null +++ b/app/components/pub/custom-ui/nav-footer/ba-ed-de-pri.vue @@ -0,0 +1,32 @@ + + + diff --git a/app/components/pub/custom-ui/nav-footer/ba-ed-de.vue b/app/components/pub/custom-ui/nav-footer/ba-ed-de.vue new file mode 100644 index 00000000..9c79eba9 --- /dev/null +++ b/app/components/pub/custom-ui/nav-footer/ba-ed-de.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/components/pub/custom-ui/nav-footer/ba-ed-pri.vue b/app/components/pub/custom-ui/nav-footer/ba-ed-pri.vue new file mode 100644 index 00000000..5190ec04 --- /dev/null +++ b/app/components/pub/custom-ui/nav-footer/ba-ed-pri.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/components/pub/custom-ui/nav-footer/ba-ed.vue b/app/components/pub/custom-ui/nav-footer/ba-ed.vue new file mode 100644 index 00000000..e81ce917 --- /dev/null +++ b/app/components/pub/custom-ui/nav-footer/ba-ed.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/custom-ui/nav-footer/ba-su.vue b/app/components/pub/custom-ui/nav-footer/ba-su.vue new file mode 100644 index 00000000..79e18d57 --- /dev/null +++ b/app/components/pub/custom-ui/nav-footer/ba-su.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/custom-ui/nav-header/header.vue b/app/components/pub/custom-ui/nav-header/header.vue new file mode 100644 index 00000000..621691d2 --- /dev/null +++ b/app/components/pub/custom-ui/nav-header/header.vue @@ -0,0 +1,143 @@ + + + diff --git a/app/components/pub/custom-ui/nav-header/prep.vue b/app/components/pub/custom-ui/nav-header/prep.vue new file mode 100644 index 00000000..27398802 --- /dev/null +++ b/app/components/pub/custom-ui/nav-header/prep.vue @@ -0,0 +1,48 @@ + + + diff --git a/app/components/pub/custom-ui/nav-header/search.vue b/app/components/pub/custom-ui/nav-header/search.vue new file mode 100644 index 00000000..7aff7f8f --- /dev/null +++ b/app/components/pub/custom-ui/nav-header/search.vue @@ -0,0 +1,42 @@ + + + diff --git a/app/components/pub/custom-ui/pagination/pagination.type.ts b/app/components/pub/custom-ui/pagination/pagination.type.ts new file mode 100644 index 00000000..5c9d97f5 --- /dev/null +++ b/app/components/pub/custom-ui/pagination/pagination.type.ts @@ -0,0 +1,13 @@ +export interface PaginationMeta { + recordCount: number + // page : current pointer for viewing data + page: number + // pageSize: limit each page request + pageSize: number + // totalPage: recourdCount / pageSize + totalPage: number + // hasNext: check if there is next page + hasNext: boolean + // hasPrev: check if there is previous page + hasPrev: boolean +} diff --git a/app/components/pub/custom-ui/pagination/pagination.vue b/app/components/pub/custom-ui/pagination/pagination.vue new file mode 100644 index 00000000..694e3b7b --- /dev/null +++ b/app/components/pub/custom-ui/pagination/pagination.vue @@ -0,0 +1,130 @@ + + + diff --git a/app/components/pub/ui/accordion/Accordion.vue b/app/components/pub/ui/accordion/Accordion.vue new file mode 100644 index 00000000..1cd25bbe --- /dev/null +++ b/app/components/pub/ui/accordion/Accordion.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/accordion/AccordionContent.vue b/app/components/pub/ui/accordion/AccordionContent.vue new file mode 100644 index 00000000..8ace9297 --- /dev/null +++ b/app/components/pub/ui/accordion/AccordionContent.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/accordion/AccordionItem.vue b/app/components/pub/ui/accordion/AccordionItem.vue new file mode 100644 index 00000000..449c7b6a --- /dev/null +++ b/app/components/pub/ui/accordion/AccordionItem.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/accordion/AccordionTrigger.vue b/app/components/pub/ui/accordion/AccordionTrigger.vue new file mode 100644 index 00000000..fb4a3117 --- /dev/null +++ b/app/components/pub/ui/accordion/AccordionTrigger.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/components/pub/ui/accordion/index.ts b/app/components/pub/ui/accordion/index.ts new file mode 100644 index 00000000..9340ac06 --- /dev/null +++ b/app/components/pub/ui/accordion/index.ts @@ -0,0 +1,4 @@ +export { default as Accordion } from './Accordion.vue' +export { default as AccordionContent } from './AccordionContent.vue' +export { default as AccordionItem } from './AccordionItem.vue' +export { default as AccordionTrigger } from './AccordionTrigger.vue' diff --git a/app/components/pub/ui/alert-dialog/AlertDialog.vue b/app/components/pub/ui/alert-dialog/AlertDialog.vue new file mode 100644 index 00000000..aaa22d70 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialog.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogAction.vue b/app/components/pub/ui/alert-dialog/AlertDialogAction.vue new file mode 100644 index 00000000..61b87234 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogAction.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogCancel.vue b/app/components/pub/ui/alert-dialog/AlertDialogCancel.vue new file mode 100644 index 00000000..6b1d3029 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogCancel.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogContent.vue b/app/components/pub/ui/alert-dialog/AlertDialogContent.vue new file mode 100644 index 00000000..9e90f9b1 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogContent.vue @@ -0,0 +1,43 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogDescription.vue b/app/components/pub/ui/alert-dialog/AlertDialogDescription.vue new file mode 100644 index 00000000..b1a877ac --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogDescription.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogFooter.vue b/app/components/pub/ui/alert-dialog/AlertDialogFooter.vue new file mode 100644 index 00000000..aa4c9010 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogFooter.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogHeader.vue b/app/components/pub/ui/alert-dialog/AlertDialogHeader.vue new file mode 100644 index 00000000..4bab0bb7 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogHeader.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogTitle.vue b/app/components/pub/ui/alert-dialog/AlertDialogTitle.vue new file mode 100644 index 00000000..39d64354 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogTitle.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/AlertDialogTrigger.vue b/app/components/pub/ui/alert-dialog/AlertDialogTrigger.vue new file mode 100644 index 00000000..e790748f --- /dev/null +++ b/app/components/pub/ui/alert-dialog/AlertDialogTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/alert-dialog/index.ts b/app/components/pub/ui/alert-dialog/index.ts new file mode 100644 index 00000000..448d5198 --- /dev/null +++ b/app/components/pub/ui/alert-dialog/index.ts @@ -0,0 +1,9 @@ +export { default as AlertDialog } from './AlertDialog.vue' +export { default as AlertDialogAction } from './AlertDialogAction.vue' +export { default as AlertDialogCancel } from './AlertDialogCancel.vue' +export { default as AlertDialogContent } from './AlertDialogContent.vue' +export { default as AlertDialogDescription } from './AlertDialogDescription.vue' +export { default as AlertDialogFooter } from './AlertDialogFooter.vue' +export { default as AlertDialogHeader } from './AlertDialogHeader.vue' +export { default as AlertDialogTitle } from './AlertDialogTitle.vue' +export { default as AlertDialogTrigger } from './AlertDialogTrigger.vue' diff --git a/app/components/pub/ui/alert/Alert.vue b/app/components/pub/ui/alert/Alert.vue new file mode 100644 index 00000000..69ca5215 --- /dev/null +++ b/app/components/pub/ui/alert/Alert.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/components/pub/ui/alert/AlertDescription.vue b/app/components/pub/ui/alert/AlertDescription.vue new file mode 100644 index 00000000..cc3dd0f0 --- /dev/null +++ b/app/components/pub/ui/alert/AlertDescription.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/alert/AlertTitle.vue b/app/components/pub/ui/alert/AlertTitle.vue new file mode 100644 index 00000000..90ca4ab6 --- /dev/null +++ b/app/components/pub/ui/alert/AlertTitle.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/alert/index.ts b/app/components/pub/ui/alert/index.ts new file mode 100644 index 00000000..36bf919b --- /dev/null +++ b/app/components/pub/ui/alert/index.ts @@ -0,0 +1,24 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Alert } from './Alert.vue' +export { default as AlertDescription } from './AlertDescription.vue' +export { default as AlertTitle } from './AlertTitle.vue' + +export const alertVariants = cva( + 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', + { + variants: { + variant: { + default: 'bg-background text-foreground', + destructive: + 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +export type AlertVariants = VariantProps diff --git a/app/components/pub/ui/aspect-ratio/AspectRatio.vue b/app/components/pub/ui/aspect-ratio/AspectRatio.vue new file mode 100644 index 00000000..69ad8fef --- /dev/null +++ b/app/components/pub/ui/aspect-ratio/AspectRatio.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/aspect-ratio/index.ts b/app/components/pub/ui/aspect-ratio/index.ts new file mode 100644 index 00000000..3faf121c --- /dev/null +++ b/app/components/pub/ui/aspect-ratio/index.ts @@ -0,0 +1 @@ +export { default as AspectRatio } from './AspectRatio.vue' diff --git a/app/components/pub/ui/avatar/Avatar.vue b/app/components/pub/ui/avatar/Avatar.vue new file mode 100644 index 00000000..384327ff --- /dev/null +++ b/app/components/pub/ui/avatar/Avatar.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/avatar/AvatarFallback.vue b/app/components/pub/ui/avatar/AvatarFallback.vue new file mode 100644 index 00000000..1ac23e62 --- /dev/null +++ b/app/components/pub/ui/avatar/AvatarFallback.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/avatar/AvatarImage.vue b/app/components/pub/ui/avatar/AvatarImage.vue new file mode 100644 index 00000000..6ef58f74 --- /dev/null +++ b/app/components/pub/ui/avatar/AvatarImage.vue @@ -0,0 +1,10 @@ + + + diff --git a/app/components/pub/ui/avatar/index.ts b/app/components/pub/ui/avatar/index.ts new file mode 100644 index 00000000..d26e9112 --- /dev/null +++ b/app/components/pub/ui/avatar/index.ts @@ -0,0 +1,25 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Avatar } from './Avatar.vue' +export { default as AvatarFallback } from './AvatarFallback.vue' +export { default as AvatarImage } from './AvatarImage.vue' + +export const avatarVariant = cva( + 'inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden', + { + variants: { + size: { + sm: 'h-10 w-10 text-xs', + base: 'h-16 w-16 text-2xl', + lg: 'h-32 w-32 text-5xl', + }, + shape: { + circle: 'rounded-full', + square: 'rounded-md', + }, + }, + }, +) + +export type AvatarVariants = VariantProps diff --git a/app/components/pub/ui/badge/Badge.vue b/app/components/pub/ui/badge/Badge.vue new file mode 100644 index 00000000..ad0aec4c --- /dev/null +++ b/app/components/pub/ui/badge/Badge.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/components/pub/ui/badge/index.ts b/app/components/pub/ui/badge/index.ts new file mode 100644 index 00000000..4f3e6d83 --- /dev/null +++ b/app/components/pub/ui/badge/index.ts @@ -0,0 +1,26 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Badge } from './Badge.vue' + +export const badgeVariants = cva( + 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +export type BadgeVariants = VariantProps diff --git a/app/components/pub/ui/breadcrumb/Breadcrumb.vue b/app/components/pub/ui/breadcrumb/Breadcrumb.vue new file mode 100644 index 00000000..72ca1437 --- /dev/null +++ b/app/components/pub/ui/breadcrumb/Breadcrumb.vue @@ -0,0 +1,13 @@ + + + diff --git a/app/components/pub/ui/breadcrumb/BreadcrumbEllipsis.vue b/app/components/pub/ui/breadcrumb/BreadcrumbEllipsis.vue new file mode 100644 index 00000000..471bb29b --- /dev/null +++ b/app/components/pub/ui/breadcrumb/BreadcrumbEllipsis.vue @@ -0,0 +1,22 @@ + + + diff --git a/app/components/pub/ui/breadcrumb/BreadcrumbItem.vue b/app/components/pub/ui/breadcrumb/BreadcrumbItem.vue new file mode 100644 index 00000000..3f4e0489 --- /dev/null +++ b/app/components/pub/ui/breadcrumb/BreadcrumbItem.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/pub/ui/breadcrumb/BreadcrumbLink.vue b/app/components/pub/ui/breadcrumb/BreadcrumbLink.vue new file mode 100644 index 00000000..7828e4ca --- /dev/null +++ b/app/components/pub/ui/breadcrumb/BreadcrumbLink.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/breadcrumb/BreadcrumbList.vue b/app/components/pub/ui/breadcrumb/BreadcrumbList.vue new file mode 100644 index 00000000..154d2b4b --- /dev/null +++ b/app/components/pub/ui/breadcrumb/BreadcrumbList.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/pub/ui/breadcrumb/BreadcrumbPage.vue b/app/components/pub/ui/breadcrumb/BreadcrumbPage.vue new file mode 100644 index 00000000..8d8435e3 --- /dev/null +++ b/app/components/pub/ui/breadcrumb/BreadcrumbPage.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/breadcrumb/BreadcrumbSeparator.vue b/app/components/pub/ui/breadcrumb/BreadcrumbSeparator.vue new file mode 100644 index 00000000..aeeb91a6 --- /dev/null +++ b/app/components/pub/ui/breadcrumb/BreadcrumbSeparator.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/breadcrumb/index.ts b/app/components/pub/ui/breadcrumb/index.ts new file mode 100644 index 00000000..05909832 --- /dev/null +++ b/app/components/pub/ui/breadcrumb/index.ts @@ -0,0 +1,7 @@ +export { default as Breadcrumb } from './Breadcrumb.vue' +export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue' +export { default as BreadcrumbItem } from './BreadcrumbItem.vue' +export { default as BreadcrumbLink } from './BreadcrumbLink.vue' +export { default as BreadcrumbList } from './BreadcrumbList.vue' +export { default as BreadcrumbPage } from './BreadcrumbPage.vue' +export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue' diff --git a/app/components/pub/ui/button/Button.vue b/app/components/pub/ui/button/Button.vue new file mode 100644 index 00000000..7fa45408 --- /dev/null +++ b/app/components/pub/ui/button/Button.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/components/pub/ui/button/index.ts b/app/components/pub/ui/button/index.ts new file mode 100644 index 00000000..9720740f --- /dev/null +++ b/app/components/pub/ui/button/index.ts @@ -0,0 +1,36 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Button } from './Button.vue' + +export const buttonVariants = cva( + 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90', + destructive: + 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90', + outline: + 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2', + xs: 'h-7 rounded px-2', + sm: 'h-8 rounded-md px-3 text-xs', + lg: 'h-10 rounded-md px-8', + icon: 'h-9 w-9', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type ButtonVariants = VariantProps diff --git a/app/components/pub/ui/calendar/Calendar.vue b/app/components/pub/ui/calendar/Calendar.vue new file mode 100644 index 00000000..04c8d5a3 --- /dev/null +++ b/app/components/pub/ui/calendar/Calendar.vue @@ -0,0 +1,63 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarCell.vue b/app/components/pub/ui/calendar/CalendarCell.vue new file mode 100644 index 00000000..f5358420 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarCell.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarCellTrigger.vue b/app/components/pub/ui/calendar/CalendarCellTrigger.vue new file mode 100644 index 00000000..aea65898 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarCellTrigger.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarGrid.vue b/app/components/pub/ui/calendar/CalendarGrid.vue new file mode 100644 index 00000000..23544d26 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarGrid.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarGridBody.vue b/app/components/pub/ui/calendar/CalendarGridBody.vue new file mode 100644 index 00000000..ab24c1e4 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarGridBody.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarGridHead.vue b/app/components/pub/ui/calendar/CalendarGridHead.vue new file mode 100644 index 00000000..2f3025d0 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarGridHead.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarGridRow.vue b/app/components/pub/ui/calendar/CalendarGridRow.vue new file mode 100644 index 00000000..ab41a17f --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarGridRow.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarHeadCell.vue b/app/components/pub/ui/calendar/CalendarHeadCell.vue new file mode 100644 index 00000000..6d88f784 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarHeadCell.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarHeader.vue b/app/components/pub/ui/calendar/CalendarHeader.vue new file mode 100644 index 00000000..86f5d427 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarHeader.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarHeading.vue b/app/components/pub/ui/calendar/CalendarHeading.vue new file mode 100644 index 00000000..5684472a --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarHeading.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarNextButton.vue b/app/components/pub/ui/calendar/CalendarNextButton.vue new file mode 100644 index 00000000..3d4f73d1 --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarNextButton.vue @@ -0,0 +1,34 @@ + + + diff --git a/app/components/pub/ui/calendar/CalendarPrevButton.vue b/app/components/pub/ui/calendar/CalendarPrevButton.vue new file mode 100644 index 00000000..a99f4b6a --- /dev/null +++ b/app/components/pub/ui/calendar/CalendarPrevButton.vue @@ -0,0 +1,34 @@ + + + diff --git a/app/components/pub/ui/calendar/index.ts b/app/components/pub/ui/calendar/index.ts new file mode 100644 index 00000000..5239a1bd --- /dev/null +++ b/app/components/pub/ui/calendar/index.ts @@ -0,0 +1,12 @@ +export { default as Calendar } from './Calendar.vue' +export { default as CalendarCell } from './CalendarCell.vue' +export { default as CalendarCellTrigger } from './CalendarCellTrigger.vue' +export { default as CalendarGrid } from './CalendarGrid.vue' +export { default as CalendarGridBody } from './CalendarGridBody.vue' +export { default as CalendarGridHead } from './CalendarGridHead.vue' +export { default as CalendarGridRow } from './CalendarGridRow.vue' +export { default as CalendarHeadCell } from './CalendarHeadCell.vue' +export { default as CalendarHeader } from './CalendarHeader.vue' +export { default as CalendarHeading } from './CalendarHeading.vue' +export { default as CalendarNextButton } from './CalendarNextButton.vue' +export { default as CalendarPrevButton } from './CalendarPrevButton.vue' diff --git a/app/components/pub/ui/card/Card.vue b/app/components/pub/ui/card/Card.vue new file mode 100644 index 00000000..90d5db70 --- /dev/null +++ b/app/components/pub/ui/card/Card.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/card/CardContent.vue b/app/components/pub/ui/card/CardContent.vue new file mode 100644 index 00000000..1f304071 --- /dev/null +++ b/app/components/pub/ui/card/CardContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/card/CardDescription.vue b/app/components/pub/ui/card/CardDescription.vue new file mode 100644 index 00000000..b17e1d89 --- /dev/null +++ b/app/components/pub/ui/card/CardDescription.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/card/CardFooter.vue b/app/components/pub/ui/card/CardFooter.vue new file mode 100644 index 00000000..08a2bd84 --- /dev/null +++ b/app/components/pub/ui/card/CardFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/card/CardHeader.vue b/app/components/pub/ui/card/CardHeader.vue new file mode 100644 index 00000000..d6f6ecf4 --- /dev/null +++ b/app/components/pub/ui/card/CardHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/card/CardTitle.vue b/app/components/pub/ui/card/CardTitle.vue new file mode 100644 index 00000000..efd2875d --- /dev/null +++ b/app/components/pub/ui/card/CardTitle.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/components/pub/ui/card/index.ts b/app/components/pub/ui/card/index.ts new file mode 100644 index 00000000..9ff6d5e7 --- /dev/null +++ b/app/components/pub/ui/card/index.ts @@ -0,0 +1,6 @@ +export { default as Card } from './Card.vue' +export { default as CardContent } from './CardContent.vue' +export { default as CardDescription } from './CardDescription.vue' +export { default as CardFooter } from './CardFooter.vue' +export { default as CardHeader } from './CardHeader.vue' +export { default as CardTitle } from './CardTitle.vue' diff --git a/app/components/pub/ui/carousel/Carousel.vue b/app/components/pub/ui/carousel/Carousel.vue new file mode 100644 index 00000000..8a78b61d --- /dev/null +++ b/app/components/pub/ui/carousel/Carousel.vue @@ -0,0 +1,45 @@ + + + diff --git a/app/components/pub/ui/carousel/CarouselContent.vue b/app/components/pub/ui/carousel/CarouselContent.vue new file mode 100644 index 00000000..74f4896a --- /dev/null +++ b/app/components/pub/ui/carousel/CarouselContent.vue @@ -0,0 +1,30 @@ + + + diff --git a/app/components/pub/ui/carousel/CarouselItem.vue b/app/components/pub/ui/carousel/CarouselItem.vue new file mode 100644 index 00000000..9e0915bb --- /dev/null +++ b/app/components/pub/ui/carousel/CarouselItem.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/carousel/CarouselNext.vue b/app/components/pub/ui/carousel/CarouselNext.vue new file mode 100644 index 00000000..dbcc33dc --- /dev/null +++ b/app/components/pub/ui/carousel/CarouselNext.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/carousel/CarouselPrevious.vue b/app/components/pub/ui/carousel/CarouselPrevious.vue new file mode 100644 index 00000000..a0160401 --- /dev/null +++ b/app/components/pub/ui/carousel/CarouselPrevious.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/carousel/index.ts b/app/components/pub/ui/carousel/index.ts new file mode 100644 index 00000000..c37ad02d --- /dev/null +++ b/app/components/pub/ui/carousel/index.ts @@ -0,0 +1,10 @@ +export { default as Carousel } from './Carousel.vue' +export { default as CarouselContent } from './CarouselContent.vue' +export { default as CarouselItem } from './CarouselItem.vue' +export { default as CarouselNext } from './CarouselNext.vue' +export { default as CarouselPrevious } from './CarouselPrevious.vue' +export { useCarousel } from './useCarousel' + +export type { + EmblaCarouselType as CarouselApi, +} from 'embla-carousel' diff --git a/app/components/pub/ui/carousel/interface.ts b/app/components/pub/ui/carousel/interface.ts new file mode 100644 index 00000000..99c4f1a8 --- /dev/null +++ b/app/components/pub/ui/carousel/interface.ts @@ -0,0 +1,20 @@ +import type { + EmblaCarouselType as CarouselApi, + EmblaOptionsType as CarouselOptions, + EmblaPluginType as CarouselPlugin, +} from 'embla-carousel' +import type { HTMLAttributes, Ref } from 'vue' + +export interface CarouselProps { + opts?: CarouselOptions | Ref + plugins?: CarouselPlugin[] | Ref + orientation?: 'horizontal' | 'vertical' +} + +export interface CarouselEmits { + (e: 'init-api', payload: CarouselApi): void +} + +export interface WithClassAsProps { + class?: HTMLAttributes['class'] +} diff --git a/app/components/pub/ui/carousel/useCarousel.ts b/app/components/pub/ui/carousel/useCarousel.ts new file mode 100644 index 00000000..fa5781c8 --- /dev/null +++ b/app/components/pub/ui/carousel/useCarousel.ts @@ -0,0 +1,59 @@ +import type { + EmblaCarouselType as CarouselApi, +} from 'embla-carousel' +import type { CarouselEmits, CarouselProps } from './interface' +import { createInjectionState } from '@vueuse/core' +import emblaCarouselVue from 'embla-carousel-vue' +import { onMounted, ref } from 'vue' + +const [useProvideCarousel, useInjectCarousel] = createInjectionState( + ({ + opts, + orientation, + plugins, + }: CarouselProps, emits: CarouselEmits) => { + const [emblaNode, emblaApi] = emblaCarouselVue({ + ...opts, + axis: orientation === 'horizontal' ? 'x' : 'y', + }, plugins) + + function scrollPrev() { + emblaApi.value?.scrollPrev() + } + function scrollNext() { + emblaApi.value?.scrollNext() + } + + const canScrollNext = ref(true) + const canScrollPrev = ref(true) + + function onSelect(api: CarouselApi) { + canScrollNext.value = api.canScrollNext() + canScrollPrev.value = api.canScrollPrev() + } + + onMounted(() => { + if (!emblaApi.value) + { return } + + emblaApi.value?.on('init', onSelect) + emblaApi.value?.on('reInit', onSelect) + emblaApi.value?.on('select', onSelect) + + emits('init-api', emblaApi.value) + }) + + return { carouselRef: emblaNode, carouselApi: emblaApi, canScrollPrev, canScrollNext, scrollPrev, scrollNext, orientation } + }, +) + +function useCarousel() { + const carouselState = useInjectCarousel() + + if (!carouselState) + { throw new Error('useCarousel must be used within a ') } + + return carouselState +} + +export { useCarousel, useProvideCarousel } diff --git a/app/components/pub/ui/chart-area/AreaChart.vue b/app/components/pub/ui/chart-area/AreaChart.vue new file mode 100644 index 00000000..c8efbfa6 --- /dev/null +++ b/app/components/pub/ui/chart-area/AreaChart.vue @@ -0,0 +1,138 @@ + + + diff --git a/app/components/pub/ui/chart-area/index.ts b/app/components/pub/ui/chart-area/index.ts new file mode 100644 index 00000000..2415a56c --- /dev/null +++ b/app/components/pub/ui/chart-area/index.ts @@ -0,0 +1,66 @@ +import type { Spacing } from '@unovis/ts' + +export { default as AreaChart } from './AreaChart.vue' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/app/components/pub/ui/chart-bar/BarChart.vue b/app/components/pub/ui/chart-bar/BarChart.vue new file mode 100644 index 00000000..f3feda20 --- /dev/null +++ b/app/components/pub/ui/chart-bar/BarChart.vue @@ -0,0 +1,117 @@ + + + diff --git a/app/components/pub/ui/chart-bar/index.ts b/app/components/pub/ui/chart-bar/index.ts new file mode 100644 index 00000000..762f2ce3 --- /dev/null +++ b/app/components/pub/ui/chart-bar/index.ts @@ -0,0 +1,66 @@ +import type { Spacing } from '@unovis/ts' + +export { default as BarChart } from './BarChart.vue' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/app/components/pub/ui/chart-donut/DonutChart.vue b/app/components/pub/ui/chart-donut/DonutChart.vue new file mode 100644 index 00000000..b8e69309 --- /dev/null +++ b/app/components/pub/ui/chart-donut/DonutChart.vue @@ -0,0 +1,102 @@ + + + diff --git a/app/components/pub/ui/chart-donut/index.ts b/app/components/pub/ui/chart-donut/index.ts new file mode 100644 index 00000000..db2b49d0 --- /dev/null +++ b/app/components/pub/ui/chart-donut/index.ts @@ -0,0 +1,39 @@ +import type { Spacing } from '@unovis/ts' + +export { default as DonutChart } from './DonutChart.vue' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean +} diff --git a/app/components/pub/ui/chart-line/LineChart.vue b/app/components/pub/ui/chart-line/LineChart.vue new file mode 100644 index 00000000..3cb6113a --- /dev/null +++ b/app/components/pub/ui/chart-line/LineChart.vue @@ -0,0 +1,107 @@ + + + diff --git a/app/components/pub/ui/chart-line/index.ts b/app/components/pub/ui/chart-line/index.ts new file mode 100644 index 00000000..1078d270 --- /dev/null +++ b/app/components/pub/ui/chart-line/index.ts @@ -0,0 +1,66 @@ +import type { Spacing } from '@unovis/ts' + +export { default as LineChart } from './LineChart.vue' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/app/components/pub/ui/chart/ChartCrosshair.vue b/app/components/pub/ui/chart/ChartCrosshair.vue new file mode 100644 index 00000000..f49600f6 --- /dev/null +++ b/app/components/pub/ui/chart/ChartCrosshair.vue @@ -0,0 +1,45 @@ + + + diff --git a/app/components/pub/ui/chart/ChartLegend.vue b/app/components/pub/ui/chart/ChartLegend.vue new file mode 100644 index 00000000..225adc94 --- /dev/null +++ b/app/components/pub/ui/chart/ChartLegend.vue @@ -0,0 +1,50 @@ + + + diff --git a/app/components/pub/ui/chart/ChartSingleTooltip.vue b/app/components/pub/ui/chart/ChartSingleTooltip.vue new file mode 100644 index 00000000..17594762 --- /dev/null +++ b/app/components/pub/ui/chart/ChartSingleTooltip.vue @@ -0,0 +1,66 @@ + + + diff --git a/app/components/pub/ui/chart/ChartTooltip.vue b/app/components/pub/ui/chart/ChartTooltip.vue new file mode 100644 index 00000000..24907f5f --- /dev/null +++ b/app/components/pub/ui/chart/ChartTooltip.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/pub/ui/chart/index.ts b/app/components/pub/ui/chart/index.ts new file mode 100644 index 00000000..7426ca17 --- /dev/null +++ b/app/components/pub/ui/chart/index.ts @@ -0,0 +1,18 @@ +export { default as ChartCrosshair } from './ChartCrosshair.vue' +export { default as ChartLegend } from './ChartLegend.vue' +export { default as ChartSingleTooltip } from './ChartSingleTooltip.vue' +export { default as ChartTooltip } from './ChartTooltip.vue' + +export function defaultColors(count: number = 3) { + const quotient = Math.floor(count / 2) + const remainder = count % 2 + + const primaryCount = quotient + remainder + const secondaryCount = quotient + return [ + ...Array.from(Array.from({ length: primaryCount }).keys()).map(i => `hsl(var(--primary) / ${1 - (1 / primaryCount) * i})`), + ...Array.from(Array.from({ length: secondaryCount }).keys()).map(i => `hsl(var(--vis-secondary-color) / ${1 - (1 / secondaryCount) * i})`), + ] +} + +export * from './interface' diff --git a/app/components/pub/ui/chart/interface.ts b/app/components/pub/ui/chart/interface.ts new file mode 100644 index 00000000..c3838afc --- /dev/null +++ b/app/components/pub/ui/chart/interface.ts @@ -0,0 +1,64 @@ +import type { Spacing } from '@unovis/ts' + +type KeyOf> = Extract + +export interface BaseChartProps> { + /** + * The source data, in which each entry is a dictionary. + */ + data: T[] + /** + * Select the categories from your data. Used to populate the legend and toolip. + */ + categories: KeyOf[] + /** + * Sets the key to map the data to the axis. + */ + index: KeyOf + /** + * Change the default colors. + */ + colors?: string[] + /** + * Margin of each the container + */ + margin?: Spacing + /** + * Change the opacity of the non-selected field + * @default 0.2 + */ + filterOpacity?: number + /** + * Function to format X label + */ + xFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Function to format Y label + */ + yFormatter?: (tick: number | Date, i: number, ticks: number[] | Date[]) => string + /** + * Controls the visibility of the X axis. + * @default true + */ + showXAxis?: boolean + /** + * Controls the visibility of the Y axis. + * @default true + */ + showYAxis?: boolean + /** + * Controls the visibility of tooltip. + * @default true + */ + showTooltip?: boolean + /** + * Controls the visibility of legend. + * @default true + */ + showLegend?: boolean + /** + * Controls the visibility of gridline. + * @default true + */ + showGridLine?: boolean +} diff --git a/app/components/pub/ui/checkbox/Checkbox.vue b/app/components/pub/ui/checkbox/Checkbox.vue new file mode 100644 index 00000000..f8b25c7a --- /dev/null +++ b/app/components/pub/ui/checkbox/Checkbox.vue @@ -0,0 +1,33 @@ + + + diff --git a/app/components/pub/ui/checkbox/index.ts b/app/components/pub/ui/checkbox/index.ts new file mode 100644 index 00000000..8c28c286 --- /dev/null +++ b/app/components/pub/ui/checkbox/index.ts @@ -0,0 +1 @@ +export { default as Checkbox } from './Checkbox.vue' diff --git a/app/components/pub/ui/collapsible/Collapsible.vue b/app/components/pub/ui/collapsible/Collapsible.vue new file mode 100644 index 00000000..fae7919c --- /dev/null +++ b/app/components/pub/ui/collapsible/Collapsible.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/collapsible/CollapsibleContent.vue b/app/components/pub/ui/collapsible/CollapsibleContent.vue new file mode 100644 index 00000000..5c82af24 --- /dev/null +++ b/app/components/pub/ui/collapsible/CollapsibleContent.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/collapsible/CollapsibleTrigger.vue b/app/components/pub/ui/collapsible/CollapsibleTrigger.vue new file mode 100644 index 00000000..e3074994 --- /dev/null +++ b/app/components/pub/ui/collapsible/CollapsibleTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/collapsible/index.ts b/app/components/pub/ui/collapsible/index.ts new file mode 100644 index 00000000..abab9567 --- /dev/null +++ b/app/components/pub/ui/collapsible/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from './Collapsible.vue' +export { default as CollapsibleContent } from './CollapsibleContent.vue' +export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' diff --git a/app/components/pub/ui/command/Command.vue b/app/components/pub/ui/command/Command.vue new file mode 100644 index 00000000..bf013df6 --- /dev/null +++ b/app/components/pub/ui/command/Command.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/command/CommandDialog.vue b/app/components/pub/ui/command/CommandDialog.vue new file mode 100644 index 00000000..efe417df --- /dev/null +++ b/app/components/pub/ui/command/CommandDialog.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/command/CommandEmpty.vue b/app/components/pub/ui/command/CommandEmpty.vue new file mode 100644 index 00000000..a21f3109 --- /dev/null +++ b/app/components/pub/ui/command/CommandEmpty.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/command/CommandGroup.vue b/app/components/pub/ui/command/CommandGroup.vue new file mode 100644 index 00000000..04b9c094 --- /dev/null +++ b/app/components/pub/ui/command/CommandGroup.vue @@ -0,0 +1,30 @@ + + + diff --git a/app/components/pub/ui/command/CommandInput.vue b/app/components/pub/ui/command/CommandInput.vue new file mode 100644 index 00000000..c75ee3d7 --- /dev/null +++ b/app/components/pub/ui/command/CommandInput.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/command/CommandItem.vue b/app/components/pub/ui/command/CommandItem.vue new file mode 100644 index 00000000..b79c8376 --- /dev/null +++ b/app/components/pub/ui/command/CommandItem.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/command/CommandList.vue b/app/components/pub/ui/command/CommandList.vue new file mode 100644 index 00000000..99b3269f --- /dev/null +++ b/app/components/pub/ui/command/CommandList.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/components/pub/ui/command/CommandSeparator.vue b/app/components/pub/ui/command/CommandSeparator.vue new file mode 100644 index 00000000..c22cdc3a --- /dev/null +++ b/app/components/pub/ui/command/CommandSeparator.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/command/CommandShortcut.vue b/app/components/pub/ui/command/CommandShortcut.vue new file mode 100644 index 00000000..aed37517 --- /dev/null +++ b/app/components/pub/ui/command/CommandShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/command/index.ts b/app/components/pub/ui/command/index.ts new file mode 100644 index 00000000..0e35f4b9 --- /dev/null +++ b/app/components/pub/ui/command/index.ts @@ -0,0 +1,9 @@ +export { default as Command } from './Command.vue' +export { default as CommandDialog } from './CommandDialog.vue' +export { default as CommandEmpty } from './CommandEmpty.vue' +export { default as CommandGroup } from './CommandGroup.vue' +export { default as CommandInput } from './CommandInput.vue' +export { default as CommandItem } from './CommandItem.vue' +export { default as CommandList } from './CommandList.vue' +export { default as CommandSeparator } from './CommandSeparator.vue' +export { default as CommandShortcut } from './CommandShortcut.vue' diff --git a/app/components/pub/ui/context-menu/ContextMenu.vue b/app/components/pub/ui/context-menu/ContextMenu.vue new file mode 100644 index 00000000..363e9c6b --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenu.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuCheckboxItem.vue b/app/components/pub/ui/context-menu/ContextMenuCheckboxItem.vue new file mode 100644 index 00000000..2dee4a75 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuCheckboxItem.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuContent.vue b/app/components/pub/ui/context-menu/ContextMenuContent.vue new file mode 100644 index 00000000..a4ddf29b --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuContent.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuGroup.vue b/app/components/pub/ui/context-menu/ContextMenuGroup.vue new file mode 100644 index 00000000..4dda085d --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuGroup.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuItem.vue b/app/components/pub/ui/context-menu/ContextMenuItem.vue new file mode 100644 index 00000000..9b0c703b --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuItem.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuLabel.vue b/app/components/pub/ui/context-menu/ContextMenuLabel.vue new file mode 100644 index 00000000..83e09f70 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuLabel.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuPortal.vue b/app/components/pub/ui/context-menu/ContextMenuPortal.vue new file mode 100644 index 00000000..28e2192d --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuPortal.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuRadioGroup.vue b/app/components/pub/ui/context-menu/ContextMenuRadioGroup.vue new file mode 100644 index 00000000..a40feffb --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuRadioGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuRadioItem.vue b/app/components/pub/ui/context-menu/ContextMenuRadioItem.vue new file mode 100644 index 00000000..88a672e9 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuRadioItem.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuSeparator.vue b/app/components/pub/ui/context-menu/ContextMenuSeparator.vue new file mode 100644 index 00000000..a5d8a0a3 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuSeparator.vue @@ -0,0 +1,22 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuShortcut.vue b/app/components/pub/ui/context-menu/ContextMenuShortcut.vue new file mode 100644 index 00000000..aed37517 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuSub.vue b/app/components/pub/ui/context-menu/ContextMenuSub.vue new file mode 100644 index 00000000..0d3c61db --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuSubContent.vue b/app/components/pub/ui/context-menu/ContextMenuSubContent.vue new file mode 100644 index 00000000..54a8f242 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuSubContent.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuSubTrigger.vue b/app/components/pub/ui/context-menu/ContextMenuSubTrigger.vue new file mode 100644 index 00000000..128b6162 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuSubTrigger.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/pub/ui/context-menu/ContextMenuTrigger.vue b/app/components/pub/ui/context-menu/ContextMenuTrigger.vue new file mode 100644 index 00000000..136ee589 --- /dev/null +++ b/app/components/pub/ui/context-menu/ContextMenuTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/context-menu/index.ts b/app/components/pub/ui/context-menu/index.ts new file mode 100644 index 00000000..3ed59e63 --- /dev/null +++ b/app/components/pub/ui/context-menu/index.ts @@ -0,0 +1,14 @@ +export { default as ContextMenu } from './ContextMenu.vue' +export { default as ContextMenuCheckboxItem } from './ContextMenuCheckboxItem.vue' +export { default as ContextMenuContent } from './ContextMenuContent.vue' +export { default as ContextMenuGroup } from './ContextMenuGroup.vue' +export { default as ContextMenuItem } from './ContextMenuItem.vue' +export { default as ContextMenuLabel } from './ContextMenuLabel.vue' +export { default as ContextMenuRadioGroup } from './ContextMenuRadioGroup.vue' +export { default as ContextMenuRadioItem } from './ContextMenuRadioItem.vue' +export { default as ContextMenuSeparator } from './ContextMenuSeparator.vue' +export { default as ContextMenuShortcut } from './ContextMenuShortcut.vue' +export { default as ContextMenuSub } from './ContextMenuSub.vue' +export { default as ContextMenuSubContent } from './ContextMenuSubContent.vue' +export { default as ContextMenuSubTrigger } from './ContextMenuSubTrigger.vue' +export { default as ContextMenuTrigger } from './ContextMenuTrigger.vue' diff --git a/app/components/pub/ui/dialog/Dialog.vue b/app/components/pub/ui/dialog/Dialog.vue new file mode 100644 index 00000000..5f6a5632 --- /dev/null +++ b/app/components/pub/ui/dialog/Dialog.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogClose.vue b/app/components/pub/ui/dialog/DialogClose.vue new file mode 100644 index 00000000..1fa61805 --- /dev/null +++ b/app/components/pub/ui/dialog/DialogClose.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogContent.vue b/app/components/pub/ui/dialog/DialogContent.vue new file mode 100644 index 00000000..a59a0234 --- /dev/null +++ b/app/components/pub/ui/dialog/DialogContent.vue @@ -0,0 +1,51 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogDescription.vue b/app/components/pub/ui/dialog/DialogDescription.vue new file mode 100644 index 00000000..3444c492 --- /dev/null +++ b/app/components/pub/ui/dialog/DialogDescription.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogFooter.vue b/app/components/pub/ui/dialog/DialogFooter.vue new file mode 100644 index 00000000..4627374d --- /dev/null +++ b/app/components/pub/ui/dialog/DialogFooter.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogHeader.vue b/app/components/pub/ui/dialog/DialogHeader.vue new file mode 100644 index 00000000..8948edca --- /dev/null +++ b/app/components/pub/ui/dialog/DialogHeader.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogScrollContent.vue b/app/components/pub/ui/dialog/DialogScrollContent.vue new file mode 100644 index 00000000..802b5182 --- /dev/null +++ b/app/components/pub/ui/dialog/DialogScrollContent.vue @@ -0,0 +1,60 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogTitle.vue b/app/components/pub/ui/dialog/DialogTitle.vue new file mode 100644 index 00000000..2f22d603 --- /dev/null +++ b/app/components/pub/ui/dialog/DialogTitle.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/dialog/DialogTrigger.vue b/app/components/pub/ui/dialog/DialogTrigger.vue new file mode 100644 index 00000000..b966b29d --- /dev/null +++ b/app/components/pub/ui/dialog/DialogTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/dialog/index.ts b/app/components/pub/ui/dialog/index.ts new file mode 100644 index 00000000..ca8cfeae --- /dev/null +++ b/app/components/pub/ui/dialog/index.ts @@ -0,0 +1,9 @@ +export { default as Dialog } from './Dialog.vue' +export { default as DialogClose } from './DialogClose.vue' +export { default as DialogContent } from './DialogContent.vue' +export { default as DialogDescription } from './DialogDescription.vue' +export { default as DialogFooter } from './DialogFooter.vue' +export { default as DialogHeader } from './DialogHeader.vue' +export { default as DialogScrollContent } from './DialogScrollContent.vue' +export { default as DialogTitle } from './DialogTitle.vue' +export { default as DialogTrigger } from './DialogTrigger.vue' diff --git a/app/components/pub/ui/drawer/Drawer.vue b/app/components/pub/ui/drawer/Drawer.vue new file mode 100644 index 00000000..8be66568 --- /dev/null +++ b/app/components/pub/ui/drawer/Drawer.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/drawer/DrawerContent.vue b/app/components/pub/ui/drawer/DrawerContent.vue new file mode 100644 index 00000000..9be84b5b --- /dev/null +++ b/app/components/pub/ui/drawer/DrawerContent.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/pub/ui/drawer/DrawerDescription.vue b/app/components/pub/ui/drawer/DrawerDescription.vue new file mode 100644 index 00000000..8baddf33 --- /dev/null +++ b/app/components/pub/ui/drawer/DrawerDescription.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/drawer/DrawerFooter.vue b/app/components/pub/ui/drawer/DrawerFooter.vue new file mode 100644 index 00000000..1727b9d7 --- /dev/null +++ b/app/components/pub/ui/drawer/DrawerFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/drawer/DrawerHeader.vue b/app/components/pub/ui/drawer/DrawerHeader.vue new file mode 100644 index 00000000..e2f229df --- /dev/null +++ b/app/components/pub/ui/drawer/DrawerHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/drawer/DrawerOverlay.vue b/app/components/pub/ui/drawer/DrawerOverlay.vue new file mode 100644 index 00000000..bd0750d0 --- /dev/null +++ b/app/components/pub/ui/drawer/DrawerOverlay.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/drawer/DrawerTitle.vue b/app/components/pub/ui/drawer/DrawerTitle.vue new file mode 100644 index 00000000..c9e6fc04 --- /dev/null +++ b/app/components/pub/ui/drawer/DrawerTitle.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/drawer/index.ts b/app/components/pub/ui/drawer/index.ts new file mode 100644 index 00000000..d41b7928 --- /dev/null +++ b/app/components/pub/ui/drawer/index.ts @@ -0,0 +1,8 @@ +export { default as Drawer } from './Drawer.vue' +export { default as DrawerContent } from './DrawerContent.vue' +export { default as DrawerDescription } from './DrawerDescription.vue' +export { default as DrawerFooter } from './DrawerFooter.vue' +export { default as DrawerHeader } from './DrawerHeader.vue' +export { default as DrawerOverlay } from './DrawerOverlay.vue' +export { default as DrawerTitle } from './DrawerTitle.vue' +export { DrawerClose, DrawerPortal, DrawerTrigger } from 'vaul-vue' diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenu.vue b/app/components/pub/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 00000000..c9e77fe7 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 00000000..26a77270 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuContent.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 00000000..db152f46 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,39 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuGroup.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 00000000..e9711764 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuItem.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 00000000..cd89c873 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,30 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuLabel.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 00000000..1286ee31 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 00000000..c21b27a8 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuRadioItem.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 00000000..c5bb6f8a --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,42 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuSeparator.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 00000000..44d2da7e --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuShortcut.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 00000000..ea09ac44 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuSub.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 00000000..af6bac43 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuSubContent.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 00000000..00a59383 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 00000000..bda57706 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/DropdownMenuTrigger.vue b/app/components/pub/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 00000000..baf0f7c0 --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/dropdown-menu/index.ts b/app/components/pub/ui/dropdown-menu/index.ts new file mode 100644 index 00000000..6011f35c --- /dev/null +++ b/app/components/pub/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { default as DropdownMenu } from './DropdownMenu.vue' + +export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' +export { default as DropdownMenuContent } from './DropdownMenuContent.vue' +export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' +export { default as DropdownMenuItem } from './DropdownMenuItem.vue' +export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' +export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' +export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' +export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' +export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' +export { default as DropdownMenuSub } from './DropdownMenuSub.vue' +export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' +export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' +export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' +export { DropdownMenuPortal } from 'radix-vue' diff --git a/app/components/pub/ui/form/FormControl.vue b/app/components/pub/ui/form/FormControl.vue new file mode 100644 index 00000000..ca813eab --- /dev/null +++ b/app/components/pub/ui/form/FormControl.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/form/FormDescription.vue b/app/components/pub/ui/form/FormDescription.vue new file mode 100644 index 00000000..60bc8767 --- /dev/null +++ b/app/components/pub/ui/form/FormDescription.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/form/FormItem.vue b/app/components/pub/ui/form/FormItem.vue new file mode 100644 index 00000000..21b662f4 --- /dev/null +++ b/app/components/pub/ui/form/FormItem.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/form/FormLabel.vue b/app/components/pub/ui/form/FormLabel.vue new file mode 100644 index 00000000..e724e335 --- /dev/null +++ b/app/components/pub/ui/form/FormLabel.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/components/pub/ui/form/FormMessage.vue b/app/components/pub/ui/form/FormMessage.vue new file mode 100644 index 00000000..98dd4fc7 --- /dev/null +++ b/app/components/pub/ui/form/FormMessage.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/pub/ui/form/index.ts b/app/components/pub/ui/form/index.ts new file mode 100644 index 00000000..1a3be118 --- /dev/null +++ b/app/components/pub/ui/form/index.ts @@ -0,0 +1,7 @@ +export { default as FormControl } from './FormControl.vue' +export { default as FormDescription } from './FormDescription.vue' +export { default as FormItem } from './FormItem.vue' +export { default as FormLabel } from './FormLabel.vue' +export { default as FormMessage } from './FormMessage.vue' +export { FORM_ITEM_INJECTION_KEY } from './injectionKeys' +export { Form, Field as FormField, FieldArray as FormFieldArray } from 'vee-validate' diff --git a/app/components/pub/ui/form/injectionKeys.ts b/app/components/pub/ui/form/injectionKeys.ts new file mode 100644 index 00000000..5b9ee8f6 --- /dev/null +++ b/app/components/pub/ui/form/injectionKeys.ts @@ -0,0 +1,3 @@ +import type { InjectionKey } from 'vue' + +export const FORM_ITEM_INJECTION_KEY = Symbol('id') as InjectionKey diff --git a/app/components/pub/ui/form/useFormField.ts b/app/components/pub/ui/form/useFormField.ts new file mode 100644 index 00000000..b94b79ae --- /dev/null +++ b/app/components/pub/ui/form/useFormField.ts @@ -0,0 +1,29 @@ +import { FieldContextKey, useFieldError, useIsFieldDirty, useIsFieldTouched, useIsFieldValid } from 'vee-validate' +import { inject } from 'vue' +import { FORM_ITEM_INJECTION_KEY } from './injectionKeys' + +export function useFormField() { + const fieldContext = inject(FieldContextKey) + const fieldItemContext = inject(FORM_ITEM_INJECTION_KEY) + const fieldState = { + valid: useIsFieldValid(), + isDirty: useIsFieldDirty(), + isTouched: useIsFieldTouched(), + error: useFieldError(), + } + + if (!fieldContext) + { throw new Error('useFormField should be used within ') } + + const { name } = fieldContext + const id = fieldItemContext + + return { + id, + name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} diff --git a/app/components/pub/ui/hover-card/HoverCard.vue b/app/components/pub/ui/hover-card/HoverCard.vue new file mode 100644 index 00000000..ef13ea57 --- /dev/null +++ b/app/components/pub/ui/hover-card/HoverCard.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/hover-card/HoverCardContent.vue b/app/components/pub/ui/hover-card/HoverCardContent.vue new file mode 100644 index 00000000..39c214f5 --- /dev/null +++ b/app/components/pub/ui/hover-card/HoverCardContent.vue @@ -0,0 +1,43 @@ + + + diff --git a/app/components/pub/ui/hover-card/HoverCardTrigger.vue b/app/components/pub/ui/hover-card/HoverCardTrigger.vue new file mode 100644 index 00000000..b3907564 --- /dev/null +++ b/app/components/pub/ui/hover-card/HoverCardTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/hover-card/index.ts b/app/components/pub/ui/hover-card/index.ts new file mode 100644 index 00000000..9e4ccc2a --- /dev/null +++ b/app/components/pub/ui/hover-card/index.ts @@ -0,0 +1,3 @@ +export { default as HoverCard } from './HoverCard.vue' +export { default as HoverCardContent } from './HoverCardContent.vue' +export { default as HoverCardTrigger } from './HoverCardTrigger.vue' diff --git a/app/components/pub/ui/input/Input.vue b/app/components/pub/ui/input/Input.vue new file mode 100644 index 00000000..2d06d4d5 --- /dev/null +++ b/app/components/pub/ui/input/Input.vue @@ -0,0 +1,32 @@ + + + diff --git a/app/components/pub/ui/input/index.ts b/app/components/pub/ui/input/index.ts new file mode 100644 index 00000000..a691dd6c --- /dev/null +++ b/app/components/pub/ui/input/index.ts @@ -0,0 +1 @@ +export { default as Input } from './Input.vue' diff --git a/app/components/pub/ui/label/Label.vue b/app/components/pub/ui/label/Label.vue new file mode 100644 index 00000000..b4a607a3 --- /dev/null +++ b/app/components/pub/ui/label/Label.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/pub/ui/label/index.ts b/app/components/pub/ui/label/index.ts new file mode 100644 index 00000000..572c2f01 --- /dev/null +++ b/app/components/pub/ui/label/index.ts @@ -0,0 +1 @@ +export { default as Label } from './Label.vue' diff --git a/app/components/pub/ui/menubar/Menubar.vue b/app/components/pub/ui/menubar/Menubar.vue new file mode 100644 index 00000000..87a242f9 --- /dev/null +++ b/app/components/pub/ui/menubar/Menubar.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarCheckboxItem.vue b/app/components/pub/ui/menubar/MenubarCheckboxItem.vue new file mode 100644 index 00000000..a3495cb6 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarCheckboxItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarContent.vue b/app/components/pub/ui/menubar/MenubarContent.vue new file mode 100644 index 00000000..21feeb6e --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarContent.vue @@ -0,0 +1,45 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarGroup.vue b/app/components/pub/ui/menubar/MenubarGroup.vue new file mode 100644 index 00000000..e2e79d92 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarGroup.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarItem.vue b/app/components/pub/ui/menubar/MenubarItem.vue new file mode 100644 index 00000000..ce7a73e9 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarItem.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarLabel.vue b/app/components/pub/ui/menubar/MenubarLabel.vue new file mode 100644 index 00000000..6f561717 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarLabel.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarMenu.vue b/app/components/pub/ui/menubar/MenubarMenu.vue new file mode 100644 index 00000000..3e0bc452 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarMenu.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarRadioGroup.vue b/app/components/pub/ui/menubar/MenubarRadioGroup.vue new file mode 100644 index 00000000..0bc7a0a6 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarRadioGroup.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarRadioItem.vue b/app/components/pub/ui/menubar/MenubarRadioItem.vue new file mode 100644 index 00000000..50d3a661 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarRadioItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarSeparator.vue b/app/components/pub/ui/menubar/MenubarSeparator.vue new file mode 100644 index 00000000..62f82300 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarSeparator.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarShortcut.vue b/app/components/pub/ui/menubar/MenubarShortcut.vue new file mode 100644 index 00000000..aed37517 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarSub.vue b/app/components/pub/ui/menubar/MenubarSub.vue new file mode 100644 index 00000000..f1c8395d --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarSub.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarSubContent.vue b/app/components/pub/ui/menubar/MenubarSubContent.vue new file mode 100644 index 00000000..fe71b058 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarSubContent.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarSubTrigger.vue b/app/components/pub/ui/menubar/MenubarSubTrigger.vue new file mode 100644 index 00000000..960ee95b --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarSubTrigger.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/menubar/MenubarTrigger.vue b/app/components/pub/ui/menubar/MenubarTrigger.vue new file mode 100644 index 00000000..bde777c1 --- /dev/null +++ b/app/components/pub/ui/menubar/MenubarTrigger.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/menubar/index.ts b/app/components/pub/ui/menubar/index.ts new file mode 100644 index 00000000..600c23ea --- /dev/null +++ b/app/components/pub/ui/menubar/index.ts @@ -0,0 +1,15 @@ +export { default as Menubar } from './Menubar.vue' +export { default as MenubarCheckboxItem } from './MenubarCheckboxItem.vue' +export { default as MenubarContent } from './MenubarContent.vue' +export { default as MenubarGroup } from './MenubarGroup.vue' +export { default as MenubarItem } from './MenubarItem.vue' +export { default as MenubarLabel } from './MenubarLabel.vue' +export { default as MenubarMenu } from './MenubarMenu.vue' +export { default as MenubarRadioGroup } from './MenubarRadioGroup.vue' +export { default as MenubarRadioItem } from './MenubarRadioItem.vue' +export { default as MenubarSeparator } from './MenubarSeparator.vue' +export { default as MenubarShortcut } from './MenubarShortcut.vue' +export { default as MenubarSub } from './MenubarSub.vue' +export { default as MenubarSubContent } from './MenubarSubContent.vue' +export { default as MenubarSubTrigger } from './MenubarSubTrigger.vue' +export { default as MenubarTrigger } from './MenubarTrigger.vue' diff --git a/app/components/pub/ui/navigation-menu/NavigationMenu.vue b/app/components/pub/ui/navigation-menu/NavigationMenu.vue new file mode 100644 index 00000000..bf705594 --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenu.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/NavigationMenuContent.vue b/app/components/pub/ui/navigation-menu/NavigationMenuContent.vue new file mode 100644 index 00000000..dbb23713 --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenuContent.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/NavigationMenuIndicator.vue b/app/components/pub/ui/navigation-menu/NavigationMenuIndicator.vue new file mode 100644 index 00000000..d6ec44dc --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenuIndicator.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/NavigationMenuItem.vue b/app/components/pub/ui/navigation-menu/NavigationMenuItem.vue new file mode 100644 index 00000000..09e26ca2 --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenuItem.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/NavigationMenuLink.vue b/app/components/pub/ui/navigation-menu/NavigationMenuLink.vue new file mode 100644 index 00000000..4179154d --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenuLink.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/NavigationMenuList.vue b/app/components/pub/ui/navigation-menu/NavigationMenuList.vue new file mode 100644 index 00000000..0057b60d --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenuList.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/NavigationMenuTrigger.vue b/app/components/pub/ui/navigation-menu/NavigationMenuTrigger.vue new file mode 100644 index 00000000..01cb04a3 --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenuTrigger.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/NavigationMenuViewport.vue b/app/components/pub/ui/navigation-menu/NavigationMenuViewport.vue new file mode 100644 index 00000000..eb336040 --- /dev/null +++ b/app/components/pub/ui/navigation-menu/NavigationMenuViewport.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/navigation-menu/index.ts b/app/components/pub/ui/navigation-menu/index.ts new file mode 100644 index 00000000..fd0ef971 --- /dev/null +++ b/app/components/pub/ui/navigation-menu/index.ts @@ -0,0 +1,12 @@ +import { cva } from 'class-variance-authority' + +export { default as NavigationMenu } from './NavigationMenu.vue' +export { default as NavigationMenuContent } from './NavigationMenuContent.vue' +export { default as NavigationMenuItem } from './NavigationMenuItem.vue' +export { default as NavigationMenuLink } from './NavigationMenuLink.vue' +export { default as NavigationMenuList } from './NavigationMenuList.vue' +export { default as NavigationMenuTrigger } from './NavigationMenuTrigger.vue' + +export const navigationMenuTriggerStyle = cva( + 'group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50', +) diff --git a/app/components/pub/ui/number-field/NumberField.vue b/app/components/pub/ui/number-field/NumberField.vue new file mode 100644 index 00000000..9d92a05f --- /dev/null +++ b/app/components/pub/ui/number-field/NumberField.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/number-field/NumberFieldContent.vue b/app/components/pub/ui/number-field/NumberFieldContent.vue new file mode 100644 index 00000000..5fe35cd8 --- /dev/null +++ b/app/components/pub/ui/number-field/NumberFieldContent.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/number-field/NumberFieldDecrement.vue b/app/components/pub/ui/number-field/NumberFieldDecrement.vue new file mode 100644 index 00000000..5ec2bf87 --- /dev/null +++ b/app/components/pub/ui/number-field/NumberFieldDecrement.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/number-field/NumberFieldIncrement.vue b/app/components/pub/ui/number-field/NumberFieldIncrement.vue new file mode 100644 index 00000000..49bb5d08 --- /dev/null +++ b/app/components/pub/ui/number-field/NumberFieldIncrement.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/number-field/NumberFieldInput.vue b/app/components/pub/ui/number-field/NumberFieldInput.vue new file mode 100644 index 00000000..e51206ac --- /dev/null +++ b/app/components/pub/ui/number-field/NumberFieldInput.vue @@ -0,0 +1,8 @@ + + + diff --git a/app/components/pub/ui/number-field/index.ts b/app/components/pub/ui/number-field/index.ts new file mode 100644 index 00000000..5489697d --- /dev/null +++ b/app/components/pub/ui/number-field/index.ts @@ -0,0 +1,5 @@ +export { default as NumberField } from './NumberField.vue' +export { default as NumberFieldContent } from './NumberFieldContent.vue' +export { default as NumberFieldDecrement } from './NumberFieldDecrement.vue' +export { default as NumberFieldIncrement } from './NumberFieldIncrement.vue' +export { default as NumberFieldInput } from './NumberFieldInput.vue' diff --git a/app/components/pub/ui/pagination/PaginationEllipsis.vue b/app/components/pub/ui/pagination/PaginationEllipsis.vue new file mode 100644 index 00000000..b2b6123e --- /dev/null +++ b/app/components/pub/ui/pagination/PaginationEllipsis.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/pagination/PaginationFirst.vue b/app/components/pub/ui/pagination/PaginationFirst.vue new file mode 100644 index 00000000..e8dc1609 --- /dev/null +++ b/app/components/pub/ui/pagination/PaginationFirst.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/pagination/PaginationLast.vue b/app/components/pub/ui/pagination/PaginationLast.vue new file mode 100644 index 00000000..30685eef --- /dev/null +++ b/app/components/pub/ui/pagination/PaginationLast.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/pagination/PaginationNext.vue b/app/components/pub/ui/pagination/PaginationNext.vue new file mode 100644 index 00000000..3870b4dc --- /dev/null +++ b/app/components/pub/ui/pagination/PaginationNext.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/pagination/PaginationPrev.vue b/app/components/pub/ui/pagination/PaginationPrev.vue new file mode 100644 index 00000000..4f8d9559 --- /dev/null +++ b/app/components/pub/ui/pagination/PaginationPrev.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/components/pub/ui/pagination/index.ts b/app/components/pub/ui/pagination/index.ts new file mode 100644 index 00000000..3a0b1817 --- /dev/null +++ b/app/components/pub/ui/pagination/index.ts @@ -0,0 +1,10 @@ +export { default as PaginationEllipsis } from './PaginationEllipsis.vue' +export { default as PaginationFirst } from './PaginationFirst.vue' +export { default as PaginationLast } from './PaginationLast.vue' +export { default as PaginationNext } from './PaginationNext.vue' +export { default as PaginationPrev } from './PaginationPrev.vue' +export { + PaginationRoot as Pagination, + PaginationList, + PaginationListItem, +} from 'radix-vue' diff --git a/app/components/pub/ui/pin-input/PinInput.vue b/app/components/pub/ui/pin-input/PinInput.vue new file mode 100644 index 00000000..ae30a217 --- /dev/null +++ b/app/components/pub/ui/pin-input/PinInput.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/pub/ui/pin-input/PinInputGroup.vue b/app/components/pub/ui/pin-input/PinInputGroup.vue new file mode 100644 index 00000000..0fc792f0 --- /dev/null +++ b/app/components/pub/ui/pin-input/PinInputGroup.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/pin-input/PinInputInput.vue b/app/components/pub/ui/pin-input/PinInputInput.vue new file mode 100644 index 00000000..36de92be --- /dev/null +++ b/app/components/pub/ui/pin-input/PinInputInput.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/pin-input/PinInputSeparator.vue b/app/components/pub/ui/pin-input/PinInputSeparator.vue new file mode 100644 index 00000000..2ffeb810 --- /dev/null +++ b/app/components/pub/ui/pin-input/PinInputSeparator.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/pin-input/index.ts b/app/components/pub/ui/pin-input/index.ts new file mode 100644 index 00000000..e645e414 --- /dev/null +++ b/app/components/pub/ui/pin-input/index.ts @@ -0,0 +1,4 @@ +export { default as PinInput } from './PinInput.vue' +export { default as PinInputGroup } from './PinInputGroup.vue' +export { default as PinInputInput } from './PinInputInput.vue' +export { default as PinInputSeparator } from './PinInputSeparator.vue' diff --git a/app/components/pub/ui/popover/Popover.vue b/app/components/pub/ui/popover/Popover.vue new file mode 100644 index 00000000..da5f7096 --- /dev/null +++ b/app/components/pub/ui/popover/Popover.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/popover/PopoverContent.vue b/app/components/pub/ui/popover/PopoverContent.vue new file mode 100644 index 00000000..96bae67b --- /dev/null +++ b/app/components/pub/ui/popover/PopoverContent.vue @@ -0,0 +1,49 @@ + + + diff --git a/app/components/pub/ui/popover/PopoverTrigger.vue b/app/components/pub/ui/popover/PopoverTrigger.vue new file mode 100644 index 00000000..6c944497 --- /dev/null +++ b/app/components/pub/ui/popover/PopoverTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/popover/index.ts b/app/components/pub/ui/popover/index.ts new file mode 100644 index 00000000..c621f9b1 --- /dev/null +++ b/app/components/pub/ui/popover/index.ts @@ -0,0 +1,3 @@ +export { default as Popover } from './Popover.vue' +export { default as PopoverContent } from './PopoverContent.vue' +export { default as PopoverTrigger } from './PopoverTrigger.vue' diff --git a/app/components/pub/ui/progress/Progress.vue b/app/components/pub/ui/progress/Progress.vue new file mode 100644 index 00000000..d7fca285 --- /dev/null +++ b/app/components/pub/ui/progress/Progress.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/components/pub/ui/progress/index.ts b/app/components/pub/ui/progress/index.ts new file mode 100644 index 00000000..eace9893 --- /dev/null +++ b/app/components/pub/ui/progress/index.ts @@ -0,0 +1 @@ +export { default as Progress } from './Progress.vue' diff --git a/app/components/pub/ui/radio-group/RadioGroup.vue b/app/components/pub/ui/radio-group/RadioGroup.vue new file mode 100644 index 00000000..7815ca71 --- /dev/null +++ b/app/components/pub/ui/radio-group/RadioGroup.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/radio-group/RadioGroupItem.vue b/app/components/pub/ui/radio-group/RadioGroupItem.vue new file mode 100644 index 00000000..0220f14f --- /dev/null +++ b/app/components/pub/ui/radio-group/RadioGroupItem.vue @@ -0,0 +1,38 @@ + + + diff --git a/app/components/pub/ui/radio-group/index.ts b/app/components/pub/ui/radio-group/index.ts new file mode 100644 index 00000000..fa1da9c2 --- /dev/null +++ b/app/components/pub/ui/radio-group/index.ts @@ -0,0 +1,2 @@ +export { default as RadioGroup } from './RadioGroup.vue' +export { default as RadioGroupItem } from './RadioGroupItem.vue' diff --git a/app/components/pub/ui/range-calendar/RangeCalendar.vue b/app/components/pub/ui/range-calendar/RangeCalendar.vue new file mode 100644 index 00000000..8abdb82e --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendar.vue @@ -0,0 +1,63 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarCell.vue b/app/components/pub/ui/range-calendar/RangeCalendarCell.vue new file mode 100644 index 00000000..40876a17 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarCell.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarCellTrigger.vue b/app/components/pub/ui/range-calendar/RangeCalendarCellTrigger.vue new file mode 100644 index 00000000..a437f0c2 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarCellTrigger.vue @@ -0,0 +1,43 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarGrid.vue b/app/components/pub/ui/range-calendar/RangeCalendarGrid.vue new file mode 100644 index 00000000..4cdbd7e6 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarGrid.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarGridBody.vue b/app/components/pub/ui/range-calendar/RangeCalendarGridBody.vue new file mode 100644 index 00000000..b841dd99 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarGridBody.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarGridHead.vue b/app/components/pub/ui/range-calendar/RangeCalendarGridHead.vue new file mode 100644 index 00000000..6e2bcec7 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarGridHead.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarGridRow.vue b/app/components/pub/ui/range-calendar/RangeCalendarGridRow.vue new file mode 100644 index 00000000..eb22ef02 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarGridRow.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarHeadCell.vue b/app/components/pub/ui/range-calendar/RangeCalendarHeadCell.vue new file mode 100644 index 00000000..202286f8 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarHeadCell.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarHeader.vue b/app/components/pub/ui/range-calendar/RangeCalendarHeader.vue new file mode 100644 index 00000000..06b95b6c --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarHeader.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarHeading.vue b/app/components/pub/ui/range-calendar/RangeCalendarHeading.vue new file mode 100644 index 00000000..d51f904c --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarHeading.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarNextButton.vue b/app/components/pub/ui/range-calendar/RangeCalendarNextButton.vue new file mode 100644 index 00000000..e0174861 --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarNextButton.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/range-calendar/RangeCalendarPrevButton.vue b/app/components/pub/ui/range-calendar/RangeCalendarPrevButton.vue new file mode 100644 index 00000000..ee4b21ee --- /dev/null +++ b/app/components/pub/ui/range-calendar/RangeCalendarPrevButton.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/range-calendar/index.ts b/app/components/pub/ui/range-calendar/index.ts new file mode 100644 index 00000000..7ba1637e --- /dev/null +++ b/app/components/pub/ui/range-calendar/index.ts @@ -0,0 +1,12 @@ +export { default as RangeCalendar } from './RangeCalendar.vue' +export { default as RangeCalendarCell } from './RangeCalendarCell.vue' +export { default as RangeCalendarCellTrigger } from './RangeCalendarCellTrigger.vue' +export { default as RangeCalendarGrid } from './RangeCalendarGrid.vue' +export { default as RangeCalendarGridBody } from './RangeCalendarGridBody.vue' +export { default as RangeCalendarGridHead } from './RangeCalendarGridHead.vue' +export { default as RangeCalendarGridRow } from './RangeCalendarGridRow.vue' +export { default as RangeCalendarHeadCell } from './RangeCalendarHeadCell.vue' +export { default as RangeCalendarHeader } from './RangeCalendarHeader.vue' +export { default as RangeCalendarHeading } from './RangeCalendarHeading.vue' +export { default as RangeCalendarNextButton } from './RangeCalendarNextButton.vue' +export { default as RangeCalendarPrevButton } from './RangeCalendarPrevButton.vue' diff --git a/app/components/pub/ui/resizable/ResizableHandle.vue b/app/components/pub/ui/resizable/ResizableHandle.vue new file mode 100644 index 00000000..c33213d6 --- /dev/null +++ b/app/components/pub/ui/resizable/ResizableHandle.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/components/pub/ui/resizable/ResizablePanelGroup.vue b/app/components/pub/ui/resizable/ResizablePanelGroup.vue new file mode 100644 index 00000000..8a515328 --- /dev/null +++ b/app/components/pub/ui/resizable/ResizablePanelGroup.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/resizable/index.ts b/app/components/pub/ui/resizable/index.ts new file mode 100644 index 00000000..605e8106 --- /dev/null +++ b/app/components/pub/ui/resizable/index.ts @@ -0,0 +1,3 @@ +export { default as ResizableHandle } from './ResizableHandle.vue' +export { default as ResizablePanelGroup } from './ResizablePanelGroup.vue' +export { SplitterPanel as ResizablePanel } from 'radix-vue' diff --git a/app/components/pub/ui/scroll-area/ScrollArea.vue b/app/components/pub/ui/scroll-area/ScrollArea.vue new file mode 100644 index 00000000..77359ce2 --- /dev/null +++ b/app/components/pub/ui/scroll-area/ScrollArea.vue @@ -0,0 +1,32 @@ + + + diff --git a/app/components/pub/ui/scroll-area/ScrollBar.vue b/app/components/pub/ui/scroll-area/ScrollBar.vue new file mode 100644 index 00000000..0eb4ac24 --- /dev/null +++ b/app/components/pub/ui/scroll-area/ScrollBar.vue @@ -0,0 +1,32 @@ + + + diff --git a/app/components/pub/ui/scroll-area/index.ts b/app/components/pub/ui/scroll-area/index.ts new file mode 100644 index 00000000..2bd4fae5 --- /dev/null +++ b/app/components/pub/ui/scroll-area/index.ts @@ -0,0 +1,2 @@ +export { default as ScrollArea } from './ScrollArea.vue' +export { default as ScrollBar } from './ScrollBar.vue' diff --git a/app/components/pub/ui/select/Select.vue b/app/components/pub/ui/select/Select.vue new file mode 100644 index 00000000..37720694 --- /dev/null +++ b/app/components/pub/ui/select/Select.vue @@ -0,0 +1,57 @@ + + + diff --git a/app/components/pub/ui/select/SelectContent.vue b/app/components/pub/ui/select/SelectContent.vue new file mode 100644 index 00000000..88c9557b --- /dev/null +++ b/app/components/pub/ui/select/SelectContent.vue @@ -0,0 +1,55 @@ + + + diff --git a/app/components/pub/ui/select/SelectGroup.vue b/app/components/pub/ui/select/SelectGroup.vue new file mode 100644 index 00000000..1043492d --- /dev/null +++ b/app/components/pub/ui/select/SelectGroup.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/select/SelectItem.vue b/app/components/pub/ui/select/SelectItem.vue new file mode 100644 index 00000000..aa06498a --- /dev/null +++ b/app/components/pub/ui/select/SelectItem.vue @@ -0,0 +1,45 @@ + + + diff --git a/app/components/pub/ui/select/SelectItemText.vue b/app/components/pub/ui/select/SelectItemText.vue new file mode 100644 index 00000000..a8db38b4 --- /dev/null +++ b/app/components/pub/ui/select/SelectItemText.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/select/SelectLabel.vue b/app/components/pub/ui/select/SelectLabel.vue new file mode 100644 index 00000000..32d46c1c --- /dev/null +++ b/app/components/pub/ui/select/SelectLabel.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/select/SelectScrollDownButton.vue b/app/components/pub/ui/select/SelectScrollDownButton.vue new file mode 100644 index 00000000..7a8af19d --- /dev/null +++ b/app/components/pub/ui/select/SelectScrollDownButton.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/pub/ui/select/SelectScrollUpButton.vue b/app/components/pub/ui/select/SelectScrollUpButton.vue new file mode 100644 index 00000000..c528294d --- /dev/null +++ b/app/components/pub/ui/select/SelectScrollUpButton.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/pub/ui/select/SelectSeparator.vue b/app/components/pub/ui/select/SelectSeparator.vue new file mode 100644 index 00000000..daa605c2 --- /dev/null +++ b/app/components/pub/ui/select/SelectSeparator.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/select/SelectTrigger.vue b/app/components/pub/ui/select/SelectTrigger.vue new file mode 100644 index 00000000..eb4c6b0f --- /dev/null +++ b/app/components/pub/ui/select/SelectTrigger.vue @@ -0,0 +1,34 @@ + + + diff --git a/app/components/pub/ui/select/SelectValue.vue b/app/components/pub/ui/select/SelectValue.vue new file mode 100644 index 00000000..6f37eb55 --- /dev/null +++ b/app/components/pub/ui/select/SelectValue.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/select/index.ts b/app/components/pub/ui/select/index.ts new file mode 100644 index 00000000..31b92946 --- /dev/null +++ b/app/components/pub/ui/select/index.ts @@ -0,0 +1,11 @@ +export { default as Select } from './Select.vue' +export { default as SelectContent } from './SelectContent.vue' +export { default as SelectGroup } from './SelectGroup.vue' +export { default as SelectItem } from './SelectItem.vue' +export { default as SelectItemText } from './SelectItemText.vue' +export { default as SelectLabel } from './SelectLabel.vue' +export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue' +export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue' +export { default as SelectSeparator } from './SelectSeparator.vue' +export { default as SelectTrigger } from './SelectTrigger.vue' +export { default as SelectValue } from './SelectValue.vue' diff --git a/app/components/pub/ui/separator/Separator.vue b/app/components/pub/ui/separator/Separator.vue new file mode 100644 index 00000000..cfd7ce6a --- /dev/null +++ b/app/components/pub/ui/separator/Separator.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/pub/ui/separator/index.ts b/app/components/pub/ui/separator/index.ts new file mode 100644 index 00000000..2287bcb9 --- /dev/null +++ b/app/components/pub/ui/separator/index.ts @@ -0,0 +1 @@ +export { default as Separator } from './Separator.vue' diff --git a/app/components/pub/ui/sheet/Sheet.vue b/app/components/pub/ui/sheet/Sheet.vue new file mode 100644 index 00000000..5f6a5632 --- /dev/null +++ b/app/components/pub/ui/sheet/Sheet.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/sheet/SheetClose.vue b/app/components/pub/ui/sheet/SheetClose.vue new file mode 100644 index 00000000..1fa61805 --- /dev/null +++ b/app/components/pub/ui/sheet/SheetClose.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/sheet/SheetContent.vue b/app/components/pub/ui/sheet/SheetContent.vue new file mode 100644 index 00000000..0b42c296 --- /dev/null +++ b/app/components/pub/ui/sheet/SheetContent.vue @@ -0,0 +1,64 @@ + + + diff --git a/app/components/pub/ui/sheet/SheetDescription.vue b/app/components/pub/ui/sheet/SheetDescription.vue new file mode 100644 index 00000000..144ae2f9 --- /dev/null +++ b/app/components/pub/ui/sheet/SheetDescription.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/sheet/SheetFooter.vue b/app/components/pub/ui/sheet/SheetFooter.vue new file mode 100644 index 00000000..4627374d --- /dev/null +++ b/app/components/pub/ui/sheet/SheetFooter.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pub/ui/sheet/SheetHeader.vue b/app/components/pub/ui/sheet/SheetHeader.vue new file mode 100644 index 00000000..65f32731 --- /dev/null +++ b/app/components/pub/ui/sheet/SheetHeader.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/pub/ui/sheet/SheetTitle.vue b/app/components/pub/ui/sheet/SheetTitle.vue new file mode 100644 index 00000000..192735d0 --- /dev/null +++ b/app/components/pub/ui/sheet/SheetTitle.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/sheet/SheetTrigger.vue b/app/components/pub/ui/sheet/SheetTrigger.vue new file mode 100644 index 00000000..b966b29d --- /dev/null +++ b/app/components/pub/ui/sheet/SheetTrigger.vue @@ -0,0 +1,12 @@ + + + diff --git a/app/components/pub/ui/sheet/index.ts b/app/components/pub/ui/sheet/index.ts new file mode 100644 index 00000000..603fa39d --- /dev/null +++ b/app/components/pub/ui/sheet/index.ts @@ -0,0 +1,32 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Sheet } from './Sheet.vue' +export { default as SheetClose } from './SheetClose.vue' +export { default as SheetContent } from './SheetContent.vue' +export { default as SheetDescription } from './SheetDescription.vue' +export { default as SheetFooter } from './SheetFooter.vue' +export { default as SheetHeader } from './SheetHeader.vue' +export { default as SheetTitle } from './SheetTitle.vue' +export { default as SheetTrigger } from './SheetTrigger.vue' + +export const sheetVariants = cva( + 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500', + { + variants: { + side: { + top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top', + bottom: + 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom', + left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm', + right: + 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm', + }, + }, + defaultVariants: { + side: 'right', + }, + }, +) + +export type SheetVariants = VariantProps diff --git a/app/components/pub/ui/sidebar/Sidebar.vue b/app/components/pub/ui/sidebar/Sidebar.vue new file mode 100644 index 00000000..f25e3b9c --- /dev/null +++ b/app/components/pub/ui/sidebar/Sidebar.vue @@ -0,0 +1,100 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarContent.vue b/app/components/pub/ui/sidebar/SidebarContent.vue new file mode 100644 index 00000000..c695d064 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarContent.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarFooter.vue b/app/components/pub/ui/sidebar/SidebarFooter.vue new file mode 100644 index 00000000..564b1f4b --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarFooter.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarGroup.vue b/app/components/pub/ui/sidebar/SidebarGroup.vue new file mode 100644 index 00000000..1b5bc5dd --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarGroup.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarGroupAction.vue b/app/components/pub/ui/sidebar/SidebarGroupAction.vue new file mode 100644 index 00000000..f6dea60d --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarGroupAction.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarGroupContent.vue b/app/components/pub/ui/sidebar/SidebarGroupContent.vue new file mode 100644 index 00000000..684873b5 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarGroupContent.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarGroupLabel.vue b/app/components/pub/ui/sidebar/SidebarGroupLabel.vue new file mode 100644 index 00000000..162e04e0 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarGroupLabel.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarHeader.vue b/app/components/pub/ui/sidebar/SidebarHeader.vue new file mode 100644 index 00000000..fa5e353e --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarHeader.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarInput.vue b/app/components/pub/ui/sidebar/SidebarInput.vue new file mode 100644 index 00000000..72b27475 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarInput.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarInset.vue b/app/components/pub/ui/sidebar/SidebarInset.vue new file mode 100644 index 00000000..92d35958 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarInset.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenu.vue b/app/components/pub/ui/sidebar/SidebarMenu.vue new file mode 100644 index 00000000..ef15a05a --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenu.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuAction.vue b/app/components/pub/ui/sidebar/SidebarMenuAction.vue new file mode 100644 index 00000000..1bc89b7b --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuAction.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuBadge.vue b/app/components/pub/ui/sidebar/SidebarMenuBadge.vue new file mode 100644 index 00000000..80862e1a --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuBadge.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuButton.vue b/app/components/pub/ui/sidebar/SidebarMenuButton.vue new file mode 100644 index 00000000..bdb5ba3d --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuButton.vue @@ -0,0 +1,54 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuButtonChild.vue b/app/components/pub/ui/sidebar/SidebarMenuButtonChild.vue new file mode 100644 index 00000000..281261bd --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuButtonChild.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuItem.vue b/app/components/pub/ui/sidebar/SidebarMenuItem.vue new file mode 100644 index 00000000..78886c8c --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuItem.vue @@ -0,0 +1,17 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuSkeleton.vue b/app/components/pub/ui/sidebar/SidebarMenuSkeleton.vue new file mode 100644 index 00000000..3c31766d --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuSkeleton.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuSub.vue b/app/components/pub/ui/sidebar/SidebarMenuSub.vue new file mode 100644 index 00000000..42508d4d --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuSub.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuSubButton.vue b/app/components/pub/ui/sidebar/SidebarMenuSubButton.vue new file mode 100644 index 00000000..896d3e31 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuSubButton.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarMenuSubItem.vue b/app/components/pub/ui/sidebar/SidebarMenuSubItem.vue new file mode 100644 index 00000000..b04030b0 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarMenuSubItem.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarProvider.vue b/app/components/pub/ui/sidebar/SidebarProvider.vue new file mode 100644 index 00000000..0ef2a5b0 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarProvider.vue @@ -0,0 +1,102 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarRail.vue b/app/components/pub/ui/sidebar/SidebarRail.vue new file mode 100644 index 00000000..490e2477 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarRail.vue @@ -0,0 +1,33 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarSeparator.vue b/app/components/pub/ui/sidebar/SidebarSeparator.vue new file mode 100644 index 00000000..5f48fc20 --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarSeparator.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/sidebar/SidebarTrigger.vue b/app/components/pub/ui/sidebar/SidebarTrigger.vue new file mode 100644 index 00000000..830fa83d --- /dev/null +++ b/app/components/pub/ui/sidebar/SidebarTrigger.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/sidebar/index.ts b/app/components/pub/ui/sidebar/index.ts new file mode 100644 index 00000000..a6de2196 --- /dev/null +++ b/app/components/pub/ui/sidebar/index.ts @@ -0,0 +1,52 @@ +import type { VariantProps } from 'class-variance-authority' +import { cva } from 'class-variance-authority' + +export { default as Sidebar } from './Sidebar.vue' +export { default as SidebarContent } from './SidebarContent.vue' +export { default as SidebarFooter } from './SidebarFooter.vue' +export { default as SidebarGroup } from './SidebarGroup.vue' +export { default as SidebarGroupAction } from './SidebarGroupAction.vue' +export { default as SidebarGroupContent } from './SidebarGroupContent.vue' +export { default as SidebarGroupLabel } from './SidebarGroupLabel.vue' +export { default as SidebarHeader } from './SidebarHeader.vue' +export { default as SidebarInput } from './SidebarInput.vue' +export { default as SidebarInset } from './SidebarInset.vue' +export { default as SidebarMenu } from './SidebarMenu.vue' +export { default as SidebarMenuAction } from './SidebarMenuAction.vue' +export { default as SidebarMenuBadge } from './SidebarMenuBadge.vue' +export { default as SidebarMenuButton } from './SidebarMenuButton.vue' +export { default as SidebarMenuItem } from './SidebarMenuItem.vue' +export { default as SidebarMenuSkeleton } from './SidebarMenuSkeleton.vue' +export { default as SidebarMenuSub } from './SidebarMenuSub.vue' +export { default as SidebarMenuSubButton } from './SidebarMenuSubButton.vue' +export { default as SidebarMenuSubItem } from './SidebarMenuSubItem.vue' +export { default as SidebarProvider } from './SidebarProvider.vue' +export { default as SidebarRail } from './SidebarRail.vue' +export { default as SidebarSeparator } from './SidebarSeparator.vue' +export { default as SidebarTrigger } from './SidebarTrigger.vue' + +export { useSidebar } from './utils' + +export const sidebarMenuButtonVariants = cva( + 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-[current=page]:bg-sidebar-accent aria-[current=page]:font-medium aria-[current=page]:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0', + { + variants: { + variant: { + default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground', + outline: + 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]', + }, + size: { + default: 'h-8 text-sm', + sm: 'h-7 text-xs', + lg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export type SidebarMenuButtonVariants = VariantProps diff --git a/app/components/pub/ui/sidebar/utils.ts b/app/components/pub/ui/sidebar/utils.ts new file mode 100644 index 00000000..3ded66c4 --- /dev/null +++ b/app/components/pub/ui/sidebar/utils.ts @@ -0,0 +1,19 @@ +import type { ComputedRef, Ref } from 'vue' +import { createContext } from 'radix-vue' + +export const SIDEBAR_COOKIE_NAME = 'sidebar:state' +export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 +export const SIDEBAR_WIDTH = '16rem' +export const SIDEBAR_WIDTH_MOBILE = '18rem' +export const SIDEBAR_WIDTH_ICON = '3rem' +export const SIDEBAR_KEYBOARD_SHORTCUT = 'b' + +export const [useSidebar, provideSidebarContext] = createContext<{ + state: ComputedRef<'expanded' | 'collapsed'> + open: Ref + setOpen: (value: boolean) => void + isMobile: Ref + openMobile: Ref + setOpenMobile: (value: boolean) => void + toggleSidebar: () => void +}>('Sidebar') diff --git a/app/components/pub/ui/skeleton/Skeleton.vue b/app/components/pub/ui/skeleton/Skeleton.vue new file mode 100644 index 00000000..f0a940b6 --- /dev/null +++ b/app/components/pub/ui/skeleton/Skeleton.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/skeleton/index.ts b/app/components/pub/ui/skeleton/index.ts new file mode 100644 index 00000000..be21fad3 --- /dev/null +++ b/app/components/pub/ui/skeleton/index.ts @@ -0,0 +1 @@ +export { default as Skeleton } from './Skeleton.vue' diff --git a/app/components/pub/ui/slider/Slider.vue b/app/components/pub/ui/slider/Slider.vue new file mode 100644 index 00000000..b37d32ad --- /dev/null +++ b/app/components/pub/ui/slider/Slider.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/components/pub/ui/slider/index.ts b/app/components/pub/ui/slider/index.ts new file mode 100644 index 00000000..1c945deb --- /dev/null +++ b/app/components/pub/ui/slider/index.ts @@ -0,0 +1 @@ +export { default as Slider } from './Slider.vue' diff --git a/app/components/pub/ui/sonner/Sonner.vue b/app/components/pub/ui/sonner/Sonner.vue new file mode 100644 index 00000000..bd67f874 --- /dev/null +++ b/app/components/pub/ui/sonner/Sonner.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/pub/ui/sonner/index.ts b/app/components/pub/ui/sonner/index.ts new file mode 100644 index 00000000..8d3d4062 --- /dev/null +++ b/app/components/pub/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Sonner } from './Sonner.vue' diff --git a/app/components/pub/ui/stepper/Stepper.vue b/app/components/pub/ui/stepper/Stepper.vue new file mode 100644 index 00000000..4f65ce3d --- /dev/null +++ b/app/components/pub/ui/stepper/Stepper.vue @@ -0,0 +1,32 @@ + + + diff --git a/app/components/pub/ui/stepper/StepperDescription.vue b/app/components/pub/ui/stepper/StepperDescription.vue new file mode 100644 index 00000000..0074eeab --- /dev/null +++ b/app/components/pub/ui/stepper/StepperDescription.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/stepper/StepperIndicator.vue b/app/components/pub/ui/stepper/StepperIndicator.vue new file mode 100644 index 00000000..a7e7a7e6 --- /dev/null +++ b/app/components/pub/ui/stepper/StepperIndicator.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/components/pub/ui/stepper/StepperItem.vue b/app/components/pub/ui/stepper/StepperItem.vue new file mode 100644 index 00000000..5d87d18d --- /dev/null +++ b/app/components/pub/ui/stepper/StepperItem.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/components/pub/ui/stepper/StepperSeparator.vue b/app/components/pub/ui/stepper/StepperSeparator.vue new file mode 100644 index 00000000..16598953 --- /dev/null +++ b/app/components/pub/ui/stepper/StepperSeparator.vue @@ -0,0 +1,32 @@ + + + diff --git a/app/components/pub/ui/stepper/StepperTitle.vue b/app/components/pub/ui/stepper/StepperTitle.vue new file mode 100644 index 00000000..bc9d4619 --- /dev/null +++ b/app/components/pub/ui/stepper/StepperTitle.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/stepper/StepperTrigger.vue b/app/components/pub/ui/stepper/StepperTrigger.vue new file mode 100644 index 00000000..83ebebb0 --- /dev/null +++ b/app/components/pub/ui/stepper/StepperTrigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/stepper/index.ts b/app/components/pub/ui/stepper/index.ts new file mode 100644 index 00000000..a4065a57 --- /dev/null +++ b/app/components/pub/ui/stepper/index.ts @@ -0,0 +1,7 @@ +export { default as Stepper } from './Stepper.vue' +export { default as StepperDescription } from './StepperDescription.vue' +export { default as StepperIndicator } from './StepperIndicator.vue' +export { default as StepperItem } from './StepperItem.vue' +export { default as StepperSeparator } from './StepperSeparator.vue' +export { default as StepperTitle } from './StepperTitle.vue' +export { default as StepperTrigger } from './StepperTrigger.vue' diff --git a/app/components/pub/ui/switch/Switch.vue b/app/components/pub/ui/switch/Switch.vue new file mode 100644 index 00000000..8fe27300 --- /dev/null +++ b/app/components/pub/ui/switch/Switch.vue @@ -0,0 +1,38 @@ + + + diff --git a/app/components/pub/ui/switch/index.ts b/app/components/pub/ui/switch/index.ts new file mode 100644 index 00000000..87b4b17d --- /dev/null +++ b/app/components/pub/ui/switch/index.ts @@ -0,0 +1 @@ +export { default as Switch } from './Switch.vue' diff --git a/app/components/pub/ui/table/Table.vue b/app/components/pub/ui/table/Table.vue new file mode 100644 index 00000000..e7c79d4c --- /dev/null +++ b/app/components/pub/ui/table/Table.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/components/pub/ui/table/TableBody.vue b/app/components/pub/ui/table/TableBody.vue new file mode 100644 index 00000000..d36ffc25 --- /dev/null +++ b/app/components/pub/ui/table/TableBody.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/table/TableCaption.vue b/app/components/pub/ui/table/TableCaption.vue new file mode 100644 index 00000000..f2a6c194 --- /dev/null +++ b/app/components/pub/ui/table/TableCaption.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/table/TableCell.vue b/app/components/pub/ui/table/TableCell.vue new file mode 100644 index 00000000..d292236f --- /dev/null +++ b/app/components/pub/ui/table/TableCell.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/table/TableEmpty.vue b/app/components/pub/ui/table/TableEmpty.vue new file mode 100644 index 00000000..ff2f887e --- /dev/null +++ b/app/components/pub/ui/table/TableEmpty.vue @@ -0,0 +1,39 @@ + + + diff --git a/app/components/pub/ui/table/TableFooter.vue b/app/components/pub/ui/table/TableFooter.vue new file mode 100644 index 00000000..e9f46f9c --- /dev/null +++ b/app/components/pub/ui/table/TableFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/table/TableHead.vue b/app/components/pub/ui/table/TableHead.vue new file mode 100644 index 00000000..624955d6 --- /dev/null +++ b/app/components/pub/ui/table/TableHead.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/table/TableHeader.vue b/app/components/pub/ui/table/TableHeader.vue new file mode 100644 index 00000000..879d2a83 --- /dev/null +++ b/app/components/pub/ui/table/TableHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/table/TableRow.vue b/app/components/pub/ui/table/TableRow.vue new file mode 100644 index 00000000..80b1e6a7 --- /dev/null +++ b/app/components/pub/ui/table/TableRow.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/components/pub/ui/table/index.ts b/app/components/pub/ui/table/index.ts new file mode 100644 index 00000000..5bfa3862 --- /dev/null +++ b/app/components/pub/ui/table/index.ts @@ -0,0 +1,8 @@ +export { default as Table } from './Table.vue' +export { default as TableBody } from './TableBody.vue' +export { default as TableCaption } from './TableCaption.vue' +export { default as TableCell } from './TableCell.vue' +export { default as TableEmpty } from './TableEmpty.vue' +export { default as TableHead } from './TableHead.vue' +export { default as TableHeader } from './TableHeader.vue' +export { default as TableRow } from './TableRow.vue' diff --git a/app/components/pub/ui/table/separator/Separator.vue b/app/components/pub/ui/table/separator/Separator.vue new file mode 100644 index 00000000..e1648859 --- /dev/null +++ b/app/components/pub/ui/table/separator/Separator.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/pub/ui/table/separator/index.ts b/app/components/pub/ui/table/separator/index.ts new file mode 100644 index 00000000..2287bcb9 --- /dev/null +++ b/app/components/pub/ui/table/separator/index.ts @@ -0,0 +1 @@ +export { default as Separator } from './Separator.vue' diff --git a/app/components/pub/ui/tabs/Tabs.vue b/app/components/pub/ui/tabs/Tabs.vue new file mode 100644 index 00000000..8feda3f7 --- /dev/null +++ b/app/components/pub/ui/tabs/Tabs.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/components/pub/ui/tabs/TabsContent.vue b/app/components/pub/ui/tabs/TabsContent.vue new file mode 100644 index 00000000..0f5b6735 --- /dev/null +++ b/app/components/pub/ui/tabs/TabsContent.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/tabs/TabsList.vue b/app/components/pub/ui/tabs/TabsList.vue new file mode 100644 index 00000000..6f9954b2 --- /dev/null +++ b/app/components/pub/ui/tabs/TabsList.vue @@ -0,0 +1,27 @@ + + + diff --git a/app/components/pub/ui/tabs/TabsTrigger.vue b/app/components/pub/ui/tabs/TabsTrigger.vue new file mode 100644 index 00000000..784f5b36 --- /dev/null +++ b/app/components/pub/ui/tabs/TabsTrigger.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/components/pub/ui/tabs/index.ts b/app/components/pub/ui/tabs/index.ts new file mode 100644 index 00000000..a5e58dc0 --- /dev/null +++ b/app/components/pub/ui/tabs/index.ts @@ -0,0 +1,4 @@ +export { default as Tabs } from './Tabs.vue' +export { default as TabsContent } from './TabsContent.vue' +export { default as TabsList } from './TabsList.vue' +export { default as TabsTrigger } from './TabsTrigger.vue' diff --git a/app/components/pub/ui/tags-input/TagsInput.vue b/app/components/pub/ui/tags-input/TagsInput.vue new file mode 100644 index 00000000..a245c294 --- /dev/null +++ b/app/components/pub/ui/tags-input/TagsInput.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/tags-input/TagsInputInput.vue b/app/components/pub/ui/tags-input/TagsInputInput.vue new file mode 100644 index 00000000..cc76c8b8 --- /dev/null +++ b/app/components/pub/ui/tags-input/TagsInputInput.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/tags-input/TagsInputItem.vue b/app/components/pub/ui/tags-input/TagsInputItem.vue new file mode 100644 index 00000000..d13e94a4 --- /dev/null +++ b/app/components/pub/ui/tags-input/TagsInputItem.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pub/ui/tags-input/TagsInputItemDelete.vue b/app/components/pub/ui/tags-input/TagsInputItemDelete.vue new file mode 100644 index 00000000..123db53b --- /dev/null +++ b/app/components/pub/ui/tags-input/TagsInputItemDelete.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/pub/ui/tags-input/TagsInputItemText.vue b/app/components/pub/ui/tags-input/TagsInputItemText.vue new file mode 100644 index 00000000..a51c582d --- /dev/null +++ b/app/components/pub/ui/tags-input/TagsInputItemText.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/components/pub/ui/tags-input/index.ts b/app/components/pub/ui/tags-input/index.ts new file mode 100644 index 00000000..31305f34 --- /dev/null +++ b/app/components/pub/ui/tags-input/index.ts @@ -0,0 +1,5 @@ +export { default as TagsInput } from './TagsInput.vue' +export { default as TagsInputInput } from './TagsInputInput.vue' +export { default as TagsInputItem } from './TagsInputItem.vue' +export { default as TagsInputItemDelete } from './TagsInputItemDelete.vue' +export { default as TagsInputItemText } from './TagsInputItemText.vue' diff --git a/app/components/pub/ui/textarea/Textarea.vue b/app/components/pub/ui/textarea/Textarea.vue new file mode 100644 index 00000000..a6b182a3 --- /dev/null +++ b/app/components/pub/ui/textarea/Textarea.vue @@ -0,0 +1,24 @@ + + +