first commit

This commit is contained in:
Yusron alamsyah
2026-03-13 10:45:28 +07:00
commit 6bb6a1d430
568 changed files with 51753 additions and 0 deletions
+144
View File
@@ -0,0 +1,144 @@
import { computed } from 'vue';
import * as themeColors from '@/theme/LightTheme';
import * as DarkThemeColors from '@/theme/DarkTheme';
import { useCustomizerStore } from '@/stores/customizer';
const custmizer = useCustomizerStore();
const getPrimary = computed(() => {
if (custmizer.actTheme === 'AQUA_THEME') {
return themeColors.AQUA_THEME.colors.primary;
} else if (custmizer.actTheme === 'PURPLE_THEME') {
return themeColors.PURPLE_THEME.colors.primary;
} else if (custmizer.actTheme === 'GREEN_THEME') {
return themeColors.GREEN_THEME.colors.primary;
} else if (custmizer.actTheme === 'CYAN_THEME') {
return themeColors.CYAN_THEME.colors.primary;
} else if (custmizer.actTheme === 'ORANGE_THEME') {
return themeColors.ORANGE_THEME.colors.primary;
} else if (custmizer.actTheme === 'DARK_AQUA_THEME') {
return DarkThemeColors.DARK_AQUA_THEME.colors.primary;
} else if (custmizer.actTheme === 'DARK_PURPLE_THEME') {
return DarkThemeColors.DARK_PURPLE_THEME.colors.primary;
} else if (custmizer.actTheme === 'DARK_GREEN_THEME') {
return DarkThemeColors.DARK_GREEN_THEME.colors.primary;
} else if (custmizer.actTheme === 'DARK_CYAN_THEME') {
return DarkThemeColors.DARK_CYAN_THEME.colors.primary;
} else if (custmizer.actTheme === 'DARK_ORANGE_THEME') {
return DarkThemeColors.DARK_ORANGE_THEME.colors.primary;
} else if (custmizer.actTheme === 'DARK_BLUE_THEME') {
return DarkThemeColors.DARK_BLUE_THEME.colors.primary;
} else {
return themeColors.BLUE_THEME.colors.primary;
}
});
const getLightPrimary = computed(() => {
if (custmizer.actTheme === 'AQUA_THEME') {
return themeColors.AQUA_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'PURPLE_THEME') {
return themeColors.PURPLE_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'GREEN_THEME') {
return themeColors.GREEN_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'CYAN_THEME') {
return themeColors.CYAN_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'ORANGE_THEME') {
return themeColors.ORANGE_THEME.colors.lightprimary;
}
if (custmizer.actTheme === 'DARK_AQUA_THEME') {
return DarkThemeColors.DARK_AQUA_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'DARK_PURPLE_THEME') {
return DarkThemeColors.DARK_PURPLE_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'DARK_GREEN_THEME') {
return DarkThemeColors.DARK_GREEN_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'DARK_CYAN_THEME') {
return DarkThemeColors.DARK_CYAN_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'DARK_ORANGE_THEME') {
return DarkThemeColors.DARK_ORANGE_THEME.colors.lightprimary;
} else if (custmizer.actTheme === 'DARK_BLUE_THEME') {
return DarkThemeColors.DARK_BLUE_THEME.colors.lightprimary;
} else {
return themeColors.BLUE_THEME.colors.lightprimary;
}
});
const getSecondary = computed(() => {
if (custmizer.actTheme === 'AQUA_THEME') {
return themeColors.AQUA_THEME.colors.secondary;
} else if (custmizer.actTheme === 'PURPLE_THEME') {
return themeColors.PURPLE_THEME.colors.secondary;
} else if (custmizer.actTheme === 'GREEN_THEME') {
return themeColors.GREEN_THEME.colors.secondary;
} else if (custmizer.actTheme === 'CYAN_THEME') {
return themeColors.CYAN_THEME.colors.secondary;
} else if (custmizer.actTheme === 'ORANGE_THEME') {
return themeColors.ORANGE_THEME.colors.secondary;
} else if (custmizer.actTheme === 'DARK_AQUA_THEME') {
return DarkThemeColors.DARK_AQUA_THEME.colors.secondary;
} else if (custmizer.actTheme === 'DARK_PURPLE_THEME') {
return DarkThemeColors.DARK_PURPLE_THEME.colors.secondary;
} else if (custmizer.actTheme === 'DARK_GREEN_THEME') {
return DarkThemeColors.DARK_GREEN_THEME.colors.secondary;
} else if (custmizer.actTheme === 'DARK_CYAN_THEME') {
return DarkThemeColors.DARK_CYAN_THEME.colors.secondary;
} else if (custmizer.actTheme === 'DARK_ORANGE_THEME') {
return DarkThemeColors.DARK_ORANGE_THEME.colors.secondary;
} else if (custmizer.actTheme === 'DARK_BLUE_THEME') {
return DarkThemeColors.DARK_BLUE_THEME.colors.secondary;
} else {
return themeColors.BLUE_THEME.colors.secondary;
}
});
const getLightSecondary = computed(() => {
if (custmizer.actTheme === 'AQUA_THEME') {
return themeColors.AQUA_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'PURPLE_THEME') {
return themeColors.PURPLE_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'GREEN_THEME') {
return themeColors.GREEN_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'CYAN_THEME') {
return themeColors.CYAN_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'ORANGE_THEME') {
return themeColors.ORANGE_THEME.colors.lightsecondary;
} if (custmizer.actTheme === 'DARK_AQUA_THEME') {
return DarkThemeColors.DARK_AQUA_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'DARK_PURPLE_THEME') {
return DarkThemeColors.DARK_PURPLE_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'DARK_GREEN_THEME') {
return DarkThemeColors.DARK_GREEN_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'DARK_CYAN_THEME') {
return DarkThemeColors.DARK_CYAN_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'DARK_ORANGE_THEME') {
return DarkThemeColors.DARK_ORANGE_THEME.colors.lightsecondary;
} else if (custmizer.actTheme === 'DARK_BLUE_THEME') {
return DarkThemeColors.DARK_BLUE_THEME.colors.lightsecondary;
} else {
return themeColors.BLUE_THEME.colors.lightsecondary;
}
});
const getLight100 = computed(() => {
if (
custmizer.actTheme === 'AQUA_THEME' ||
custmizer.actTheme === 'PURPLE_THEME' ||
custmizer.actTheme === 'GREEN_THEME' ||
custmizer.actTheme === 'CYAN_THEME' ||
custmizer.actTheme === 'ORANGE_THEME'
) {
return themeColors.AQUA_THEME.colors.grey100;
} else if (
custmizer.actTheme === 'DARK_AQUA_THEME' ||
custmizer.actTheme === 'DARK_PURPLE_THEME' ||
custmizer.actTheme === 'DARK_GREEN_THEME' ||
custmizer.actTheme === 'DARK_CYAN_THEME' ||
custmizer.actTheme === 'DARK_ORANGE_THEME' ||
custmizer.actTheme === 'DARK_BLUE_THEME'
) {
return DarkThemeColors.DARK_AQUA_THEME.colors.grey100;
} else {
return themeColors.BLUE_THEME.colors.grey100;
}
});
export { getPrimary, getSecondary, getLightPrimary, getLightSecondary, getLight100 };
+16
View File
@@ -0,0 +1,16 @@
/**
* axios setup to use mock service
*/
import axios from "axios";
const axiosServices = axios.create();
// interceptor for http
axiosServices.interceptors.response.use(
(response) => response,
(error) =>
Promise.reject((error.response && error.response.data) || "Wrong Services")
);
export default axiosServices;
+136
View File
@@ -0,0 +1,136 @@
{
"Dashboard1": "لوحة القيادة1",
"Dashboard2": "لوحة القيادة2",
"Dashboard3": "لوحة القيادة3",
"ECommerce": "التجارة الإلكترونية",
"Blog": "مدونة",
"Blog Posts": "منشورات المدونة",
"Blog Details": "تفاصيل المدونة",
"Kanban": "لوحه اعلانات",
"UI Elements": "عناصر واجهة المستخدم",
"Header Table": "جدول الرأس",
"Selection Table": "جدول الاختيار",
"Pagination Table": "جدول ترقيم الصفحات",
"Filtering Table": "جدول التصفية",
"Grouping Table": "جدول التجميع",
"Table Slots": "فتحات الجدول",
"CRUD Table": "الجدول الخام",
"Sorting Table": "جدول الفرز",
"Boxed Forgot Pwd": "محاصر نسيت الأشخاص ذوي الإعاقة",
"Side Forgot Pwd": "نسيت الجانب الأشخاص ذويالإعاقة ",
"Tabler Icons": "أيقونات الجدول",
"Solar Icons": "أيقونات شمسية",
"Getting Started": "ابدء",
"Applications": "التطبيقات",
"Form Options": "خيارات النموذج",
"Table Variations": "اختلافات الجدول",
"Charts Selection": "اختيار الرسوم البيانية",
"Widgets": "الحاجيات",
"Cards": "بطاقات",
"Banners": "لافتات",
"Charts": "الرسوم البيانية",
"Contact": "اتصال",
"Shop": "محل",
"List": "قائمة",
"Checkout": "الدفع",
"Chats": "الدردشات",
"User Profile": "ملف تعريف المستخدمين",
"Notes": "ملحوظات",
"Calendar": "تقويم",
"Profile": "حساب تعريفي",
"Followers": "متابعون",
"Friends": "أصدقاء",
"Gallery": "صالة عرض",
"Email": "بريد إلكتروني",
"Pricing": "التسعير",
"Account Setting": "إعدادات الحساب",
"FAQ": "التعليمات",
"Widget": "القطعة",
"Landing Page": "الصفحة المقصودة",
"Form Elements": "عناصر النموذج",
"Autocomplete": "الإكمال التلقائي",
"Combobox": "صندوق التحرير",
"Button": "زر",
"Checkbox": "خانة اختيار",
"Custom Inputs": "المدخلات المخصصة",
"File Inputs": "مدخلات الملف",
"Radio": "مذياع",
"Date Time": "تاريخ الوقت",
"Select": "يختار",
"Slider": "المنزلق",
"Switch": "يُحوّل",
"Form Layout": "تخطيط النموذج",
"Form Horizontal": "شكل أفقي",
"Form Vertical": "شكل عمودي",
"Form Custom": "نموذج مخصص",
"Form Validation": "التحقق من صحة النموذج",
"Editor": "محرر",
"Basic Table": "الجدول الأساسي",
"Dark Table": "طاولة مظلمة",
"Density Table": "جدول الكثافة",
"Fixed Header Table": "جدول الرأس الثابت",
"Height Table": "جدول الارتفاع",
"UI Components": "مكونات واجهة المستخدم",
"Alert": "يُحذًِر",
"Accordion": "الأكورديون",
"Avatar": "الصورة الرمزية",
"Chip": "رقاقة",
"Dialog": "حوار",
"Menus": "القوائم",
"Rating": "تقييم",
"Tabs": "نوافذ التبويب",
"Tooltip": "Tooltip",
"Typography": "الطباعة",
"Line": "خط",
"Gredient": "طفيف",
"Area": "منطقة",
"Candlestick": "شمعدان",
"Column": "عمود",
"Doughnut & Pie": "دونات وفطيرة",
"Radialbar & Radar": "راديال بار ورادار",
"Login": "تسجيل الدخول",
"Side Login": "تسجيل الدخول الجانبي",
"Boxed Login": "تسجيل الدخول محاصر",
"Register": "يسجل",
"Side Register": "تسجيل جانبي",
"Boxed Register": "سجل محاصر",
"Forgot Password": "هل نسيت كلمة السر",
"Side Forgot Password": "الجانب نسيت كلمة المرور",
"Boxed Forgot Password": "محاصر نسيت كلمة المرور",
"Two Steps": "خطوتين",
"Side Two Steps": "الجانب ذو خطوتين",
"Boxed Two Steps": "خطوتين محاصر",
"Error": "خطأ",
"Maintenance": "صيانة",
"Menu Level": "مستوى القائمة",
"Level 1": "المستوى 1",
"Level 2": "المستوي 2",
"Level 3": "مستوى 3",
"Disabled": "عاجز",
"Sub Caption": "التسمية التوضيحية الفرعية",
"Outlined": "موجز",
"External Link": "رابط خارجي",
"Editable Table": "جدول قابل للتحرير",
"Front Pages": "الصفحات الأولى",
"Homepage": "الصفحة الرئيسية",
"About Us": "معلومات عنا",
"Contact Us": "اتصل بنا",
"Portfolio": "مَلَفّ",
"Invoice":"فاتورة",
"Create":"يخلق",
"Edit":"يحرر",
"Tickets":"التذاكر",
"Details":"تفاصيل",
"Banners Widgets":"لافتات الحاجيات",
"Cards Widgets":"الحاجيات بطاقات",
"Charts Widgets":"الحاجيات الرسوم البيانية",
"Gallery Lightbox":"المعرض المبسط",
"Search Results":"نتائج البحث",
"Social Contacts":"جهات الاتصال الاجتماعية",
"Treeview":"عرض الشجرة"
}
+98
View File
@@ -0,0 +1,98 @@
{
"Dashboard1": "Dashboard1",
"Dashboard2": "Dashboard2",
"Dashboard3": "Dashboard3",
"Contact": "Contact",
"Blog Posts": "Blog Posts",
"Blog Detail": "Blog Detail",
"ECommerce": "ECommerce",
"Kanban":"Kanban",
"Shop": "Shop",
"List": "List",
"Checkout": "Checkout",
"Chats": "Chats",
"User Profile": "Users Profile",
"Ui Elements":"Ui Elements",
"Profile": "Profile",
"Followers": "Followers",
"Friends": "Friends",
"Gallery": "Gallery",
"Email": "Email",
"Pricing": "Pricing",
"Account Setting": "Account Setting",
"FAQ": "FAQ",
"Widget": "Widget",
"Landing Page": "Landing Page",
"Form Elements": "Form Elements",
"Autocomplete": "Autocomplete",
"Combobox": "Combobox",
"Button": "Button",
"Checkbox": "Checkbox",
"Custom Inputs": "Custom Inputs",
"File Inputs": "File Inputs",
"Radio": "Radio",
"Date Time": "Date Time",
"Select": "Select",
"Slider": "Slider",
"Switch": "Switch",
"Form Layout": "Form Layout",
"Form Horizontal": "Form Horizontal",
"Form Vertical": "Form Vertical",
"Form Custom": "Form Custom",
"Form Validation": "Form Validation",
"Editor": "Editor",
"Basic Table": "Basic Table",
"Dark Table": "Dark Table",
"Density Table": "Density Table",
"Fixed Header Table": "Fixed Header Table",
"Height Table": "Height Table",
"UI Components": "Ui Components",
"Alert": "Alert",
"Accordion": "Accordion",
"Avatar": "Avatar",
"Chip": "Chip",
"Dialog": "Dialog",
"Menus": "Menus",
"Rating": "Rating",
"Tabs": "Tabs",
"Tooltip": "Tooltip",
"Typography": "Typography",
"Line": "Line",
"Gredient": "Gredient",
"Area": "Area",
"Candlestick": "Candlestick",
"Column": "Column",
"Doughnut & Pie": "Doughnut & Pie",
"Radialbar & Radar": "Radialbar & Radar",
"Login": "Login",
"Side Login": "Side Login",
"Boxed Login": "Boxed Login",
"Register": "Register",
"Side Register": "Side Register",
"Boxed Register": "Boxed Register",
"Forgot Password": "Forgot Password",
"Side Forgot Pwd": "Side Forgot Pwd",
"Boxed Forgot Pwd": "Boxed Forgot Pwd",
"Two Steps": "Two Steps",
"Side Two Steps": "Side Two Steps",
"Boxed Two Steps": "Boxed Two Steps",
"Error": "Error",
"Maintenance": "Maintenance",
"Menu Level": "Menu level",
"Level 1": "Level 1",
"Level 2": "Level 2",
"Level 3": "Level 3",
"Disabled": "Disabled",
"Sub Caption": "Sub Caption",
"Outlined": "Outlined",
"External Link": "External Link",
"Editable Table":"Editable Table",
"Header Table":"Header Table",
"Selection Table":"Selection Table",
"Pagination Table":"Pagination Table",
"Filtering Table":"Filtering Table",
"Grouping Table":"Grouping Table",
"Table Slots":"Table Slots",
"CRUD Table":"CRUD Table"
}
+135
View File
@@ -0,0 +1,135 @@
{
"Dashboard1": "Tableau de bord1",
"Dashboard2": "Tableau de bord2",
"Dashboard3": "Tableau de bord3",
"ECommerce": "Commerce électronique",
"Blog": "Blog",
"Blog Posts": "Articles de blog",
"Blog Details": "Détails du blog",
"Kanban": "enseigne",
"UI Elements": "Éléments de l'interface utilisateur",
"Header Table": "Tableau d'en-tête",
"Selection Table": "Tableau de sélection",
"Pagination Table": "Tableau de pagination",
"Filtering Table": "Tableau de filtrage",
"Grouping Table": "Tableau de regroupement",
"Table Slots": "Emplacements de table",
"CRUD Table": "Tableau CRUD",
"Sorting Table": "Tableau de tri",
"Boxed Forgot Pwd": "Mot de passe oublié en boîte",
"Side Forgot Pwd": "Côté mot de passe oublié",
"Tabler Icons": "Tabler Icons",
"Solar Icons": "Icônes solaires",
"Getting Started": "Commencer",
"Applications": "Applications",
"Form Options": "Options de formulaire",
"Table Variations": "Variations des tableaux",
"Charts Selection": "Sélection de graphiques",
"Widgets": "Widgets",
"Cards": "Cartes",
"Banners": "Bannières",
"Charts": "Graphiques",
"Contact": "a lua legatura",
"Shop": "Boutique",
"List": "Liste",
"Checkout": "Vérifier",
"Chats": "Chattes",
"User Profile": "Profil des utilisateurs",
"Notes": "Remarques",
"Calendar": "Calendrier",
"Profile": "Profil",
"Followers": "Suiveuses",
"Friends": "Amies",
"Gallery": "Galerie",
"Email": "E-mail",
"Pricing": "Tarification",
"Account Setting": "Paramètre du compte",
"FAQ": "FAQ",
"Widget": "Widget",
"Landing Page": "Page de destination",
"Form Elements": "Éléments de formulaire",
"Autocomplete": "Saisie automatique",
"Combobox": "Boîte combo",
"Button": "Bouton",
"Checkbox": "Case à cocher",
"Custom Inputs": "Entrées personnalisées",
"File Inputs": "Entrées de fichier",
"Radio": "Radio",
"Date Time": "Date Heure",
"Select": "Sélectionner",
"Slider": "Glissière",
"Switch": "Changer",
"Form Layout": "Disposition du formulaire",
"Form Horizontal": "Forme horizontale",
"Form Vertical": "Forme verticale",
"Form Custom": "Formulaire personnalisé",
"Form Validation": "Validation du formulaire",
"Editor": "Éditrice",
"Basic Table": "Tableau de base",
"Dark Table": "Tableau noir",
"Density Table": "Tableau de densité",
"Fixed Header Table": "Table d'en-tête fixe",
"Height Table": "Tableau des hauteurs",
"UI Components": "Composants de l'interface utilisateur",
"Alert": "Alerte",
"Accordion": "Accordéon",
"Avatar": "Avatar",
"Chip": "Ébrécher",
"Dialog": "Dialogue",
"Menus": "Menus",
"Rating": "Notation",
"Tabs": "Filele",
"Tooltip": "Info-bulle",
"Typography": "Typographie",
"Line": "Doubler",
"Gredient": "Ils entreront",
"Area": "Zone",
"Candlestick": "Chandelier",
"Column": "Colonne",
"Doughnut & Pie": "Donut et Tarte",
"Radialbar & Radar": "Barre radiale et radar",
"Login": "Connexion",
"Side Login": "Connexion latérale",
"Boxed Login": "Connexion en boîte",
"Register": "Enregistrer",
"Side Register": "Registre latéral",
"Boxed Register": "Registre en boîte",
"Forgot Password": "Mot de passe oublié",
"Side Forgot Password": "Mot de passe oublié",
"Boxed Forgot Password": "Mot de passe oublié",
"Two Steps": "Deux étapes",
"Side Two Steps": "Côté deux étapes",
"Boxed Two Steps": "Deux étapes en boîte",
"Error": "Erreur",
"Maintenance": "Entretien",
"Menu Level": "Niveau menus",
"Level 1": "Niveau 1",
"Level 2": "Niveau 2",
"Level 3": "Niveau 3",
"Disabled": "Désactivé",
"Sub Caption": "Sous-titre",
"Outlined": "Décrite",
"External Link": "lien externe",
"Editable Table": "Tableau modifiable",
"Front Pages": "Premières pages",
"Homepage": "Page d'accueil",
"About Us": "À propos de nous",
"Contact Us": "Contactez-nous",
"Portfolio": "Portefeuille",
"Invoice":"Facture",
"Create":"Créer",
"Edit":"Modifier",
"Tickets":"Billets",
"Details":"Détails",
"Banners Widgets":"Widgets de bannières",
"Cards Widgets":"Widgets de cartes",
"Charts Widgets":"Widgets graphiques",
"Gallery Lightbox":"Galerie Lumineuse",
"Search Results":"Résultats de la recherche",
"Social Contacts":"Contacts sociaux",
"Treeview":"Vue arborescente"
}
+13
View File
@@ -0,0 +1,13 @@
import en from './en.json';
import fr from './fr.json';
import ar from './ar.json';
import zh from './zh.json';
const messages = {
en: en,
fr: fr,
ro: ar,
zh: zh
};
export default messages;
+135
View File
@@ -0,0 +1,135 @@
{
"Dashboard1": "儀表板1",
"Dashboard2": "儀表板2",
"Dashboard3": "儀表板3",
"ECommerce": "電子商務",
"Blog Posts": "部落格文章",
"Blog Details": "博客詳細信息",
"Kanban": "招牌",
"UI Elements": "使用者介面元素",
"Header Table": "標題表",
"Selection Table": "選型表",
"Pagination Table": "分頁表",
"Filtering Table": "篩選表",
"Grouping Table": "分組表",
"Table Slots": "桌子槽位",
"CRUD Table": "增刪改查表",
"Sorting Table": "排序表",
"Boxed Forgot Pwd": "盒裝忘記密碼",
"Side Forgot Pwd": "側邊忘記密碼",
"Tabler Icons": "表圖示",
"Solar Icons": "太陽能圖標",
"Getting Started": "入門",
"Applications": "應用領域",
"Form Options": "表格選項",
"Table Variations": "表格變化",
"Charts Selection": "圖表選擇",
"Widgets": "小部件",
"Cards": "牌",
"Banners": "橫幅",
"Charts": "圖表",
"Contact": "接触",
"Blog": "博客",
"Shop": "店铺",
"List": "列表",
"Checkout": "查看",
"Chats": "聊天记录",
"User Profile": "用户资料",
"Notes": "笔记",
"Calendar": "日历",
"Profile": "轮廓",
"Followers": "追随者",
"Friends": "朋友们",
"Gallery": "画廊",
"Email": "电子邮件",
"Pricing": "价钱",
"Account Setting": "账户设置",
"FAQ": "常问问题",
"Widget": "微件",
"Landing Page": "登陆页面",
"Form Elements": "表单元素",
"Autocomplete": "自动完成",
"Combobox": "组合框",
"Button": "按钮",
"Checkbox": "复选框",
"Custom Inputs": "自定义输入",
"File Inputs": "文件输入",
"Radio": "收音机",
"Date Time": "约会时间",
"Select": "选择",
"Slider": "滑块",
"Switch": "转变",
"Form Layout": "表单布局",
"Form Horizontal": "表格水平",
"Form Vertical": "垂直形式",
"Form Custom": "表格定制",
"Form Validation": "表单验证",
"Editor": "编辑",
"Basic Table": "基本表",
"Dark Table": "暗表",
"Density Table": "密度表",
"Fixed Header Table": "固定头表",
"Height Table": "身高表",
"UI Components": "用户界面组件",
"Alert": "警报",
"Accordion": "手风琴",
"Avatar": "头像",
"Chip": "芯片",
"Dialog": "对话",
"Menus": "菜单",
"Rating": "评分",
"Tabs": "选项卡",
"Tooltip": "工具提示",
"Typography": "排版",
"Line": "线",
"Gredient": "他们将进入",
"Area": "区域",
"Candlestick": "烛台",
"Column": "柱子",
"Doughnut & Pie": "甜甜圈和馅饼",
"Radialbar & Radar": "径向杆和雷达",
"Login": "登录",
"Side Login": "侧登录",
"Boxed Login": "盒装登录",
"Register": "登记",
"Side Register": "边寄存器",
"Boxed Register": "盒装寄存器",
"Forgot Password": "忘记密码",
"Side Forgot Password": "方忘记密码",
"Boxed Forgot Password": "盒装忘记密码",
"Two Steps": "两步",
"Side Two Steps": "侧面两步",
"Boxed Two Steps": "盒装两步",
"Error": "错误",
"Maintenance": "维护",
"Menu Level": "菜单层",
"Level 1": "等级 1",
"Level 2": "等级 2",
"Level 3": "等级 3",
"Disabled": "残疾人",
"Sub Caption": "副标题",
"Outlined": "概述",
"External Link": "外部链接",
"Editable Table": "可编辑表格",
"Front Pages": "首頁",
"Homepage": "首頁",
"About Us": "關於我們",
"Contact Us": "聯絡我們",
"Portfolio": "資料夾",
"Invoice": "发票",
"Create": "创造",
"Edit": "编辑",
"Tickets": "门票",
"Details": "细节",
"Banners Widgets":"横幅小部件",
"Cards Widgets":"卡片小部件",
"Charts Widgets":"图表小工具",
"Gallery Lightbox":"画廊灯箱",
"Search Results":"搜索结果",
"Social Contacts":"社会交往",
"Treeview":"树状视图"
}
+300
View File
@@ -0,0 +1,300 @@
// utils/fhirNameParser.ts
import type { FhirHumanName } from "~/types/fhir/humanName";
// Indonesian academic suffixes
import indonesianPrefixes from "~/data/indonesianPrefixes.json";
import indonesianSuffixes from "~/data/indonesianSuffixes.json";
const INDONESIAN_PREFIXES: readonly string[] = indonesianPrefixes;
const INDONESIAN_SUFFIXES: readonly string[] = indonesianSuffixes;
// Family name patterns
interface FamilyNamePattern {
pattern: RegExp;
category: string;
}
const FAMILY_NAME_PATTERNS: readonly FamilyNamePattern[] = [
// Pola untuk nama keluarga Batak
{
pattern:
/^(Siregar|Sitorus|Simanjuntak|Simatupang|Sinaga|Harahap|Hasibuan|Hutapea|Hutagalung|Hutabarat|Nasution|Lubis|Batubara|Rangkuti|Dalimunthe|Daulay|Matondang|Pulungan|Parinduri)$/i,
category: "batak"
},
// Pola untuk nama keluarga Mandailing
{
pattern:
/^(Nasution|Lubis|Batubara|Rangkuti|Dalimunthe|Daulay|Matondang|Pulungan|Parinduri)$/i,
category: "mandailing"
},
// Pola untuk nama keluarga Tionghoa
{
pattern:
/^(Tan|Lim|Lie|Ong|Tjoa|Oei|Kwee|The|Chong|Huang|Li|Wang|Zhang|Chen|Liu|Yang)$/i,
category: "chinese"
},
// Pola untuk nama keluarga Javanese-Chinese
{
pattern:
/^(Wijaya|Santoso|Gunawan|Susanto|Halim|Tjandra|Suharto|Prabowo|Wibowo|Setiawan)$/i,
category: "javanese-chinese"
},
// Pola untuk nama umum dengan akhiran
{
pattern:
/^(Putra|Putri|Wati|Ningrum|Sari|Dewi|Rahayu|Sukma|Ningsih|Rizki)$/i,
category: "common-suffix"
},
// Pola untuk nama keluarga Melayu-Arab
{
pattern: /^(bin|binti)$/i,
category: "malay-arabic"
},
// Pola untuk nama keluarga umum
{
pattern: /^(Sukma|Rizki|Dewi|Sari|Ningsih|Rahayu|Wati|Ningrum)$/i,
category: "common"
},
// Pola untuk nama keluarga Arab
{
pattern:
/^(Yusuf|Hassan|Ali|Fatimah|Aisyah|Zain|Husain|Khalid|Amin|Salim)$/i,
category: "arabic"
},
// Pola untuk nama keluarga Javanese
{
pattern:
/^(Suharto|Suharjo|Sukardi|Sukmawati|Kusuma|Prabowo|Wibowo|Setiawan)$/i,
category: "javanese"
},
// Pola untuk nama keluarga perempuan
{
pattern: /^(Sari|Wati|Ningrum|Dewi|Rahayu|Sukma|Ningsih)$/i,
category: "female-suffix"
},
// Pola untuk nama keluarga Sunda
{
pattern:
/^(Sukma|Sari|Dewi|Rahayu|Hidayah|Ningsih|Rizki|Suhendi|Sukardi)$/i,
category: "sundanese"
},
// Pola untuk nama keluarga Bali
{
pattern: /^(Putra|Putri|Wayan|Made|Nyoman|Ketut|Agung|Sukma|Dewi|Sari)$/i,
category: "balinese"
},
// Pola untuk nama keluarga Bugis
{
pattern: /^(Andi|Daeng|Puang|Sultan|Raja|Sitti|Baji|Makkunrai)$/i,
category: "bugis"
},
// Pola untuk nama keluarga Minang
{
pattern: /^(Sutan|Datuk|Raja|Pangeran|Haji|Sari|Datu|Raden)$/i,
category: "minang"
}
];
export function parseFhirHumanName(
fullName: string | null | undefined
): FhirHumanName | null {
if (!fullName || typeof fullName !== "string") {
return null;
}
const fhirName: FhirHumanName = {
use: "official",
text: fullName.trim(),
family: undefined,
given: [],
prefix: [],
suffix: []
};
let workingName = fullName.trim();
// Extract prefixes - accumulate consecutive prefixes into one string
const prefixesFound: string[] = [];
let prefixFound = true;
while (prefixFound) {
prefixFound = false;
for (const prefix of INDONESIAN_PREFIXES) {
const regex = new RegExp(`^${escapeRegExp(prefix)}\\s+`, "i");
if (regex.test(workingName)) {
prefixesFound.push(prefix);
workingName = workingName.replace(regex, "");
prefixFound = true;
break; // restart loop after removing one prefix
}
}
}
if (prefixesFound.length > 0) {
fhirName.prefix!.push(prefixesFound.join(" "));
} else {
// If no known prefix found, treat first word as prefix or given if single word
const firstSpaceIndex = workingName.indexOf(" ");
if (firstSpaceIndex !== -1) {
const firstWord = workingName.substring(0, firstSpaceIndex);
fhirName.prefix!.push(firstWord);
workingName = workingName.substring(firstSpaceIndex + 1).trim();
} else if (workingName.length > 0) {
// Single word name, treat as given
fhirName.given!.push(workingName);
workingName = "";
}
}
// Extract suffixes - improved to handle multiple suffixes separated by commas and spaces
fhirName.suffix = [];
let suffixesFound = true;
while (suffixesFound) {
suffixesFound = false;
for (const suffix of INDONESIAN_SUFFIXES) {
const regex = new RegExp(`(,?\\s+${escapeRegExp(suffix)})$`, "i");
if (regex.test(workingName)) {
if (!fhirName.suffix.includes(suffix)) {
fhirName.suffix.push(suffix);
}
workingName = workingName.replace(regex, "").trim();
suffixesFound = true;
break; // restart loop after removing one suffix
}
}
}
// Remove trailing commas after suffix removal
workingName = workingName.replace(/,\s*$/, "").trim();
// Remove trailing commas
workingName = workingName.replace(/,\s*$/, "").trim();
// Split name parts
const nameParts = workingName.split(/\s+/).filter((part) => part.length > 0);
if (nameParts.length === 0) {
return fhirName;
}
// Parse name parts with improved family name detection for multi-word family names
if (nameParts.length === 1) {
fhirName.given!.push(nameParts[0]);
} else if (nameParts.length === 2) {
if (isLikelyFamilyName(nameParts[1])) {
fhirName.family = nameParts[1];
fhirName.given!.push(nameParts[0]);
} else {
fhirName.given!.push(nameParts[0]);
fhirName.given!.push(nameParts[1]);
}
} else {
// Check last two words combined for family name
const lastTwoParts = nameParts.slice(-2).join(" ");
if (isLikelyFamilyName(lastTwoParts)) {
fhirName.family = lastTwoParts;
for (let i = 0; i < nameParts.length - 2; i++) {
fhirName.given!.push(nameParts[i]);
}
} else if (isLikelyFamilyName(nameParts[nameParts.length - 1])) {
fhirName.family = nameParts[nameParts.length - 1];
for (let i = 0; i < nameParts.length - 1; i++) {
fhirName.given!.push(nameParts[i]);
}
} else {
// Default: treat last two words as family name
fhirName.family = lastTwoParts;
for (let i = 0; i < nameParts.length - 2; i++) {
fhirName.given!.push(nameParts[i]);
}
}
}
// Clean up empty arrays
if (fhirName.prefix!.length === 0) delete fhirName.prefix;
if (fhirName.suffix!.length === 0) delete fhirName.suffix;
if (fhirName.given!.length === 0) delete fhirName.given;
if (!fhirName.family) delete fhirName.family;
return fhirName;
}
function isLikelyFamilyName(namePart: string): boolean {
return FAMILY_NAME_PATTERNS.some(({ pattern }) => pattern.test(namePart));
}
function escapeRegExp(string: string): string {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
export function formatFhirName(
fhirName: FhirHumanName | null | undefined
): string {
if (!fhirName) return "";
const parts: string[] = [];
if (fhirName.prefix && fhirName.prefix.length > 0) {
parts.push(fhirName.prefix.join(" "));
}
if (fhirName.given && fhirName.given.length > 0) {
parts.push(fhirName.given.join(" "));
}
if (fhirName.family) {
parts.push(fhirName.family);
}
if (fhirName.suffix && fhirName.suffix.length > 0) {
parts.push(fhirName.suffix.join(", "));
}
return parts.join(" ");
}
export function validateFhirHumanName(
fhirName: FhirHumanName | null | undefined
): string[] {
const errors: string[] = [];
if (!fhirName) {
errors.push("FHIR HumanName object is required");
return errors;
}
if (!fhirName.text || fhirName.text.trim() === "") {
errors.push("Text representation of name is required");
}
if ((!fhirName.given || fhirName.given.length === 0) && !fhirName.family) {
errors.push("At least one given name or family name is required");
}
const validUseValues: FhirHumanName["use"][] = [
"usual",
"official",
"temp",
"nickname",
"anonymous",
"old",
"maiden"
];
if (fhirName.use && !validUseValues.includes(fhirName.use)) {
errors.push(
`Invalid use value. Must be one of: ${validUseValues.join(", ")}`
);
}
return errors;
}