Update imports
This commit is contained in:
parent
7025674cde
commit
bb6d5b96ca
3
.env
3
.env
|
@ -55,7 +55,6 @@ VITE_ENTITY_SYSTEM=entity-view-system
|
|||
VITE_BORHAN_SYSTEM=borhan-system
|
||||
VITE_THIQAT_SYSTEM=thiqat-system
|
||||
VITE_CHAT_SYSTEM=chat-system
|
||||
VITE_TASK_SYSTEM=task-system
|
||||
VITE_REPORT_SYSTEM=report-system
|
||||
VITE_ADMIN_SYSTEM=admin-panel
|
||||
VITE_TAHRIR_SYSTEM=tahrir-system
|
||||
|
@ -115,3 +114,5 @@ VITE_HELP_PAGE=راهنمای سایت
|
|||
# modules
|
||||
# [listRoutes, chatRoutes, tahrirRoutes, jahatRoutes, borhanRoutes, thiqatRoutes]
|
||||
VITE_BUILD_MODULES=listRoutes,tahrirRoutes,jahatRoutes,thiqatRoutes
|
||||
|
||||
NUXT_SESSION_PASSWORD=7a5eb85e8b5b43f6b09b73741bf9f6f9
|
|
@ -1,4 +1,5 @@
|
|||
NUXT_PUBLIC_BASE_URL=http://192.168.23.161/
|
||||
# NUXT_PUBLIC_BASE_URL=http://192.168.23.161/
|
||||
NUXT_PUBLIC_BASE_URL=https://hadithai.ir/
|
||||
|
||||
VITE_APP_NAME=Hadith
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ VITE_TAHRIR_PAGE_TITLE = قانون - سامانه ای برای سندنگار
|
|||
VITE_REPORT_PAGE_TITLE = قانون - سامانه گزارش گیری داده
|
||||
VITE_PERMISSION_PAGE_TITLE = قانون - سامانه کنترل وظایف
|
||||
VITE_CHAT_PAGE_TITLE = قانون - سامانه گفتگو
|
||||
VITE_TASK_PAGE_TITLE = قانون - سامانه وظایف
|
||||
VITE_RESEARCH_PAGE_TITLE = قانون - تحقیقات من
|
||||
VITE_AI_TOOLS_PAGE_TITLE = قانون - حاشیه نویسی
|
||||
|
||||
|
|
|
@ -1,15 +1,19 @@
|
|||
Add new repo:
|
||||
git submodule add https://git2.tavasi.ir/front/chat_ui.git systems/chat_ui -f
|
||||
|
||||
clone from a single branch
|
||||
git clone --single-branch --branch rezae/feat/add-task-module --recurse-submodules https://git2.tavasi.ir/front/base_ui.git
|
||||
|
||||
Cloning a Repository with Submodules
|
||||
If you clone a repository that contains submodules, you'll need to initialize and update the submodules:
|
||||
git clone <repository-url>
|
||||
cd <repository-directory>
|
||||
git clone repository-url
|
||||
cd repository-directory
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
Or, you can do it in one step:
|
||||
git clone --recurse-submodules <repository-url>
|
||||
git clone --recurse-submodules https://git2.tavasi.ir/front/base_ui.git
|
||||
|
||||
|
||||
Updating Submodules
|
||||
To update a submodule to the latest commit on its branch:
|
||||
|
|
BIN
assets/common/fonts/Estedad-v5.0/Estedad.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/Estedad.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/Estedad.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/Estedad.woff2
Normal file
Binary file not shown.
6
assets/common/fonts/Estedad-v5.0/Fontjo.Com ورود به.url
Normal file
6
assets/common/fonts/Estedad-v5.0/Fontjo.Com ورود به.url
Normal file
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://fontjo.com/
|
||||
IDList=
|
||||
HotKey=0
|
6
assets/common/fonts/Estedad-v5.0/Fontjo.IR ورود به.url
Normal file
6
assets/common/fonts/Estedad-v5.0/Fontjo.IR ورود به.url
Normal file
|
@ -0,0 +1,6 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://fontjo.com/
|
||||
IDList=
|
||||
HotKey=0
|
5
assets/common/fonts/Estedad-v5.0/read me!.txt
Normal file
5
assets/common/fonts/Estedad-v5.0/read me!.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
Thank you for downloading the file from the FonJo site
|
||||
--------------------------------------------------------------
|
||||
AllRight Reserved By Fontjo.com ~ Fontjo.ir
|
||||
--------------------------------------------------------------
|
||||
Copy Font files to Addree > C:\Windows\Fonts
|
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Black.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Black.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Bold.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Bold.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-ExtraBold.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-ExtraLight.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-ExtraLight.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Light.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Light.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Medium.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Medium.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Regular.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Regular.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-SemiBold.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-SemiBold.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Thin.ttf
Normal file
BIN
assets/common/fonts/Estedad-v5.0/ttf/Estedad-Thin.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Black.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Black.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Bold.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Bold.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-ExtraBold.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-ExtraBold.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-ExtraLight.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-ExtraLight.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Light.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Light.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Medium.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Medium.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Regular.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Regular.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-SemiBold.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-SemiBold.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Thin.woff2
Normal file
BIN
assets/common/fonts/Estedad-v5.0/woff2/Estedad-Thin.woff2
Normal file
Binary file not shown.
929
assets/common/fonts/vazir-font-v16.1.0/CHANGELOG.md
Normal file
929
assets/common/fonts/vazir-font-v16.1.0/CHANGELOG.md
Normal file
|
@ -0,0 +1,929 @@
|
|||
تغییرات فونت وزیر
|
||||
=================
|
||||
|
||||
در اینجا شما فهرستی از تغییرات بین هر نسخهی انتشار از فونت وزیر را مشاهده میکنید.
|
||||
|
||||
نسخه ۱۶.۱.۰
|
||||
-----------
|
||||
۲۰ مهر ۱۳۹۶
|
||||
|
||||
- رفع اشکال سرکش گاف
|
||||
- بهبود ی ـی ه
|
||||
- بهبود همزه روی حروف
|
||||
- کاهش ارتفاغ گیومه
|
||||
- بهبود هـ در حالت ضخیم
|
||||
- بهبود نقاط در حالت ضخیم
|
||||
- بهبود نقاط ژ ز
|
||||
|
||||
|
||||
نسخه ۱۶.۰.۱
|
||||
-----------
|
||||
۱۵ مهر ۱۳۹۶
|
||||
|
||||
- رفع اشکال س
|
||||
|
||||
|
||||
نسخه ۱۶.۰.۰
|
||||
-----------
|
||||
۱۵ مهر ۱۳۹۶
|
||||
|
||||
- بهبود کل اعراب
|
||||
- اصلاح ضخامت کـ ـکـ
|
||||
- بهبود متیرکهای فونت
|
||||
- بهبود ؟ ! ا ـه ص ط ء و همزه روی حروف
|
||||
- بهبود ارتفاع و ناحیه همپوشانی
|
||||
|
||||
|
||||
نسخه ۱۵.۱.۰
|
||||
-----------
|
||||
۲ مهر ۱۳۹۶
|
||||
|
||||
- بهبود ۹ ۵ ـد کـ ـکـ
|
||||
- اصلاح اعراب کـ ـکـ
|
||||
|
||||
|
||||
نسخه ۱۵.۰.۰
|
||||
-----------
|
||||
۹ شهریور ۱۳۹۶
|
||||
|
||||
- بهبود ضخامت
|
||||
- بهبود ر و ی
|
||||
- بهبود ارتفاع
|
||||
|
||||
|
||||
نسخه ۱۴.۰.۰
|
||||
-----------
|
||||
۳۱ مرداد ۱۳۹۶
|
||||
|
||||
- بهبود حروف و ارقام
|
||||
- اصلاح مشخصات فونتهای تفکیک شده بدون لاتین و حروف فارسی (با تشکر از @morealaz)
|
||||
|
||||
|
||||
نسخه ۱۳.۰.۱
|
||||
-----------
|
||||
۱۵ تیر ۱۳۹۶
|
||||
|
||||
- اصلاح ایراد ـآ ـأ
|
||||
- اصلاح نقاط ـه ه نقطهدار
|
||||
- اصلاح اعراب إ ـإ
|
||||
|
||||
|
||||
نسخه ۱۳.۰.۰
|
||||
-----------
|
||||
۱۵ تیر ۱۳۹۶
|
||||
|
||||
- بهبود دندانههای وسط و انتها
|
||||
- اصلاح فـ
|
||||
- بهبود فاصله بین واژهای
|
||||
- بهبود ضخامت ح ـح ع ـع
|
||||
|
||||
|
||||
نسخه ۱۲.۰.۰
|
||||
-----------
|
||||
۱۰ تیر ۱۳۹۶
|
||||
|
||||
- بهبود حروف کشیده
|
||||
- بهبود م ی ط ف
|
||||
- بهبود ـو ـق
|
||||
- تصحیح لیگچر الله
|
||||
- بهبود مکان نقاط
|
||||
|
||||
|
||||
نسخه ۱۱.۰.۱
|
||||
-----------
|
||||
۲۵ خرداد ۱۳۹۶
|
||||
|
||||
- اصلاح نام قلم در حالت نازک برای محیط دسکتاپ (با تشکر از @Javid-Izadfar)
|
||||
|
||||
|
||||
نسخه ۱۱.۰.۰
|
||||
-----------
|
||||
۱۸ خرداد ۱۳۹۶
|
||||
|
||||
- بهبود سـ ـسـ ـا ـی ی ـعـ
|
||||
- بهبود حالات م ک
|
||||
- اصلاح عرض ف
|
||||
- اضافه شدن نسخه باریک
|
||||
|
||||
|
||||
نسخه ۱۰.۰.۱
|
||||
-----------
|
||||
۱۵ خرداد ۱۳۹۶
|
||||
|
||||
- رفع ایراد عرض ـفـ ـقـ
|
||||
- اصلاح ضخامت مد در حالت نازک
|
||||
- رفع ایراد هینتینگ در woff و eot
|
||||
|
||||
|
||||
نسخه ۱۰.۰.۰
|
||||
-----------
|
||||
۶ خرداد ۱۳۹۶
|
||||
|
||||
- بهبود و بازطراحی در گلیفها
|
||||
- اضافه شدن نسخه وزن متوسط
|
||||
- اضافه شدن نسخه woff2
|
||||
|
||||
|
||||
نسخه ۱۰.۰.۰-بتا
|
||||
---------------
|
||||
۹ فروردین ۱۳۹۶
|
||||
|
||||
- اصلاح ضخامت خط کرسی در گلیفها (برابر شدن)
|
||||
- بهبود هـ در ضخیم
|
||||
- بهبود عرض ۹
|
||||
|
||||
|
||||
نسخه ۱۰.۰.۰-آلفا
|
||||
----------------
|
||||
۸ فروردین ۱۳۹۶
|
||||
|
||||
- تجدید نظر در سایز قلم
|
||||
- برابر شدن سایز وزنها
|
||||
- کاهش فاصله بین کلمات
|
||||
- بهبود ارقام
|
||||
- بهبود حروف و علائم
|
||||
|
||||
|
||||
نسخه ۹.۰.۰-بتا
|
||||
--------------
|
||||
۳۰ اسفند ۱۳۹۵
|
||||
|
||||
- کاهش فاصله بین کلمات
|
||||
- بازطراحی گیومه
|
||||
- بهبود فاصله طولی مـ ـه
|
||||
|
||||
|
||||
نسخه ۹.۰.۰-آلفا
|
||||
---------------
|
||||
۲۵ اسفند ۱۳۹۵
|
||||
|
||||
- تجدید نظر در ضخامت و اندازه قلم
|
||||
- اصلاح و بهبود گلیفها
|
||||
|
||||
|
||||
نسخه ۸.۲.۱
|
||||
----------
|
||||
۱۶ اسفند ۱۳۹۵
|
||||
|
||||
- اصلاح هـ عـ
|
||||
- اصلاح ط در ضخیم
|
||||
|
||||
|
||||
نسخه ۸.۲.۰
|
||||
----------
|
||||
۱۵ اسفند ۱۳۹۵
|
||||
|
||||
- بهبود ـعـ
|
||||
- اصلاح اعراب
|
||||
- اصلاح نقاط
|
||||
- اصلاح س
|
||||
|
||||
|
||||
نسخه ۸.۱.۰
|
||||
----------
|
||||
۱۳ اسفند ۱۳۹۵
|
||||
|
||||
- بهبود حالات خ
|
||||
- بهبود ارتفاع گلیفهای عمودی
|
||||
- بهبود نقطه ذ ـذ
|
||||
- بهبود ارتفاع م ـم
|
||||
- اصلاح ! در ضخیم
|
||||
|
||||
|
||||
نسخه ۸.۰.۰
|
||||
----------
|
||||
۱۲ اسفند ۱۳۹۵
|
||||
|
||||
- بهبود قوسها، اندازهها، طولها، شکلها و فاصلهها
|
||||
- رفع مشکل ـن (با تشکر از @Masishta)
|
||||
|
||||
|
||||
نسخه ۷.۱.۰
|
||||
----------
|
||||
۷ اسفند ۱۳۹۵
|
||||
|
||||
- اصلاح و بهبود د ـد ر ـر ـن مـ ـمـ ـفـ ـف هـ ـق ـو ّ ـت ف حـ ـحـ
|
||||
|
||||
|
||||
نسخه ۷.۰.۰
|
||||
----------
|
||||
۷ بهمن ۱۳۹۵
|
||||
|
||||
- افزایش سایز قلم جهت هماهنگی با سایر قلم های رایج
|
||||
- بهبود برخی گلیف ها و ارتفاع
|
||||
- اصلاح متریکها
|
||||
|
||||
|
||||
نسخه ۶.۳.۴
|
||||
----------
|
||||
۳ مهر ۱۳۹۵
|
||||
|
||||
- رفع ایراد زاویه سرکش گ
|
||||
- بهبود اتصال از راست ـط ـص
|
||||
- رفع ایراد X-Height
|
||||
|
||||
|
||||
نسخه ۶.۳.۳
|
||||
----------
|
||||
۲۳ آذر ۱۳۹۵
|
||||
|
||||
- رفع ایراد ضخامت کرسی ـح حـ ـحـ
|
||||
- رفع ایراد جهت در ضخیم
|
||||
|
||||
|
||||
نسخه ۶.۳.۲
|
||||
----------
|
||||
۱۶ آذر ۱۳۹۵
|
||||
|
||||
- رفع ایراد همخانواده نبودن نسخههای قلم
|
||||
|
||||
|
||||
نسخه ۶.۳.۱
|
||||
----------
|
||||
۱۵ آذر ۱۳۹۵
|
||||
|
||||
- اصلاح حالات ک در ضخیم
|
||||
- بهبود جزئی ـه
|
||||
|
||||
|
||||
نسخه ۶.۳.۰
|
||||
----------
|
||||
۱۵ آذر ۱۳۹۵
|
||||
|
||||
- بهبود ارتفاع
|
||||
- بهبود حـ ـحـ
|
||||
- اصلاح دندانه صـ ـصـ
|
||||
- بهبود ؟
|
||||
- افزایش فاصله نقاط در ضخیم
|
||||
|
||||
|
||||
نسخه ۶.۲.۰
|
||||
----------
|
||||
۱۲ آذر ۱۳۹۵
|
||||
|
||||
- بهبود ضخامت گلیف های عمودی
|
||||
- بهبود ارقام
|
||||
|
||||
|
||||
نسخه ۶.۱.۰
|
||||
----------
|
||||
۱۱ آذر ۱۳۹۵
|
||||
|
||||
- رفع اشکال ـت در ضخیم
|
||||
- بهبود ق
|
||||
- بهبود مکان نقاط
|
||||
|
||||
|
||||
نسخه ۶.۰.۰
|
||||
----------
|
||||
۱۰ آذر ۱۳۹۵
|
||||
|
||||
- بهبود قوسها و دندانهها و اندازهها و زوایا
|
||||
- بهبود شکل حروف
|
||||
- اصلاح همزه بر روی ه
|
||||
- افزایش فاصله بین واژهای
|
||||
|
||||
|
||||
نسخه ۵.۱.۱
|
||||
----------
|
||||
۱ آذر ۱۳۹۵
|
||||
|
||||
- بهبود عرض در ـسـ سـ ـس ـعـ
|
||||
|
||||
|
||||
نسخه ۵.۱.۰
|
||||
----------
|
||||
۱ آذر ۱۳۹۵
|
||||
|
||||
- بهبود ح ـح حـ ـحـ ـع ع ل ـل ی ـی ن ـن س ـس ص ـص ـهـ هـ ء
|
||||
- بهبود و اصلاح ارقام
|
||||
- بازگشت ـه از نسخه چهار
|
||||
|
||||
|
||||
نسخه ۵.۰.۰
|
||||
----------
|
||||
۳۰ آبان ۱۳۹۵
|
||||
|
||||
- بازطراحی برخی گلیف ها برای بازگشت به تایپ فیس وزیر یک
|
||||
- بهبود برخی گلیف ها (با تشکر از محمد)
|
||||
- اصلاح متریک در نسخه ضخیم
|
||||
- ایجاد دوباره نسخه ضخیم و سبک
|
||||
- اصلح ارقام ۴ ۵ ۶ در نسخه تمام ارقام فارسی
|
||||
|
||||
|
||||
نسخه ۴.۴.۱
|
||||
----------
|
||||
۷ آبان ۱۳۹۵
|
||||
|
||||
- بهبود فـ ف ق ـو و مـ ـمـ
|
||||
|
||||
|
||||
نسخه ۴.۴.۰
|
||||
----------
|
||||
۲۹ مهر ۱۳۹۵
|
||||
|
||||
- بهبود ارتفاع و فاصله و برخی نقاط
|
||||
- تصحیح صفر در ضخیم
|
||||
|
||||
|
||||
نسخه ۴.۳.۱
|
||||
----------
|
||||
۲۵ مهر ۱۳۹۵
|
||||
|
||||
- بهبود دندانه ها
|
||||
|
||||
|
||||
نسخه ۴.۳.۰
|
||||
----------
|
||||
۲۵ مهر ۱۳۹۵
|
||||
|
||||
- افزایش عرض مـ ـمـ لـ ـلـ ـی
|
||||
- بهبود ۹ فـ و ـفـ
|
||||
|
||||
|
||||
نسخه ۴.۲.۱
|
||||
----------
|
||||
۲۴ مهر ۱۳۹۵
|
||||
|
||||
- بهبود و در ضخیم
|
||||
- اصلاح ـقـ ٫
|
||||
- اضافه شدن گلیف ریال
|
||||
- تصحیح جهت
|
||||
|
||||
|
||||
نسخه ۴.۲
|
||||
--------
|
||||
۲۳ مهر ۱۳۹۵
|
||||
|
||||
- بهبود ضخامت در حالت توپر
|
||||
- بهبود دندانه ها و ارتفاع
|
||||
|
||||
|
||||
نسخه ۴.۱.۲
|
||||
----------
|
||||
۶ مهر ۱۳۹۵
|
||||
|
||||
- بهبود مـ ـه
|
||||
- اصلاح charset
|
||||
|
||||
|
||||
نسخه ۴.۱.۱
|
||||
----------
|
||||
۱۹ شهریور ۱۳۹۵
|
||||
|
||||
- بهبود بسیار جزيی قوس س ص ن
|
||||
- اصلاح دندانه صـ ـسـ
|
||||
- بهبود ـم
|
||||
|
||||
|
||||
نسخه ۴.۱.۰
|
||||
----------
|
||||
۷ شهریور ۱۳۹۵
|
||||
|
||||
- افزایش نواحی همپوشانی
|
||||
- کوچکتر شدن خط فاصله (تطویل)
|
||||
|
||||
|
||||
نسخه ۴.۰.۱
|
||||
----------
|
||||
۲۲ مرداد ۱۳۹۵
|
||||
|
||||
- اصلاح ۶
|
||||
- بهبود ح و دندانه های س در حالت ضخیم
|
||||
|
||||
|
||||
نسخه ۴.۰.۰
|
||||
----------
|
||||
۲۱ مرداد ۱۳۹۵
|
||||
|
||||
- باز طراحی و بهبود فونت
|
||||
- اضافه شدن حروف لاتین فونت روبوتو به قلم
|
||||
|
||||
|
||||
نسخه ۳.۱.۰
|
||||
----------
|
||||
۴ تیر ۱۳۹۵
|
||||
|
||||
- افزایش طولی فونت در برخی گلیف ها
|
||||
|
||||
|
||||
نسخه ۳.۰.۱
|
||||
----------
|
||||
۲۹ خرداد ۱۳۹۵
|
||||
|
||||
- اضافه شدن cdn
|
||||
|
||||
|
||||
نسخه ۳
|
||||
------
|
||||
۲۸ خرداد ۱۳۹۵
|
||||
|
||||
- بهبود بسیاری از گلیف ها
|
||||
- بهبود فاصله
|
||||
- اضافه شدن وزن های نازک و متوسط
|
||||
- اضافه شدن گلیف های الله و ریال
|
||||
- حذف داده های اضافی و کاهش حجم فایل
|
||||
|
||||
|
||||
نسخه ۲
|
||||
------
|
||||
۱۲ اردیبهشت ۱۳۹۵
|
||||
|
||||
- بهبود حالات س
|
||||
- بهبود بـ
|
||||
- پشتیبانی از bower با (تشکر از Nasser Rafie-geminorum)
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۱۳
|
||||
-------------------------
|
||||
۲ اردیبهشت ۱۳۹۵
|
||||
|
||||
- بهبود دندانه ها
|
||||
- بهبود ضخامت ها
|
||||
- بهبود فاصله در حالت توپر
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۱۲
|
||||
-------------------------
|
||||
۲۸ فروردین ۱۳۹۵
|
||||
|
||||
- بهبود ه و ـو ف فـ ـق ق ـد ر ـر
|
||||
- بهبود ارتفاع گلیف های عمودی و نقاط
|
||||
- اصلاح ؟ ! در حالت ضخیم
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۱۱
|
||||
-------------------------
|
||||
۲۳ فروردین ۱۳۹۵
|
||||
|
||||
- بهبود حالات ح ع
|
||||
- بهبود نقاط
|
||||
- اصلاح متریک های فونت
|
||||
- بهبود م
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۱۰
|
||||
-------------------------
|
||||
۲۰ فروردین ۱۳۹۵
|
||||
|
||||
- بهبود تک نقطه
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۹
|
||||
------------------------
|
||||
۱۸ فروردین ۱۳۹۵
|
||||
|
||||
- بهبود ٪
|
||||
- اصلاح کد پیج فونت (با تشکر از Saleh Souzanchi-zoghal و Saeed Rasooli-ilius)
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۸
|
||||
------------------------
|
||||
۱۳ فروردین ۱۳۹۵
|
||||
|
||||
- بهبود مـ ـمـ ی هـ ـه ـت
|
||||
- بهبود همزه (با تشکر از amin3d)
|
||||
- بهبود تک نقطه (با تشکر از Saleh Souzanchi-zoghal)
|
||||
- تصحیح ایراد فایل eot (با تشکر از Alireza Dabiri Nejad-alirdn)
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۷
|
||||
------------------------
|
||||
۲۶ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود فاصله ها
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۶
|
||||
------------------------
|
||||
۲۵ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود کرنینگ
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۵
|
||||
------------------------
|
||||
۲۲ اسفند ۱۳۹۴
|
||||
|
||||
- تصحیح نقاط ـت ـث
|
||||
- بهبود م
|
||||
- تصحیح ص
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۴
|
||||
------------------------
|
||||
۲۱ اسفند ۱۳۹۴
|
||||
|
||||
- بازنگری کلی در حالت ضخیم
|
||||
- بهبود م
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۳
|
||||
------------------------
|
||||
۲۱ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود هـ ـمـ مـ م ر ـر و ـو لا ـلا ـن ن ـق ق
|
||||
- بهبود حالات ط ص س
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۲
|
||||
------------------------
|
||||
۲۰ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود هـ
|
||||
- بهبود ـم در حالت ضخیم
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۱
|
||||
------------------------
|
||||
۱۷ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود نقاط
|
||||
- اصلاح ق ـق ـع
|
||||
- بهبود سرکش گاف در حالت ضخیم
|
||||
- اضافه شدن گلیف های ه همزه دار
|
||||
- اصلاح برخی اعراب
|
||||
|
||||
|
||||
نسخه ۲-کاندیدای انتشار ۰
|
||||
------------------------
|
||||
۱۶ اسفند ۱۳۹۴
|
||||
|
||||
- بزرگتر شدن کل فونت
|
||||
|
||||
|
||||
نسخه ۲-بتا-رفع اشکال ۵
|
||||
----------------------
|
||||
۱۵ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود هـ ـم
|
||||
- بهبود نقاط
|
||||
- بهبود نقطه در حالات خ
|
||||
- تصحیح ـفـ ـقـ
|
||||
- بهبود نقاط ـچ در حالت ضخیم
|
||||
|
||||
|
||||
نسخه ۲-بتا-رفع اشکال ۴
|
||||
----------------------
|
||||
۱۳ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود مـ ـمـ م سـ ـسـ هـ ـهـ و حالات ص
|
||||
|
||||
|
||||
نسخه ۲-بتا-رفع اشکال ۳
|
||||
----------------------
|
||||
۱۱ اسفند ۱۳۹۴
|
||||
|
||||
- تغییر شکل ـم و بهبود مـ ـمـ م ۶ همزه
|
||||
- تصحیح ـف در حالت ضخیم
|
||||
|
||||
|
||||
نسخه ۲-بتا-رفع اشکال ۲
|
||||
----------------------
|
||||
۸ اسفند ۱۳۹۴
|
||||
|
||||
- بهبود ح ـح حـ ـحـ بـ سـ س ق ن ـع ع ۷ ۸
|
||||
- بهبود نقطه ها
|
||||
|
||||
|
||||
نسخه ۲-بتا-رفع اشکال ۱
|
||||
----------------------
|
||||
۱۵ بهمن ۱۳۹۴
|
||||
|
||||
- اصلاح لا ـلا ی خ هـ طـ ـطـ ـق س ـسـ ـس سـ مـ ـمـ ـم طـ ـطـ
|
||||
- اصلاح مد
|
||||
- بازنگری در کرنینگ ارقام
|
||||
|
||||
|
||||
نسخه ۲-بتا-رفع اشکال ۰
|
||||
----------------------
|
||||
۱۲ دی ۱۳۹۴
|
||||
|
||||
- تصحیح اعراب
|
||||
- تصحیح کرنینگ
|
||||
- تصحیح گلیف ها و اندازه ها
|
||||
|
||||
|
||||
نسخه ۲-بتا
|
||||
----------
|
||||
۱۱ دی ۱۳۹۴
|
||||
|
||||
- تغییر کل سایز قلم
|
||||
- تغییر فاصله
|
||||
- تنظیم مجدد سایز ضخیم
|
||||
- تصحیح برخی گلیفها
|
||||
|
||||
نسخه ۲-آلفا
|
||||
-----------
|
||||
۲۹ آذر ۱۳۹۴
|
||||
|
||||
- تغییرات و باز طراحی گسترده در گلیفها
|
||||
|
||||
|
||||
نسخه ۱.۱۲.۱
|
||||
-----------
|
||||
۲۰ آذر ۱۳۹۴
|
||||
|
||||
- اصلاح اندازه ج
|
||||
- اصلاح سایز گلیف های علائم و ارقام در ضخیم
|
||||
- حذف ارقام لاتین
|
||||
- اصلاح د س ـسـ
|
||||
- اصلاحات جزئی در شکل گلیف ها
|
||||
|
||||
نسخه ۱.۱۲
|
||||
---------
|
||||
۲۰ آذر ۱۳۹۴
|
||||
|
||||
- اصلاحات زیاد بر روی گلیف ها و کرنینگ
|
||||
|
||||
نسخه ۱.۱۱
|
||||
---------
|
||||
۱۸ آذر ۱۳۹۴
|
||||
|
||||
- اصلاحات در فاصله ها
|
||||
- بهبود ح ـح ـع ع ـک ـکـ ف ق ۵
|
||||
|
||||
|
||||
نسخه ۱.۱۰.۸
|
||||
-----------
|
||||
۸ آذر ۱۳۹۴
|
||||
|
||||
- اصلاحاتی بر روی علائم و اندازه ها
|
||||
- اصلاح همزه
|
||||
|
||||
|
||||
نسخه ۱.۱۰.۷
|
||||
-----------
|
||||
۲۴ آبان ۱۳۹۴
|
||||
|
||||
- بهبود ـم
|
||||
|
||||
نسخه ۱.۱۰.۶
|
||||
-----------
|
||||
۲۱ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح گلیف های ـک ـکـ
|
||||
|
||||
نسخه ۱.۱۰.۵
|
||||
-----------
|
||||
۱۷ آبان ۱۳۹۴
|
||||
|
||||
- حذف عبارت کپی رایت اضافی
|
||||
|
||||
نسخه ۱.۱۰.۴
|
||||
-----------
|
||||
۱۵ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح مکان نقطه های پ چ
|
||||
|
||||
نسخه ۱.۱۰.۳
|
||||
-----------
|
||||
۱۵ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح دو نقطه و سه نقطه (نزدیکتر شدن به هم)
|
||||
- اصلاح ـم
|
||||
|
||||
نسخه ۱.۱۰.۲
|
||||
-----------
|
||||
۱۳ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح ـم
|
||||
|
||||
نسخه ۱.۱۰.۱
|
||||
-----------
|
||||
۱۳ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح گلیف ۶
|
||||
- اصلاح اعراب
|
||||
|
||||
نسخه ۱.۱۰
|
||||
---------
|
||||
۱۳ آبان ۱۳۹۴
|
||||
|
||||
-باز طراحی حرف ـم
|
||||
- اضافه شدن داده های هینتینگ با استفاده از نرم افزار ttfautohint (با تشکر از Salar Khalilzadeh-salarcode)
|
||||
|
||||
نسخه ۱.۹.۵
|
||||
----------
|
||||
۸ آبان ۱۳۹۴
|
||||
|
||||
- تصحیح حرف ی برای رندر بهتر در فایرفاکس
|
||||
|
||||
نسخه ۱.۹.۴
|
||||
----------
|
||||
۸ آبان ۱۳۹۴
|
||||
|
||||
- ضخیم تر شدن حرف ی به مقدار کم
|
||||
|
||||
نسخه ۱.۹.۳
|
||||
----------
|
||||
۷ آبان ۱۳۹۴
|
||||
|
||||
- باز طراحی حرف ی
|
||||
|
||||
نسخه ۱.۹.۲
|
||||
----------
|
||||
۷ آبان ۱۳۹۴
|
||||
|
||||
- تصحیح اعراب برخی حروف
|
||||
- تصحیح نقطه حرف ی عربی
|
||||
|
||||
نسخه ۱.۹.۱
|
||||
----------
|
||||
۷ آبان ۱۳۹۴
|
||||
|
||||
- اصلاحات مجدد در اندازه های فونت
|
||||
|
||||
نسخه ۱.۹
|
||||
--------
|
||||
۷ آبان ۱۳۹۴
|
||||
|
||||
- اصلاحات کلیدی و مهم در اندازه های فونت (با تشکر از A_O)
|
||||
|
||||
نسخه ۱.۸.۶
|
||||
----------
|
||||
۶ آبان ۱۳۹۴
|
||||
|
||||
- تصحیح مکان نقطه های سه تایی
|
||||
- تصحیح جهت حرف حـ
|
||||
|
||||
نسخه ۱.۸.۵
|
||||
----------
|
||||
۵ آبان ۱۳۹۴
|
||||
|
||||
- تصحیح مکان نقاط برخی حروف
|
||||
|
||||
نسخه ۱.۸.۴
|
||||
----------
|
||||
۵ آبان ۱۳۹۴
|
||||
|
||||
- تصحیح شکل عدد ۳
|
||||
- حذف برخی ردیف های lookup اضافه
|
||||
|
||||
نسخه ۱.۸.۳
|
||||
----------
|
||||
۴ آبان ۱۳۹۴
|
||||
|
||||
- تصحیح مشکل در هم رفتگی حروف متصل در حالت ضخیم
|
||||
|
||||
نسخه ۱.۸.۲
|
||||
----------
|
||||
۴ آبان ۱۳۹۴
|
||||
|
||||
- تصحیح مکان نقاط نویسههای چ و چـ
|
||||
|
||||
نسخه ۱.۸.۱
|
||||
----------
|
||||
۴ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح جزئی بر روی انتهای حروف کشیده برای نمایش بهتر و یا صاف تر
|
||||
- تصحیح مکان نقطه حروف یـ و ـيـ عربی
|
||||
|
||||
|
||||
نسخه ۱.۸
|
||||
--------
|
||||
۳ آبان ۱۳۹۴
|
||||
|
||||
- اضافه شدن نویسه های نیم فاصله و فاصله مجازی. (با تشکر از ahmadali shafiee-ahmadalli)
|
||||
- تصحیح مکان نقطه حرف ق
|
||||
|
||||
|
||||
نسخه ۱.۷.۸
|
||||
----------
|
||||
۲ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح سایز طول گلیف عدد صفر لاتین (طول اعداد یکسان باید باشد)
|
||||
|
||||
نسخه ۱.۷.۷
|
||||
----------
|
||||
۲ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح گلیف (ـ)
|
||||
|
||||
نسخه ۱.۷.۶
|
||||
----------
|
||||
۲ آبان ۱۳۹۴
|
||||
|
||||
- اصلاح حرف هـ
|
||||
- اصلاح مکان نقاط برخی حروف
|
||||
- اصلاحات بیشتر بر روی اعراب
|
||||
|
||||
نسخه ۱.۷.۵
|
||||
----------
|
||||
۱ آبان ۱۳۹۴
|
||||
|
||||
- اصلاحات مجدد اعراب با فواصل بهتر
|
||||
|
||||
نسخه ۱.۷.۴
|
||||
----------
|
||||
۱ آبان ۱۳۹۴
|
||||
|
||||
- اصلاحات فراوان اعراب
|
||||
|
||||
نسخه ۱.۷.۳
|
||||
----------
|
||||
۳۰ مهر ۱۳۹۴
|
||||
|
||||
- اصلاحات جزئی
|
||||
- اضافه شدن نسخه تمام اعداد فارسی
|
||||
|
||||
نسخه ۱.۷.۲
|
||||
----------
|
||||
۳۰ مهر ۱۳۹۴
|
||||
|
||||
- تصحیح گلیف های م و ـم
|
||||
|
||||
نسخه ۱.۷.۱
|
||||
----------
|
||||
۳۰ مهر ۱۳۹۴
|
||||
|
||||
- تصحیح اعراب
|
||||
- تصحیح حرف هـ
|
||||
- تصحیح حرف ـم
|
||||
|
||||
نسخه ۱.۷
|
||||
--------
|
||||
۳۰ مهر ۱۳۹۴
|
||||
|
||||
- باز طراحی گلیف ویرگول (با تشکر از Ebrahim Byagowi-ebraminio)
|
||||
- باز طراحی گلیف نقطه ویرگول
|
||||
- تصحیح اندازه و مکان اعراب کل حروف
|
||||
- تصحیح جزئی شکل حرف عـ
|
||||
|
||||
نسخه ۱.۶
|
||||
--------
|
||||
۲۸ مهر ۱۳۹۴
|
||||
|
||||
- تغییر شکل گلیف ممیز (با تشکر از Ebrahim Byagowi-ebraminio)
|
||||
- تنظیم مجدد فاصله های حروف در حالت ضخیم
|
||||
|
||||
نسخه ۱.۵.۳
|
||||
----------
|
||||
۲۷ مهر ۱۳۹۴
|
||||
|
||||
- اصلاحات کرنینگ
|
||||
|
||||
نسخه ۱.۵.۲
|
||||
----------
|
||||
۲۷ مهر ۱۳۹۴
|
||||
|
||||
- اصلاحات کرنینگ
|
||||
|
||||
نسخه ۱.۵.۱
|
||||
----------
|
||||
۲۷ مهر ۱۳۹۴
|
||||
|
||||
- برخی اصلاحات کرنینگ
|
||||
|
||||
نسخه ۱.۵
|
||||
----------
|
||||
۲۷ مهر ۱۳۹۴
|
||||
|
||||
- اضافه شدن کرنینگ برای حروف لازم
|
||||
|
||||
نسخه ۱.۴.۴
|
||||
----------
|
||||
۲۶ مهر ۱۳۹۴
|
||||
|
||||
- بهبود برخی از گلیف ها برای نمایش بهتر در فایرفاکس و اینترنت اکسپلورر (با تشکر از Salar Khalilzadeh-salarcode)
|
||||
|
||||
نسخه ۱.۴.۳
|
||||
----------
|
||||
۲۶ مهر ۱۳۹۴
|
||||
|
||||
- حل مشکل عدد ۹ در حالت نرمال
|
||||
- بهبود حرف ن در حالت ضخیم
|
||||
|
||||
نسخه ۱.۴.۲
|
||||
----------
|
||||
۲۶ مهر ۱۳۹۴
|
||||
|
||||
- اضافه شدن گلیف گیلکی دوم ۊ
|
||||
- برخی اصلاحات جزئي
|
||||
|
||||
نسخه ۱.۴.۱
|
||||
----------
|
||||
۲۵ مهر ۱۳۹۴
|
||||
|
||||
- تصحیح اندازه گلیف های غیر عربی از جمله اعداد
|
||||
- اضافه شدن فایل فونت فورج (با تشکر از Sasan Cooper-sasy360)
|
||||
|
||||
|
||||
نسخه ۱.۴
|
||||
--------
|
||||
۲۵ مهر ۱۳۹۴
|
||||
|
||||
- حرف ۊ از حروف گیلکی اضافه شد (با تشکر از ورگ v6rg).
|
||||
- مشکل اعراب حروف حل شد.
|
||||
|
||||
نسخه ۱.۳.۱
|
||||
----------
|
||||
۲۳ مهر ۱۳۹۴
|
||||
|
||||
- حل مشکل نمایش در مک. (با تشکر از Arvin Jenabi و Sajad Abedi)
|
||||
|
||||
نسخه ۱.۰
|
||||
--------
|
||||
۲۲ مهر ۱۳۹۴
|
||||
|
||||
- اولین نسخه
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
51
assets/common/fonts/vazir-font-v16.1.0/LICENSE
Normal file
51
assets/common/fonts/vazir-font-v16.1.0/LICENSE
Normal file
|
@ -0,0 +1,51 @@
|
|||
Changes by Saber Rastikerdar are in public domain.
|
||||
Glyphs and data from Roboto font are licensed under the Apache License, Version 2.0.
|
||||
|
||||
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
||||
|
||||
Bitstream Vera Fonts Copyright
|
||||
------------------------------
|
||||
|
||||
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
|
||||
a trademark of Bitstream, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of the fonts accompanying this license ("Fonts") and associated
|
||||
documentation files (the "Font Software"), to reproduce and distribute the
|
||||
Font Software, including without limitation the rights to use, copy, merge,
|
||||
publish, distribute, and/or sell copies of the Font Software, and to permit
|
||||
persons to whom the Font Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice shall
|
||||
be included in all copies of one or more of the Font Software typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in particular
|
||||
the designs of glyphs or characters in the Fonts may be modified and
|
||||
additional glyphs or characters may be added to the Fonts, only if the fonts
|
||||
are renamed to names not containing either the words "Bitstream" or the word
|
||||
"Vera".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts or Font
|
||||
Software that has been modified and is distributed under the "Bitstream
|
||||
Vera" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but no
|
||||
copy of one or more of the Font Software typefaces may be sold by itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
|
||||
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
|
||||
FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
|
||||
ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
|
||||
FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the names of Gnome, the Gnome
|
||||
Foundation, and Bitstream Inc., shall not be used in advertising or
|
||||
otherwise to promote the sale, use or other dealings in this Font Software
|
||||
without prior written authorization from the Gnome Foundation or Bitstream
|
||||
Inc., respectively. For further information, contact: fonts at gnome dot
|
||||
org.
|
111
assets/common/fonts/vazir-font-v16.1.0/README.md
Normal file
111
assets/common/fonts/vazir-font-v16.1.0/README.md
Normal file
|
@ -0,0 +1,111 @@
|
|||
# Vazir-Font
|
||||
A Persian (Farsi) Font
|
||||
|
||||
[](https://travis-ci.org/rastikerdar/vazir-font)
|
||||
[](https://badge.fury.io/js/vazir-font)
|
||||
|
||||
|
||||
<p dir="rtl">
|
||||
فونت فارسی وزیر <br />
|
||||
|
||||
<p dir="rtl"><a href="http://rastikerdar.github.io/vazir-font/">نمایش فونت</a></p>
|
||||
<p dir="rtl"><a href="https://github.com/rastikerdar/vazir-font/releases">صفحه دریافت (دانلود) بسته فونت شامل فایل های ttf,woff,eot</a></p> <br />
|
||||
|
||||
<p dir="rtl">متن نمونه:</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="./sample.png">
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<p dir="rtl"> با تشکر از برنامه <a href="https://fontforge.github.io">FontForge</a></p>
|
||||
<p dir="rtl"> بر مبنای فونت <a href="http://dejavu-fonts.org">DejaVu Sans 2.35</a></p>
|
||||
|
||||
</p>
|
||||
<p lang="fa" dir="rtl" align="right">
|
||||
نسخه های بدون حروف لاتین یا تمام ارقام فارسی درون بسته فشرده موجود میباشد.
|
||||
</p>
|
||||
<h1 dir="rtl">
|
||||
طریقه استفاده در صفحات وب:
|
||||
</h1>
|
||||
|
||||
<p dir="rtl">
|
||||
کد زیر را در قسمت style یا فایل css وارد نمایید:
|
||||
</p>
|
||||
|
||||
|
||||
```css
|
||||
@font-face {
|
||||
font-family: Vazir;
|
||||
src: url('Vazir.eot');
|
||||
src: url('Vazir.eot?#iefix') format('embedded-opentype'),
|
||||
url('Vazir.woff') format('woff'),
|
||||
url('Vazir.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Vazir;
|
||||
src: url('Vazir-Bold.eot');
|
||||
src: url('Vazir-Bold.eot?#iefix') format('embedded-opentype'),
|
||||
url('Vazir-Bold.woff') format('woff'),
|
||||
url('Vazir-Bold.ttf') format('truetype');
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Vazir;
|
||||
src: url('Vazir-Light.eot');
|
||||
src: url('Vazir-Light.eot?#iefix') format('embedded-opentype'),
|
||||
url('Vazir-Light.woff') format('woff'),
|
||||
url('Vazir-Light.ttf') format('truetype');
|
||||
font-weight: 300;
|
||||
}
|
||||
```
|
||||
|
||||
## Install
|
||||
|
||||
#### Download
|
||||
Grab the [latest release](https://github.com/rastikerdar/vazir-font/releases/latest) file.
|
||||
|
||||
#### Bower
|
||||
```
|
||||
bower install vazir-font --save
|
||||
```
|
||||
|
||||
#### npm
|
||||
```
|
||||
npm install vazir-font
|
||||
```
|
||||
Fonts will be copied to `npm_modules/vazir-font/dist` directory
|
||||
|
||||
#### CDN
|
||||
Link fonts from the [RawGit](https://rawgit.com) CDN:
|
||||
|
||||
```html
|
||||
<link href="https://cdn.rawgit.com/rastikerdar/vazir-font/v[X.Y.Z]/dist/font-face.css" rel="stylesheet" type="text/css" />
|
||||
```
|
||||
|
||||
Replace [X.Y.Z] with the latest version (e.g. 16.1.0) and integrate the font into your CSS:
|
||||
|
||||
```
|
||||
font-family: 'Vazir', sans-serif;
|
||||
```
|
||||
|
||||
#### Homebrew
|
||||
You can install the font on macOS machines by tapping the caskroom/fonts repo:
|
||||
|
||||
```shell
|
||||
brew tap caskroom/fonts
|
||||
brew install font-vazir
|
||||
```
|
||||
|
||||
#### Arch Linux
|
||||
Arch user's could use [vazir-fonts](https://aur.archlinux.org/packages/vazir-fonts/) package from [AUR](https://aur.archlinux.org/) repository to install vazir font.
|
||||
Use your favourite [AUR helper](https://wiki.archlinux.org/index.php/AUR_helpers) like pacaur or yaourt for installing package:
|
||||
|
||||
```shell
|
||||
pacaur -S vazir-fonts
|
||||
```
|
||||
|
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.eot
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.eot
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.ttf
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.woff
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.woff
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.woff2
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Bold.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.eot
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.eot
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.ttf
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.woff
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.woff
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.woff2
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Light.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.eot
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.eot
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.ttf
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.woff
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.woff
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.woff2
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Medium.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.eot
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.eot
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.ttf
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.woff
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.woff
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.woff2
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir-Thin.woff2
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.eot
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.eot
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.ttf
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.ttf
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.woff
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.woff
Normal file
Binary file not shown.
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.woff2
Normal file
BIN
assets/common/fonts/vazir-font-v16.1.0/Vazir.woff2
Normal file
Binary file not shown.
|
@ -1,11 +1,11 @@
|
|||
@font-face {
|
||||
font-family: IRANSansX;
|
||||
font-family: var(--font);
|
||||
src: url("../fonts/iransans/woff/IRANSansXFaNum-Bold.woff") format("woff"),
|
||||
url("../fonts/iransans/woff2/IRANSansXFaNum-Bold.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: IRANSansX;
|
||||
font-family: var(--font);
|
||||
src: url("../fonts/iransans/woff/IRANSansXFaNum-Regular.woff") format("woff"),
|
||||
url("../fonts/iransans/woff2/IRANSansXFaNum-Regular.woff2") format("woff2");
|
||||
}
|
7
assets/common/scss/_estedad.scss
Normal file
7
assets/common/scss/_estedad.scss
Normal file
|
@ -0,0 +1,7 @@
|
|||
@font-face {
|
||||
font-family: estedad;
|
||||
src: url("../fonts/Estedad-v5.0/Estedad.ttf");
|
||||
src: url("../fonts/Estedad-v5.0/Estedad.woff2") format("woff2"),
|
||||
url("../fonts/Estedad-v5.0/Estedad.ttf") format("truetype");
|
||||
font-weight: normal;
|
||||
}
|
|
@ -1,2 +1,3 @@
|
|||
@import "../fonts/tavasi/style";
|
||||
@import "../img/icomoon/style";
|
||||
@import "./sahel";
|
||||
|
|
10
assets/common/scss/_sahel-single-font-weight.scss
Normal file
10
assets/common/scss/_sahel-single-font-weight.scss
Normal file
|
@ -0,0 +1,10 @@
|
|||
@font-face {
|
||||
font-family: sahel;
|
||||
src: url("../fonts/sahel/Farsi-Digits/Sahel-FD.eot");
|
||||
src: url("../fonts/sahel/Farsi-Digits/Sahel-FD.eot?#iefix")
|
||||
format("embedded-opentype"),
|
||||
url("../fonts/sahel/Farsi-Digits/Sahel-FD.woff2") format("woff2"),
|
||||
url("../fonts/sahel/Farsi-Digits/Sahel-FD.woff") format("woff"),
|
||||
url("../fonts/sahel/Farsi-Digits/Sahel-FD.ttf") format("truetype");
|
||||
font-weight: normal;
|
||||
}
|
10
assets/common/scss/_vazir.scss
Normal file
10
assets/common/scss/_vazir.scss
Normal file
|
@ -0,0 +1,10 @@
|
|||
@font-face {
|
||||
font-family: vazir;
|
||||
src: url("../fonts/vazir-font-v16.1.0/Farsi-Digits-Without-Latin/Vazir-FD-WOL.ttf");
|
||||
src: url("../fonts/vazir-font-v16.1.0/Farsi-Digits-Without-Latin/Vazir-FD-WOL.eot?#iefix")
|
||||
format("embedded-opentype"),
|
||||
url("../fonts/vazir-font-v16.1.0/Farsi-Digits-Without-Latin/Vazir-FD-WOL.woff2") format("woff2"),
|
||||
url("../fonts/vazir-font-v16.1.0/Farsi-Digits-Without-Latin/Vazir-FD-WOL.woff") format("woff"),
|
||||
url("../fonts/vazir-font-v16.1.0/Farsi-Digits-Without-Latin/Vazir-FD-WOL.ttf") format("truetype");
|
||||
font-weight: normal;
|
||||
}
|
46
assets/common/vendors/counter/counter.js
vendored
46
assets/common/vendors/counter/counter.js
vendored
|
@ -1,46 +0,0 @@
|
|||
(function ($) {
|
||||
$.fn.countTo = function (options) {
|
||||
// merge the default plugin settings with the custom options
|
||||
options = $.extend({}, $.fn.countTo.defaults, options || {});
|
||||
|
||||
// how many times to update the value, and how much to increment the value on each update
|
||||
var loops = Math.ceil(options.speed / options.refreshInterval),
|
||||
increment = (options.to - options.from) / loops;
|
||||
|
||||
return $(this).each(function () {
|
||||
var _this = this,
|
||||
loopCount = 0,
|
||||
value = options.from,
|
||||
interval = setInterval(updateTimer, options.refreshInterval);
|
||||
|
||||
function updateTimer() {
|
||||
value += increment;
|
||||
loopCount++;
|
||||
$(_this).html(value.toFixed(options.decimals));
|
||||
|
||||
if (typeof options.onUpdate == "function") {
|
||||
options.onUpdate.call(_this, value);
|
||||
}
|
||||
|
||||
if (loopCount >= loops) {
|
||||
clearInterval(interval);
|
||||
value = options.to;
|
||||
|
||||
if (typeof options.onComplete == "function") {
|
||||
options.onComplete.call(_this, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.countTo.defaults = {
|
||||
from: 0, // the number the element should start at
|
||||
to: 100, // the number the element should end at
|
||||
speed: 1000, // how long it should take to count between the target numbers
|
||||
refreshInterval: 100, // how often the element should be updated
|
||||
decimals: 0, // the number of decimal places to show
|
||||
onUpdate: null, // callback method for every time the element is updated,
|
||||
onComplete: null, // callback method for when the element finishes updating
|
||||
};
|
||||
})(jQuery);
|
|
@ -43,8 +43,8 @@
|
|||
bottom: 0;
|
||||
}
|
||||
.inner-wrapper {
|
||||
max-width: 47.5em;
|
||||
margin: 0 auto;
|
||||
// max-width: 47.5em;
|
||||
// margin: 0 auto;
|
||||
text-align: center;
|
||||
|
||||
.title {
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
}
|
||||
@media only screen and (min-width: 768px) and (max-width: 991.98px) {
|
||||
.search-section .top-content .inner-wrapper {
|
||||
padding-top: 10em;
|
||||
// padding-top: 10em;
|
||||
}
|
||||
/* استایلهای مربوط به اندازههای بین 768 تا 991 پیکسل */
|
||||
}
|
||||
|
|
|
@ -5,9 +5,8 @@
|
|||
<header>
|
||||
<majles-navbar></majles-navbar>
|
||||
</header>
|
||||
|
||||
<div class="inner-wrapper">
|
||||
<div class="d-md-none d-lg-block">
|
||||
<div class="inner-wrapper d-flex flex-column col-12">
|
||||
<div class="">
|
||||
<img
|
||||
src="assets/majles/img/logo_200x200.png"
|
||||
:alt="appLongTitle()"
|
||||
|
@ -19,44 +18,32 @@
|
|||
<h1 class="sub-title">
|
||||
{{ title2 }}<span style="font-size: 1.5rem">{{ title3 }}</span>
|
||||
</h1>
|
||||
<form
|
||||
class="ms-search-form px-3"
|
||||
role="search"
|
||||
@submit.prevent="searchNavigateList"
|
||||
>
|
||||
<div class="input-group mb-5" dir="ltr">
|
||||
<div class="input-group-prepend">
|
||||
<button
|
||||
dir="rtl"
|
||||
class="btn"
|
||||
type="button"
|
||||
id="button-addon2"
|
||||
@click.prevent="searchNavigateList()"
|
||||
>
|
||||
جستجو
|
||||
<span class="tavasi tavasi-Component-198--1"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<input
|
||||
v-focus
|
||||
class="form-control"
|
||||
ref="search-input"
|
||||
dir="rtl"
|
||||
v-model.trim="searchText"
|
||||
type="search"
|
||||
id="search-query"
|
||||
placeholder="جستجو در قوانین ..."
|
||||
name="search-query"
|
||||
size="60"
|
||||
@keyup.enter="searchNavigateList"
|
||||
/>
|
||||
</div>
|
||||
</form>
|
||||
<div class=" d-flex justify-content-center">
|
||||
<form
|
||||
class="ms-search-form px-3 col-12 col-sm-8 col-xl-6"
|
||||
role="search"
|
||||
@submit.prevent="searchNavigateList"
|
||||
>
|
||||
<auto-complation
|
||||
dir="ltr"
|
||||
contentKey="qasection"
|
||||
:showAppend="false"
|
||||
:showPrepend="true"
|
||||
:showAppendSearchButton="false"
|
||||
@onSearchStart="searchNavigateList"
|
||||
@on-search-navigate-list="searchNavigateList"
|
||||
:placeholder="'جستجو در هزاران محتوای قوانین'"
|
||||
ref="autoComplationRef"
|
||||
></auto-complation>
|
||||
<!-- :listAutocomplate="listAutocomplate" -->
|
||||
<!-- @selectAutocomplate2="selectAutocomplate2" -->
|
||||
<!-- </div> -->
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="center-content">
|
||||
<!-- <my-counter-list title=""></my-counter-list> -->
|
||||
<my-counter-list></my-counter-list>
|
||||
</div>
|
||||
<div class="footer-content">
|
||||
<div class="container-fluid">
|
||||
|
@ -86,7 +73,7 @@
|
|||
<div class="col-sm-6 mb-2 mb-sm-0 col-md mb-sm-2 mb-md-0">
|
||||
<div class="link-item-container">
|
||||
<NuxtLink
|
||||
:to="urlResolver('qq308235')"
|
||||
:to="urlResolver('qq308235')"
|
||||
target="_blank"
|
||||
class="btn link-item"
|
||||
>
|
||||
|
@ -106,7 +93,7 @@
|
|||
<div class="col-sm-6 mb-2 mb-sm-0 col-md">
|
||||
<div class="link-item-container">
|
||||
<NuxtLink
|
||||
:to="urlResolver('qq38162')"
|
||||
:to="urlResolver('qq38162')"
|
||||
target="_blank"
|
||||
class="btn link-item"
|
||||
>
|
||||
|
@ -126,7 +113,7 @@
|
|||
<div class="col-sm-6 mb-2 mb-sm-0 col-md">
|
||||
<div class="link-item-container">
|
||||
<NuxtLink
|
||||
:to="urlResolver('qq233930')"
|
||||
:to="urlResolver('qq233930')"
|
||||
target="_blank"
|
||||
class="btn link-item"
|
||||
>
|
||||
|
@ -270,6 +257,18 @@ export default {
|
|||
// return routeData.href;
|
||||
},
|
||||
},
|
||||
components: {
|
||||
MyCounterList: defineAsyncComponent(() =>
|
||||
import("@components/other/MyCounterList.vue")
|
||||
),
|
||||
AutoComplation: defineAsyncComponent(() =>
|
||||
import("@components/global/AutoComplation.vue")
|
||||
),
|
||||
|
||||
// Navbar: () => import("@dashboard/majles/components/Navbar"),
|
||||
// MySystem: () => import("@dashboard/default/pages/MySystem"),
|
||||
// MyCircleProgress: () => import("@components/MyCircleProgress"),
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
|
@ -286,6 +285,14 @@ export default {
|
|||
// .main-page__content{
|
||||
// margin-right: 0px !important;
|
||||
// }
|
||||
.ms-search-form {
|
||||
.input-group {
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
.subtitle {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
.dropdown-menu {
|
||||
float: right;
|
||||
min-width: 13rem;
|
||||
|
|
561
components/global/AutoComplation.vue
Normal file
561
components/global/AutoComplation.vue
Normal file
|
@ -0,0 +1,561 @@
|
|||
<template>
|
||||
<div
|
||||
class="input-group"
|
||||
@keyup="keyupdiv"
|
||||
:style="{
|
||||
showAppend: { 'box-shadow': '0 1px 3px rgba(23, 23, 23, 0.24)' },
|
||||
}"
|
||||
>
|
||||
<div class="input-group-prepend">
|
||||
<button
|
||||
v-if="showPrepend"
|
||||
dir="rtl"
|
||||
class="btn d-flex align-items-center"
|
||||
type="button"
|
||||
id="button-addon2"
|
||||
@click="searchNavigateList()"
|
||||
>
|
||||
جستجو
|
||||
<span class="tavasi tavasi-Component-198--1"></span>
|
||||
</button>
|
||||
<span v-else style="opacity: 0">xxx</span>
|
||||
</div>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
v-model="localTextSearch"
|
||||
@click="showHisory()"
|
||||
@keyup.enter="prevSearchStart"
|
||||
@keyup="toggleAutocomplete"
|
||||
@keydown="onKeyDown()"
|
||||
class="form-control"
|
||||
id="search"
|
||||
:placeholder="placeholder"
|
||||
autocomplete="off"
|
||||
ref="searchinput"
|
||||
@focus="setInputFocus()"
|
||||
@blur="inputfocused = false"
|
||||
v-focus
|
||||
/>
|
||||
<div :class="[showAppend ? 'input-group-text' : 'input-group-append']">
|
||||
<client-only>
|
||||
<template v-if="showAppend">
|
||||
<button
|
||||
v-tooltip="'جستجو در خاصیت(فیلد) ویژه'"
|
||||
class="btn dropdown-toggle dropdown-toggle-color rounded-0"
|
||||
type="button"
|
||||
data-bs-toggle="dropdown"
|
||||
aria-haspopup="true"
|
||||
aria-expanded="false"
|
||||
id="dropdownMenuButton12"
|
||||
>
|
||||
<span class="navItemlabel">
|
||||
{{ domainActiveGetter?.label }}
|
||||
</span>
|
||||
</button>
|
||||
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton12">
|
||||
<button
|
||||
v-for="(navItem, index) in searchDomain"
|
||||
:key="index"
|
||||
type="button"
|
||||
class="dropdown-item"
|
||||
@click.prevent="setDomainField(navItem)"
|
||||
>
|
||||
{{ navItem.label }}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
</client-only>
|
||||
|
||||
<button
|
||||
v-if="showAppendSearchButton"
|
||||
v-tooltip="'جستجو در خاصیت(فیلد) ویژه'"
|
||||
@click.prevent="prevSearchStart()"
|
||||
class="btn btn-primary search-icon"
|
||||
>
|
||||
<svg class="icon icon-Component-198--1">
|
||||
<use xlink:href="#icon-Component-198--1"></use>
|
||||
</svg>
|
||||
<!-- <NuxtImg src="@assets/common/img/searchmajles.svg" alt="" /> -->
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="inputPopupState == 3 && localListAutocomplate.length"
|
||||
class="search-page__result firefox-scrollbar"
|
||||
:class="{
|
||||
show: localListAutocomplate.length,
|
||||
}"
|
||||
>
|
||||
<!-- v-click-outside="onClickOutside" -->
|
||||
<client-only>
|
||||
<ul ref="auto_complate_ul">
|
||||
<li v-for="(item, i) in localListAutocomplate" :key="i" :value="i">
|
||||
<a @click.prevent="selectAutocomplate2(item)">
|
||||
<span
|
||||
class="text__14"
|
||||
v-html="getHighlightAutocomplate(item)"
|
||||
></span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</client-only>
|
||||
</div>
|
||||
|
||||
<div v-if="inputPopupState == 1" class="search-page__result show">
|
||||
<!-- v-click-outside="onClickOutside" -->
|
||||
<client-only>
|
||||
<template v-if="historySearch.length">
|
||||
<div>
|
||||
<div class="scrollbar">
|
||||
<ul ref="his_ul">
|
||||
<li v-for="(item, i) in historySearch" :key="i" :data-key="i">
|
||||
<a @click.prevent="selectHistorySearch(item)">
|
||||
<NuxtImg
|
||||
src="assets/common/img/Component 359 – 2.svg"
|
||||
alt=""
|
||||
/>
|
||||
<span class="text__14">{{ item }}</span>
|
||||
</a>
|
||||
<a @click="removeHistorySearch(i)" class="close">
|
||||
<svg class="icon icon-Component-294--1">
|
||||
<use xlink:href="#icon-Component-294--1"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="scrollbar">
|
||||
<ul ref="">
|
||||
<li>
|
||||
<p class="m-0 text__light">
|
||||
<NuxtImg
|
||||
src="assets/common/img/Component 359 – 2.svg"
|
||||
alt=""
|
||||
/>
|
||||
<span class="text__14"> تاریخچه جستجو خالی می باشد </span>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
</client-only>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from "pinia";
|
||||
import searchApi from "@apis/searchApi.js";
|
||||
import { useCommonStore } from "@stores/commonStore";
|
||||
|
||||
// Vue.directive("click-outside", {
|
||||
// bind(el, binding, vnode) {
|
||||
// el.clickOutsideEvent = (event) => {
|
||||
// if (!(el === event.target || el.contains(event.target))) {
|
||||
// vnode.context[binding.expression](event);
|
||||
// }
|
||||
// };
|
||||
// document.body.addEventListener("click", el.clickOutsideEvent);
|
||||
// },
|
||||
// unbind(el) {
|
||||
// document.body.removeEventListener("click", el.clickOutsideEvent);
|
||||
// },
|
||||
// });
|
||||
|
||||
export default {
|
||||
props: {
|
||||
placeholder: {
|
||||
default: "جستجو در هزاران محتوای قوانین و مقرارت",
|
||||
},
|
||||
contentKey: {
|
||||
default: "qasection",
|
||||
},
|
||||
entityTheme: {
|
||||
default: false,
|
||||
},
|
||||
showAppendSearchButton: {
|
||||
default: true,
|
||||
},
|
||||
showPrepend: {
|
||||
default: false,
|
||||
},
|
||||
showAppend: {
|
||||
default: true,
|
||||
},
|
||||
textSearch: {
|
||||
default: "",
|
||||
},
|
||||
modeInit: {
|
||||
default: 0,
|
||||
},
|
||||
searchDomain: {
|
||||
default() {
|
||||
return [];
|
||||
},
|
||||
},
|
||||
listAutocomplate: {
|
||||
default() {
|
||||
return [];
|
||||
},
|
||||
},
|
||||
},
|
||||
emits: ["getAutoComplateList"],
|
||||
watch: {
|
||||
modeInit(newVal = 1) {
|
||||
this.mode = newVal;
|
||||
},
|
||||
textSearch(newVal) {
|
||||
this.localTextSearch = newVal;
|
||||
},
|
||||
},
|
||||
beforeMount() {
|
||||
// this.inputPopupState = this.inputPopupState;
|
||||
},
|
||||
mounted() {
|
||||
this.localTextSearch = this.textSearch;
|
||||
|
||||
if (window.localStorage.getItem([this.historySearchRecent])) {
|
||||
try {
|
||||
this.historySearch = JSON.parse(
|
||||
window.localStorage.getItem([this.historySearchRecent])
|
||||
);
|
||||
} catch (e) {
|
||||
window.localStorage.removeItem([this.historySearchRecent]);
|
||||
}
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
window.removeEventListener("resize", this.handleResize);
|
||||
window.removeEventListener("load", this.handleResize);
|
||||
document.removeEventListener("click", this.handleClickOutside);
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
localListAutocomplate: [],
|
||||
typingTimer: undefined,
|
||||
doneTypingInterval: 800,
|
||||
localTextSearch: "",
|
||||
historySearch: [],
|
||||
|
||||
inputPopupState: 0,
|
||||
mode: 1,
|
||||
tagLiSelected: null,
|
||||
inputfocused: false,
|
||||
isLastKeyCodeArrow: false,
|
||||
historySearchRecent: "historysearchrecent",
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(useCommonStore, [
|
||||
"domainActiveGetter",
|
||||
"searchActiveTabGetter",
|
||||
"searchSchemaGetter",
|
||||
"searchSynonymTitleGetter",
|
||||
]),
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* تنظیم آیتم انتخاب شده و شروع جستجو.
|
||||
* @param {Object} navItem - آیتم انتخابشده.
|
||||
*/
|
||||
setDomainField(navItem) {
|
||||
this.$emit("onSetDomainField", navItem);
|
||||
// this.prevSearchStart();
|
||||
},
|
||||
async getAutoComplateList() {
|
||||
this.localListAutocomplate = [];
|
||||
if (this.localTextSearch == "") return;
|
||||
|
||||
let index_key = this.contentKey;
|
||||
if (!index_key) return;
|
||||
|
||||
let url = searchApi.search.autoComplate;
|
||||
|
||||
url = url.replace("{{appname}}", buildName());
|
||||
url = url.replace("{{index_key}}", index_key);
|
||||
url = url.replace("{{filter}}", "q=" + this.localTextSearch);
|
||||
|
||||
try {
|
||||
const { $api } = useNuxtApp();
|
||||
const response = await $api(url, {
|
||||
baseURL: repoUrl(),
|
||||
});
|
||||
|
||||
this.localListAutocomplate = response.hits?.hits;
|
||||
this.inputPopupState = 3;
|
||||
} catch (err) {}
|
||||
},
|
||||
|
||||
onKeyDown() {
|
||||
clearTimeout(this.typingTimer);
|
||||
this.typingTimer = undefined;
|
||||
},
|
||||
/**
|
||||
* کنترل تایمر تکمیل خودکار و ارسال کوئری.
|
||||
* تایمر فعلی را پاک میکند و یک تایمر جدید با یک تاخیر مشخص تنظیم میکند تا کوئری را ارسال کند.
|
||||
*/
|
||||
toggleAutocomplete(event) {
|
||||
// برای کلید حرکت پایین درخواست اضافی نرود
|
||||
if (
|
||||
event.keyCode === 40 ||
|
||||
event.keyCode === 38 ||
|
||||
event.keyCode === 13
|
||||
) {
|
||||
this.isLastKeyCodeArrow = event.keyCode === 40 || event.keyCode === 38;
|
||||
return;
|
||||
}
|
||||
|
||||
this.isLastKeyCodeArrow = false;
|
||||
|
||||
if (!this.inputfocused && this.inputPopupState === 3) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.typingTimer) {
|
||||
clearTimeout(this.typingTimer);
|
||||
this.typingTimer = undefined;
|
||||
} else {
|
||||
this.typingTimer = setTimeout(() => {
|
||||
this.getAutoComplateList();
|
||||
this.typingTimer = undefined;
|
||||
}, this.doneTypingInterval);
|
||||
}
|
||||
},
|
||||
|
||||
setInputFocus() {
|
||||
this.inputfocused = true;
|
||||
// this.inputPopupfocused=false
|
||||
},
|
||||
/**
|
||||
* شروع جستجو را کنترل میکند.
|
||||
* @event prevSearchStart
|
||||
*/
|
||||
prevSearchStart(event) {
|
||||
if (
|
||||
this.isLastKeyCodeArrow &&
|
||||
event.keyCode === 13 &&
|
||||
this.inputPopupState != 0
|
||||
) {
|
||||
this.selectAutocomplate2();
|
||||
this.isLastKeyCodeArrow = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this.tagLiSelected = null;
|
||||
this.inputPopupState = 0;
|
||||
this.addHistorySearch(this.localTextSearch);
|
||||
|
||||
let tt = myEncodeQuery(this.localTextSearch);
|
||||
this.$emit("onSearchStart", tt);
|
||||
// this.searchStart(tt);
|
||||
},
|
||||
/**
|
||||
*نمایش سابقه جستجو.
|
||||
*/
|
||||
showHisory() {
|
||||
setTimeout(() => {
|
||||
if (this.localTextSearch == "") this.inputPopupState = 1;
|
||||
else {
|
||||
this.inputPopupState = 0;
|
||||
this.tagLiSelected = null;
|
||||
}
|
||||
}, 100);
|
||||
},
|
||||
/**
|
||||
* کنترل کلیکهای خارج از المان.
|
||||
*/
|
||||
keyupdiv(event) {
|
||||
// 13:enter
|
||||
// 8:backspace
|
||||
if (this.inputfocused == false) return;
|
||||
if (this.inputPopupState == 0 || this.inputPopupState == 2) return;
|
||||
var el = "";
|
||||
el =
|
||||
this.inputPopupState == 1
|
||||
? this.$refs["his_ul"]
|
||||
: this.$refs["auto_complate_ul"];
|
||||
|
||||
if (!el || !el.firstChild) return;
|
||||
|
||||
const selectItem = (item) => {
|
||||
this.tagLiSelected = item;
|
||||
this.tagLiSelected?.classList.add("selected");
|
||||
this.tagLiSelected?.focus();
|
||||
};
|
||||
|
||||
// 40: arrow down
|
||||
// 38: arrow up
|
||||
if (this.inputfocused == true && event.keyCode === 40) {
|
||||
if (this.tagLiSelected) {
|
||||
this.tagLiSelected?.classList.remove("selected");
|
||||
const next = this.tagLiSelected?.nextSibling || el.firstChild;
|
||||
selectItem(next);
|
||||
} else {
|
||||
selectItem(el?.firstChild);
|
||||
}
|
||||
} else if (this.inputfocused == true && event.keyCode === 38) {
|
||||
if (this.tagLiSelected) {
|
||||
this.tagLiSelected?.classList.remove("selected");
|
||||
const prev = this.tagLiSelected?.previousSibling || el.lastChild;
|
||||
selectItem(prev);
|
||||
} else {
|
||||
selectItem(el?.lastChild);
|
||||
}
|
||||
}
|
||||
// 46: delete
|
||||
else if (this.inputfocused == true && event.keyCode === 46) {
|
||||
let index = this.tagLiSelected?.getAttribute("data-key");
|
||||
|
||||
this.removeHistorySearch(index);
|
||||
}
|
||||
},
|
||||
onClickOutside() {
|
||||
if (this.inputPopupState == 1 || this.inputPopupState == 3) {
|
||||
this.inputPopupState = 0;
|
||||
this.tagLiSelected = null;
|
||||
}
|
||||
},
|
||||
selectAutocomplate(item) {
|
||||
this.tagLiSelected = null;
|
||||
this.inputPopupState = 0;
|
||||
this.localTextSearch = item;
|
||||
|
||||
this.$emit("onSearchStart", this.localTextSearch);
|
||||
// this.$emit("onSearchStart", {
|
||||
// textSearch: this.localTextSearch,
|
||||
// searchItem: item,
|
||||
// });
|
||||
},
|
||||
|
||||
selectHistorySearch(item) {
|
||||
this.localTextSearch = item;
|
||||
this.$emit("onSearchStart", this.localTextSearch);
|
||||
},
|
||||
|
||||
removeHistorySearch(x) {
|
||||
this.tagLiSelected = null;
|
||||
this.historySearch.splice(x, 1);
|
||||
this.saveHistorySearch();
|
||||
},
|
||||
saveHistorySearch() {
|
||||
const parsed = JSON.stringify(this.historySearch);
|
||||
window.localStorage.setItem([this.historySearchRecent], parsed);
|
||||
},
|
||||
getHighlightAutocomplate(item) {
|
||||
if (!item) return "";
|
||||
|
||||
let html = "";
|
||||
|
||||
let key = "title";
|
||||
if (this.contentKey == "qasection" || this.contentKey == "rgsection") {
|
||||
key = "qanon_title";
|
||||
if (item?.highlight[key]) html = item.highlight[key][0];
|
||||
if (!html) {
|
||||
let key1 = key + ".ph";
|
||||
if (item?.highlight[key1]) html = item.highlight[key1][0];
|
||||
}
|
||||
|
||||
if (!html) {
|
||||
let key1 = key + ".fa";
|
||||
if (item?.highlight[key1]) html = item.highlight[key1][0];
|
||||
}
|
||||
|
||||
let key2 = "ts_date";
|
||||
if (item?._source[key2]) {
|
||||
html += `<span style="color: #a7a098;"> - تاریخ: ${item._source[key2]}</span>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.contentKey == "sanad") {
|
||||
Object.values(item?.highlight).forEach((element, index) => {
|
||||
html += element[0];
|
||||
});
|
||||
}
|
||||
|
||||
return html;
|
||||
},
|
||||
|
||||
addHistorySearch(newSearch = "") {
|
||||
if (newSearch == "") {
|
||||
return;
|
||||
}
|
||||
var index = this.historySearch.indexOf(newSearch);
|
||||
if (index != -1) {
|
||||
this.historySearch.splice(index, 1);
|
||||
}
|
||||
|
||||
this.historySearch.unshift(newSearch);
|
||||
this.saveHistorySearch();
|
||||
},
|
||||
saveHistorySearch() {
|
||||
const parsed = JSON.stringify(this.historySearch);
|
||||
window.localStorage.setItem([this.historySearchRecent], parsed);
|
||||
},
|
||||
|
||||
selectAutocomplate2(item) {
|
||||
if (!item) {
|
||||
if (this.localListAutocomplate.length) {
|
||||
item = this.localListAutocomplate[this.tagLiSelected?.value];
|
||||
}
|
||||
}
|
||||
|
||||
let key = "title";
|
||||
if (this.contentKey == "qasection" || this.contentKey == "rgsection")
|
||||
key = "qanon_title";
|
||||
|
||||
this.inputfocused = false;
|
||||
this.searchinput?.blur();
|
||||
this.localTextSearch = item?._source[key];
|
||||
|
||||
this.$emit("onSearchStart", this.localTextSearch);
|
||||
// this.$emit("onSearchStart", {
|
||||
// textSearch: this.localTextSearch,
|
||||
// searchItem: item,
|
||||
// });
|
||||
|
||||
if (!item) {
|
||||
this.localTextSearch = this.tagLiSelected?.innerText;
|
||||
this.addHistorySearch(this.localTextSearch);
|
||||
|
||||
let tt = myEncodeQuery(this.localTextSearch);
|
||||
|
||||
this.$emit("onSearchStart", tt);
|
||||
// this.$emit("onSearchStart", { textSearch: tt, searchItem: item });
|
||||
}
|
||||
|
||||
this.inputPopupState = 0;
|
||||
this.tagLiSelected = null;
|
||||
},
|
||||
searchNavigateList() {
|
||||
let tt = myEncodeQuery(this.localTextSearch);
|
||||
this.$emit("on-search-navigate-list", tt);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.entityTheme {
|
||||
.btn {
|
||||
border-radius: 0.5rem 0 0 0.5rem !important;
|
||||
}
|
||||
}
|
||||
.close {
|
||||
svg {
|
||||
font-size: 0.5em;
|
||||
&:hover {
|
||||
color: #ef4444 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.search-page__result.show {
|
||||
border-radius: 0.5em !important;
|
||||
}
|
||||
.input-group-text {
|
||||
background-color: #fff !important;
|
||||
}
|
||||
</style>
|
|
@ -54,7 +54,7 @@
|
|||
|
||||
<script>
|
||||
import { mapState } from "pinia";
|
||||
import { useCommonStore } from "@stores/entityStore";
|
||||
import { useCommonStore } from "@stores/commonStore";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
|
|
192
components/global/SwitchComponent copy.vue
Normal file
192
components/global/SwitchComponent copy.vue
Normal file
|
@ -0,0 +1,192 @@
|
|||
<template>
|
||||
<div class="form-group" :key="$attrs.name">
|
||||
<div class="d-flex switch-main">
|
||||
<div class="custom-control custom-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
@change="updateMode"
|
||||
:id="$attrs.name"
|
||||
:name="$attrs.name"
|
||||
v-model="textValue"
|
||||
:true-value="true"
|
||||
:false-value="false"
|
||||
class="custom-control-input"
|
||||
/>
|
||||
|
||||
<label class="custom-control-label" :for="$attrs.name">{{
|
||||
$t(text1)
|
||||
}}</label>
|
||||
</div>
|
||||
<label class="mb-0 mr-2 text-2" :for="$attrs.name">{{ $t(text2) }}</label>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import formBuilderMixin from "~/extensions/formBuilderExtension.js";
|
||||
|
||||
/**
|
||||
* @vue-prop {string} [texts2 = Statistics] - متنی که برای نمایش به عنوان "ChartList" استفاده میشود.
|
||||
* @vue-prop {string} [texts1 = Normal] - متنی که برای نمایش به عنوان "Chart" استفاده میشود.
|
||||
*
|
||||
* @vue-data {boolean} [textValue = true] - حالت انتخاب شده ی سوئیچ در حالت true فعال و در حالت false غیر فعال می باشد
|
||||
|
||||
* @vue-data {String} [text1 = ""] - متن اول که در برچسب اول نمایش داده میشود.
|
||||
* @vue-data {String} [text2 = ""] - متن دوم که در برچسب دوم نمایش داده میشود.
|
||||
*/
|
||||
export default {
|
||||
extends: formBuilderMixin,
|
||||
// props: ["texts1", "texts2"],
|
||||
props: {
|
||||
texts2: {
|
||||
default: "Statistics",
|
||||
},
|
||||
texts1: {
|
||||
default: "Normal",
|
||||
},
|
||||
value: {
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
textValue: true,
|
||||
text1: "Chart",
|
||||
text2: "ChartList",
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.textValue = this.value;
|
||||
this.updateText();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* متنهای پراپها را به متغیرهای اختصاص میدهد.
|
||||
* اگر texts1 تعریف شده باشد، مقادیر text1 و text2 را به ترتیب با texts1 و texts2 جایگزین میکند.
|
||||
*/
|
||||
updateText() {
|
||||
if (this.texts1 !== undefined) {
|
||||
this.text1 = this.texts1;
|
||||
this.text2 = this.texts2;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* رویداد تغییر وضعیت چکباکس را مدیریت میکند.
|
||||
* مقدار جدید textValue را از طریق رویداد "change-mode" به والد کامپوننت ارسال میکند.
|
||||
*/
|
||||
updateMode() {
|
||||
this.$emit("change-mode", this.textValue);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.custom-control-label {
|
||||
white-space: nowrap;
|
||||
&::before {
|
||||
border-color: var(--primary-color) !important ;
|
||||
// background-color: var(--primary-color)!important;
|
||||
}
|
||||
}
|
||||
.entity-text-switch {
|
||||
.switch-main {
|
||||
justify-content: end;
|
||||
margin-left: 3em;
|
||||
}
|
||||
.custom-control-input {
|
||||
width: 5em;
|
||||
z-index: 99;
|
||||
}
|
||||
}
|
||||
.custom-control {
|
||||
.custom-control-input {
|
||||
&:checked ~ .custom-control-label::before {
|
||||
background-color: var(--primary-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
.task-admin-switch {
|
||||
&.form-group {
|
||||
margin-bottom: 0 !important;
|
||||
margin-top: 1em;
|
||||
margin-right: 1em;
|
||||
}
|
||||
.custom-control-label {
|
||||
&::before {
|
||||
border-color: #fff;
|
||||
background-color: rgb(135, 255, 249);
|
||||
}
|
||||
&::after {
|
||||
background-color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
.compare-switch {
|
||||
.custom-control-label {
|
||||
&::before {
|
||||
border-color: #fff;
|
||||
background-color: rgb(135, 255, 249);
|
||||
}
|
||||
&::after {
|
||||
background-color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
.text-2 {
|
||||
white-space: nowrap;
|
||||
}
|
||||
/* .form-control {
|
||||
height: auto !important;
|
||||
} */
|
||||
/*
|
||||
.checkbox-4 {
|
||||
width: 100px;
|
||||
appearance: none;
|
||||
height: 40px;
|
||||
border-radius: 100px;
|
||||
cursor: pointer;
|
||||
background: #ffffff;
|
||||
position: relative;
|
||||
background: #e0e5ec;
|
||||
box-shadow: 4px 4px 6px 0 rgba(255, 255, 255, 0.3),
|
||||
-4px -4px 6px 0 rgba(116, 125, 136, 0.2),
|
||||
inset -4px -4px 6px 0 rgba(255, 255, 255, 0.2),
|
||||
inset 4px 4px 6px 0 rgba(0, 0, 0, 0.2);
|
||||
transition: all 0.5s;
|
||||
}
|
||||
.checkbox-4::after {
|
||||
content: "";
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
top: 5px;
|
||||
border-radius: 100%;
|
||||
background-color: #ffffff;
|
||||
box-shadow: inset 2px 2px 2px 0px rgba(255, 255, 255, 0.5),
|
||||
7px 7px 20px 0px rgba(0, 0, 0, 0.1), 4px 4px 5px 0px rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.5s;
|
||||
}
|
||||
.checkbox-4:checked::after {
|
||||
left: 65px;
|
||||
}
|
||||
.checkbox-4-pink:checked {
|
||||
background: #fb2175;
|
||||
}
|
||||
.checkbox-4-danger:checked {
|
||||
background: var(--danger);
|
||||
}
|
||||
.checkbox-4-success:checked {
|
||||
background: var(--success);
|
||||
}
|
||||
.checkbox-4-info:checked {
|
||||
background: var(--info);
|
||||
}
|
||||
.checkbox-4-dark:checked {
|
||||
background: #1a1a1a;
|
||||
}
|
||||
.checkbox-4-magic:checked {
|
||||
background: var(--magic);
|
||||
} */
|
||||
</style>
|
|
@ -54,7 +54,7 @@ export default {
|
|||
.co-name {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-bottom: 1px solid var(--primary);
|
||||
border-bottom: 1px solid var(--primary,#00a762);
|
||||
padding-bottom: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
padding-left: 2em;
|
||||
|
@ -85,10 +85,10 @@ export default {
|
|||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
margin: 0.1em;
|
||||
border: 0.1em solid var(--primary);
|
||||
border: 0.1em solid var(--primary,#00a762);
|
||||
border-radius: 50%;
|
||||
animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
|
||||
border-color: var(--primary) transparent transparent transparent;
|
||||
border-color: var(--primary,#00a762) transparent transparent transparent;
|
||||
}
|
||||
|
||||
.lds-ring div:nth-child(1) {
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
class="col-sm-12 col-md mb-5 mb-md-0 text-center"
|
||||
v-for="(counter, index) in list"
|
||||
>
|
||||
<!-- <my-counter-list-item
|
||||
<my-counter-list-item
|
||||
:counter="counter"
|
||||
:key="index + render"
|
||||
></my-counter-list-item> -->
|
||||
></my-counter-list-item>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -19,13 +19,13 @@
|
|||
import repoApi from "~/apis/repoApi";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
listData: {
|
||||
default() {
|
||||
return [];
|
||||
},
|
||||
},
|
||||
},
|
||||
// props: {
|
||||
// listData: {
|
||||
// default() {
|
||||
// return [];
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
async beforeMount() {
|
||||
try {
|
||||
const { $api } = useNuxtApp();
|
||||
|
@ -73,6 +73,11 @@ export default {
|
|||
],
|
||||
};
|
||||
},
|
||||
components: {
|
||||
MyCounterListItem: defineAsyncComponent(() =>
|
||||
import("@components/other/MyCounterListItem.vue")
|
||||
),
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
class="d-md-flex justify-content-sm-center align-items-center"
|
||||
>
|
||||
<h2 class="counter-number mb-2 mb-md-0">
|
||||
<span :class="counter.key + '-timer'">{{ counter.count }}</span>
|
||||
<span>{{ displayValue }}</span>
|
||||
</h2>
|
||||
<div class="d-flex flex-column align-items-center align-items-lg-start">
|
||||
<p class="counter-text">{{ counter.title }}</p>
|
||||
|
@ -15,36 +15,62 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import "assets/common/vendors/counter/counter.js";
|
||||
|
||||
export default {
|
||||
props: ["counter"],
|
||||
data() {
|
||||
return {
|
||||
displayValue: 0,
|
||||
interval: null,
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
const vm = this;
|
||||
|
||||
$(`.${vm.counter.key}-timer`).countTo({
|
||||
from: 0,
|
||||
to: vm.counter.total,
|
||||
speed: 7000,
|
||||
refreshInterval: 50,
|
||||
onComplete: function (value) {
|
||||
// console.debug(this);
|
||||
},
|
||||
});
|
||||
this.startCount();
|
||||
},
|
||||
beforeUnmount() {
|
||||
if (this.interval) clearInterval(this.interval);
|
||||
},
|
||||
methods: {
|
||||
startCount() {
|
||||
const from = 0;
|
||||
const to = this.counter.total;
|
||||
const speed = 7000;
|
||||
const refreshInterval = 50;
|
||||
const decimals = 0;
|
||||
|
||||
const loops = Math.ceil(speed / refreshInterval);
|
||||
const increment = (to - from) / loops;
|
||||
|
||||
let value = from;
|
||||
let loopCount = 0;
|
||||
|
||||
this.interval = setInterval(() => {
|
||||
value += increment;
|
||||
loopCount++;
|
||||
this.displayValue = value.toFixed(decimals);
|
||||
|
||||
if (loopCount >= loops) {
|
||||
clearInterval(this.interval);
|
||||
this.displayValue = to.toFixed(decimals);
|
||||
}
|
||||
}, refreshInterval);
|
||||
},
|
||||
|
||||
goToRouteName() {
|
||||
this.$router.push({
|
||||
name: "searchResult",
|
||||
name: "search",
|
||||
query: {
|
||||
q: undefined,
|
||||
key: this.counter.routeName,
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
urlResolver() {
|
||||
|
||||
|
||||
const routeData = this.$router.resolve({
|
||||
name: "searchResult",
|
||||
name: "search",
|
||||
query: {
|
||||
q: undefined,
|
||||
key: this.counter.routeName,
|
||||
|
|
11
composables/useApi.ts
Normal file
11
composables/useApi.ts
Normal file
|
@ -0,0 +1,11 @@
|
|||
import type { UseFetchOptions } from 'nuxt/app'
|
||||
|
||||
export function useApi<T>(
|
||||
url: string | (() => string),
|
||||
options?: UseFetchOptions<T>,
|
||||
) {
|
||||
return useFetch(url, {
|
||||
...options,
|
||||
$fetch: useNuxtApp().$api as typeof $fetch
|
||||
})
|
||||
}
|
22
composables/useAuth.ts
Normal file
22
composables/useAuth.ts
Normal file
|
@ -0,0 +1,22 @@
|
|||
// // composables/useAuth.js
|
||||
|
||||
// export function useAuth() {
|
||||
// const token = ref(sessionStorage.getItem('id_token'));
|
||||
|
||||
// const setToken = (newToken) => {
|
||||
// token.value = newToken;
|
||||
// localStorage.setItem('id_token', newToken);
|
||||
// };
|
||||
|
||||
// const clearToken = () => {
|
||||
// token.value = null;
|
||||
// localStorage.removeItem('id_token');
|
||||
// sessionStorage.removeItem('id_token');
|
||||
// };
|
||||
|
||||
// return {
|
||||
// token,
|
||||
// setToken,
|
||||
// clearToken,
|
||||
// };
|
||||
// }
|
81
composables/useFetchService.ts
Normal file
81
composables/useFetchService.ts
Normal file
|
@ -0,0 +1,81 @@
|
|||
import type { FetchOptions } from 'ofetch'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
|
||||
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
|
||||
|
||||
interface HttpRequestOptions<T = unknown> extends FetchOptions {
|
||||
data?: T
|
||||
}
|
||||
|
||||
export const useHttpService = () => {
|
||||
const config = useRuntimeConfig()
|
||||
const token = useStorage('id_token', 'GuestAccess')
|
||||
|
||||
/**
|
||||
* Constructs the full API URL
|
||||
*/
|
||||
const getFullUrl = (endpoint: string): string => {
|
||||
return `${config.public.NUXT_PUBLIC_BASE_URL}${config.public.NUXT_PUBLIC_API_NAME}${endpoint}`
|
||||
}
|
||||
|
||||
/**
|
||||
* Base fetch method with common configuration
|
||||
*/
|
||||
const baseFetch = async <T = any>(
|
||||
method: HttpMethod,
|
||||
url: string,
|
||||
options: HttpRequestOptions = {}
|
||||
) => {
|
||||
const headers = {
|
||||
...options.headers,
|
||||
...(token.value ? { Authorization: token.value } : {})
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await $fetch<T>(getFullUrl(url), {
|
||||
method,
|
||||
headers,
|
||||
...options,
|
||||
body: options.data || options.body
|
||||
})
|
||||
|
||||
return response
|
||||
} catch (error) {
|
||||
// Handle errors globally or rethrow for specific handling
|
||||
console.error(`HTTP ${method} error for ${url}:`, error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
/**
|
||||
* GET request
|
||||
*/
|
||||
getRequest: <T = any>(url: string, options?: HttpRequestOptions) =>
|
||||
baseFetch<T>('GET', url, options),
|
||||
|
||||
/**
|
||||
* POST request
|
||||
*/
|
||||
postRequest: <T = any>(url: string, data?: any, options?: HttpRequestOptions) =>
|
||||
baseFetch<T>('POST', url, { ...options, data }),
|
||||
|
||||
/**
|
||||
* PUT request
|
||||
*/
|
||||
putRequest: <T = any>(url: string, data?: any, options?: HttpRequestOptions) =>
|
||||
baseFetch<T>('PUT', url, { ...options, data }),
|
||||
|
||||
/**
|
||||
* PATCH request
|
||||
*/
|
||||
patchRequest: <T = any>(url: string, data?: any, options?: HttpRequestOptions) =>
|
||||
baseFetch<T>('PATCH', url, { ...options, data }),
|
||||
|
||||
/**
|
||||
* DELETE request
|
||||
*/
|
||||
deleteRequest: <T = any>(url: string, options?: HttpRequestOptions) =>
|
||||
baseFetch<T>('DELETE', url, options)
|
||||
}
|
||||
}
|
|
@ -6,7 +6,6 @@ export const useHadithaSearchComposable = <T>(url: string, options = {}) => {
|
|||
// const token = useCookie('auth-token') // Assuming you store the token in a cookie
|
||||
let token = useStorage("id_token", "GuestAccess");
|
||||
const config = useRuntimeConfig();
|
||||
console.info(config);
|
||||
|
||||
const baseURL =
|
||||
config.public.NUXT_PUBLIC_BASE_URL + config.public.NUXT_PUBLIC_API_NAME;
|
||||
|
@ -23,4 +22,12 @@ export const useHadithaSearchComposable = <T>(url: string, options = {}) => {
|
|||
baseURL,
|
||||
headers,
|
||||
});
|
||||
|
||||
// return useAsyncData(keyName, async () => {
|
||||
// return await $fetch(url, {
|
||||
// ...options,
|
||||
// baseURL,
|
||||
// headers,
|
||||
// });
|
||||
// });
|
||||
};
|
||||
|
|
118
composables/useInfiniteScroll.ts
Normal file
118
composables/useInfiniteScroll.ts
Normal file
|
@ -0,0 +1,118 @@
|
|||
// composables/useInfiniteScroll.ts
|
||||
import { ref, onMounted, onBeforeUnmount } from "vue";
|
||||
|
||||
export default function useInfiniteScroll(
|
||||
callback: () => Promise<void>,
|
||||
elementId?: string
|
||||
) {
|
||||
const route = useRoute();
|
||||
const isFetching = ref(false);
|
||||
const infiniteScroll = ref<HTMLElement | Window | null>(null);
|
||||
|
||||
// Throttle function to limit scroll event frequency
|
||||
const throttle = (func: (...args: any[]) => void, limit: number) => {
|
||||
let lastFunc: ReturnType<typeof setTimeout>;
|
||||
let lastRan: number;
|
||||
return function (this: any, ...args: any[]) {
|
||||
const context = this;
|
||||
if (!lastRan) {
|
||||
func.apply(context, args);
|
||||
lastRan = Date.now();
|
||||
} else {
|
||||
clearTimeout(lastFunc);
|
||||
lastFunc = setTimeout(() => {
|
||||
if (Date.now() - lastRan >= limit) {
|
||||
func.apply(context, args);
|
||||
lastRan = Date.now();
|
||||
}
|
||||
}, limit - (Date.now() - lastRan));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const checkScrollPosition = () => {
|
||||
if (isFetching.value || !infiniteScroll.value) return;
|
||||
|
||||
let scrollPosition: number;
|
||||
let threshold: number;
|
||||
let clientHeight: number;
|
||||
let scrollHeight: number;
|
||||
|
||||
if (infiniteScroll.value === window) {
|
||||
scrollPosition = window.scrollY || window.pageYOffset;
|
||||
clientHeight = document.documentElement.clientHeight;
|
||||
scrollHeight = document.documentElement.scrollHeight;
|
||||
} else {
|
||||
const el = infiniteScroll.value as HTMLElement;
|
||||
scrollPosition = el.scrollTop;
|
||||
clientHeight = el.clientHeight;
|
||||
scrollHeight = el.scrollHeight;
|
||||
}
|
||||
|
||||
threshold = scrollHeight - 100;
|
||||
const currentPosition = scrollPosition + clientHeight;
|
||||
|
||||
if (currentPosition >= threshold) {
|
||||
isFetching.value = true;
|
||||
callback().finally(() => {
|
||||
isFetching.value = false;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Throttled version of scroll handler
|
||||
const throttledScrollHandler = throttle(checkScrollPosition, 200);
|
||||
|
||||
const handleTouchEnd = () => {
|
||||
setTimeout(throttledScrollHandler, 100);
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
console.info(route.name)
|
||||
|
||||
if (route.name == "hadithaSearch" || route.name == "hadithaLibrary") {
|
||||
const targetElement = elementId
|
||||
? document.getElementById(elementId)
|
||||
: window;
|
||||
|
||||
if (!targetElement) {
|
||||
console.warn(
|
||||
`Element ${elementId || "window"} not found for infinite scroll`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
infiniteScroll.value = targetElement;
|
||||
|
||||
if (targetElement === window) {
|
||||
window.addEventListener("scroll", throttledScrollHandler);
|
||||
window.addEventListener("touchend", handleTouchEnd);
|
||||
} else {
|
||||
targetElement.addEventListener("scroll", throttledScrollHandler);
|
||||
targetElement.addEventListener("touchend", handleTouchEnd);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
if (route.name == "hadithaSearch" || route.name == "hadithaLibrary") {
|
||||
if (!infiniteScroll.value) return;
|
||||
|
||||
if (infiniteScroll.value === window) {
|
||||
window.removeEventListener("scroll", throttledScrollHandler);
|
||||
window.removeEventListener("touchend", handleTouchEnd);
|
||||
} else {
|
||||
(infiniteScroll.value as HTMLElement).removeEventListener(
|
||||
"scroll",
|
||||
throttledScrollHandler
|
||||
);
|
||||
(infiniteScroll.value as HTMLElement).removeEventListener(
|
||||
"touchend",
|
||||
handleTouchEnd
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return { isFetching };
|
||||
}
|
46
composables/useInfiniteScrollObserver.ts
Normal file
46
composables/useInfiniteScrollObserver.ts
Normal file
|
@ -0,0 +1,46 @@
|
|||
// composables/useInfiniteScrollObserver.ts
|
||||
import { onBeforeUnmount, onMounted, ref } from "vue";
|
||||
|
||||
export default function useInfiniteScrollObserver(callback) {
|
||||
const observer = ref<IntersectionObserver | null>(null);
|
||||
const isFetching = ref(false);
|
||||
const infiniteScroll = ref<HTMLElement | null>(null);
|
||||
console.info("useInfiniteScrollObserver");
|
||||
|
||||
const initObserver = () => {
|
||||
console.info("useInfiniteScrollObserver");
|
||||
|
||||
observer.value = new IntersectionObserver(
|
||||
(entries) => {
|
||||
console.info("useInfiniteScrollObserver");
|
||||
|
||||
if (entries[0].isIntersecting && !isFetching.value) {
|
||||
isFetching.value = true;
|
||||
callback().finally(() => {
|
||||
isFetching.value = false;
|
||||
});
|
||||
}
|
||||
},
|
||||
{
|
||||
rootMargin: "200px", // Load when 200px away from viewport
|
||||
threshold: 0.1,
|
||||
}
|
||||
);
|
||||
|
||||
if (infiniteScroll.value) {
|
||||
observer.value.observe(infiniteScroll.value);
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
initObserver();
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
if (observer.value && infiniteScroll.value) {
|
||||
observer.value.unobserve(infiniteScroll.value);
|
||||
}
|
||||
});
|
||||
|
||||
return { isFetching, infiniteScroll };
|
||||
}
|
11
dockerfile
11
dockerfile
|
@ -2,13 +2,16 @@ FROM node:22
|
|||
|
||||
WORKDIR /app
|
||||
|
||||
|
||||
COPY package*.json ./
|
||||
COPY . .
|
||||
RUN npm install
|
||||
|
||||
COPY . .
|
||||
RUN npm run build-haditha
|
||||
|
||||
RUN npm install -g pm2
|
||||
RUN pm2 start .output/server/index.mjs --name "nuxt-app"
|
||||
RUN pm2 save
|
||||
RUN pm2 startup
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD ["node", ".output/server/index.mjs"]
|
||||
CMD ["pm2-runtime", ".output/server/index.mjs"]
|
|
@ -64,7 +64,7 @@ export default defineNuxtConfig({
|
|||
// "vuejs-paginate",
|
||||
],
|
||||
devtools: {
|
||||
enabled: process.env.NODE_ENV === "development",
|
||||
enabled: true,
|
||||
vscode: {
|
||||
reuseExistingServer: true,
|
||||
},
|
||||
|
@ -73,7 +73,7 @@ export default defineNuxtConfig({
|
|||
features: {
|
||||
inlineStyles: false,
|
||||
},
|
||||
debug: false,
|
||||
debug: true,
|
||||
// Modules and plugins
|
||||
modules: [
|
||||
"@pinia/nuxt",
|
||||
|
@ -86,16 +86,20 @@ export default defineNuxtConfig({
|
|||
"@nuxtjs/color-mode",
|
||||
"@nuxt/test-utils/module",
|
||||
// 'nuxt-delay-hydration',
|
||||
"@nuxt/image",
|
||||
// "@nuxtjs/supabase",
|
||||
"@nuxt/icon",
|
||||
// "@nuxt/icon",
|
||||
"@nuxt/image",
|
||||
"nuxt-auth-utils"
|
||||
],
|
||||
icon: {
|
||||
provider: 'server',
|
||||
// iconifyApiEndpoint: "iconifyApi",
|
||||
fallbackToApi: "client-only",
|
||||
// provider: "iconify",
|
||||
localApiEndpoint: "/iconifyapi/_nuxt_icon",
|
||||
customCollections: [
|
||||
{
|
||||
prefix: "haditha",
|
||||
dir: `./systems/${buildName}_ui/assets/${buildName}/font-icons/*.svg`,
|
||||
dir: `./systems/${buildName}_ui/assets/${buildName}/images/font-icons`,
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -336,10 +340,7 @@ export default defineNuxtConfig({
|
|||
function customStyleLoader() {
|
||||
let mainStyle = `~/assets/common/scss/${buildName}-styles.scss`;
|
||||
if (buildName == "haditha")
|
||||
mainStyle = `~/systems/${buildName.substring(
|
||||
0,
|
||||
buildName.length - 1
|
||||
)}_ui/assets/${buildName}/scss/${buildName}.css`;
|
||||
mainStyle = `~/systems/${buildName}_ui/assets/${buildName}/scss/${buildName}.css`;
|
||||
|
||||
return mainStyle;
|
||||
}
|
268
package-lock.json
generated
268
package-lock.json
generated
|
@ -7,7 +7,7 @@
|
|||
"name": "nuxt-app",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@nuxt/icon": "^1.12.0",
|
||||
"@iconify/vue": "^4.3.0",
|
||||
"@nuxt/image": "^1.8.1",
|
||||
"@nuxt/ui": "^3.0.0-alpha.12",
|
||||
"@nuxtjs/supabase": "^1.4.5",
|
||||
|
@ -38,6 +38,7 @@
|
|||
"mitt": "^3.0.1",
|
||||
"npm": "^11.1.0",
|
||||
"nuxt": "^3.15.4",
|
||||
"nuxt-auth-utils": "^0.5.20",
|
||||
"nuxt-echarts": "^0.2.3",
|
||||
"pinia-plugin-persistedstate": "^4.1.1",
|
||||
"qrcode": "^1.5.4",
|
||||
|
@ -65,6 +66,7 @@
|
|||
"devDependencies": {
|
||||
"@iconify-json/lucide": "^1.2.28",
|
||||
"@iconify-json/vscode-icons": "^1.2.16",
|
||||
"@nuxt/icon": "^1.12.0",
|
||||
"@nuxt/test-utils": "^3.14.4",
|
||||
"@nuxtjs/i18n": "^9.0.0-rc.2",
|
||||
"@types/bootstrap": "^5.2.10",
|
||||
|
@ -85,6 +87,31 @@
|
|||
"vue-tsc": "^2.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/@adonisjs/hash": {
|
||||
"version": "9.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@adonisjs/hash/-/hash-9.0.5.tgz",
|
||||
"integrity": "sha512-oY8PafBrdGsr5UY8cAzzxPCtehZDW7KsPcI47dZpjydOdL/PQrT4liX+cGujL6mSbi3JEgQLBgBs/+SlPFvCrg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@phc/format": "^1.0.0",
|
||||
"@poppinss/utils": "^6.8.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.6.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"argon2": "^0.31.2 || ^0.41.0",
|
||||
"bcrypt": "^5.1.1"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"argon2": {
|
||||
"optional": true
|
||||
},
|
||||
"bcrypt": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@alloc/quick-lru": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
|
||||
|
@ -2113,6 +2140,15 @@
|
|||
"@lezer/common": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@lukeed/ms": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz",
|
||||
"integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/@mapbox/node-pre-gyp": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
|
||||
|
@ -4451,6 +4487,15 @@
|
|||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/@phc/format": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz",
|
||||
"integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@pinia/nuxt": {
|
||||
"version": "0.5.5",
|
||||
"resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.5.tgz",
|
||||
|
@ -4489,6 +4534,60 @@
|
|||
"url": "https://opencollective.com/popperjs"
|
||||
}
|
||||
},
|
||||
"node_modules/@poppinss/exception": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.1.tgz",
|
||||
"integrity": "sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@poppinss/object-builder": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@poppinss/object-builder/-/object-builder-1.1.0.tgz",
|
||||
"integrity": "sha512-FOrOq52l7u8goR5yncX14+k+Ewi5djnrt1JwXeS/FvnwAPOiveFhiczCDuvXdssAwamtrV2hp5Rw9v+n2T7hQg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=20.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@poppinss/string": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@poppinss/string/-/string-1.3.0.tgz",
|
||||
"integrity": "sha512-8BMX3y6Dr3W8EtF8CbL0uRXxm7Ha48fHVPCfOp667Uh6J7C+d0DzcoBzzNnofnvwdzVMKy0DNZ4KmMioEBj2wQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@lukeed/ms": "^2.0.2",
|
||||
"@types/bytes": "^3.1.5",
|
||||
"@types/pluralize": "^0.0.33",
|
||||
"bytes": "^3.1.2",
|
||||
"case-anything": "^3.1.2",
|
||||
"pluralize": "^8.0.0",
|
||||
"slugify": "^1.6.6",
|
||||
"truncatise": "^0.0.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@poppinss/utils": {
|
||||
"version": "6.9.3",
|
||||
"resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-6.9.3.tgz",
|
||||
"integrity": "sha512-K69WMVtmGcl0zJii9Zm5iav5VmxD3hw1JtN5cGqhTMr7UMSLSjeZPuETwZgjKqw86Dd1YcrWLU0+cVCTkemQJg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@poppinss/exception": "^1.2.1",
|
||||
"@poppinss/object-builder": "^1.1.0",
|
||||
"@poppinss/string": "^1.3.0",
|
||||
"flattie": "^1.1.1",
|
||||
"safe-stable-stringify": "^2.5.0",
|
||||
"secure-json-parse": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.16.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redocly/ajv": {
|
||||
"version": "8.11.2",
|
||||
"resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz",
|
||||
|
@ -5452,6 +5551,12 @@
|
|||
"@popperjs/core": "^2.9.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/bytes": {
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.5.tgz",
|
||||
"integrity": "sha512-VgZkrJckypj85YxEsEavcMmmSOIzkUHqWmM4CCyia5dc54YwsXzJ5uT4fYxBQNEXx+oF1krlhgCbvfubXqZYsQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/cookie": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
|
||||
|
@ -5536,6 +5641,12 @@
|
|||
"integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/pluralize": {
|
||||
"version": "0.0.33",
|
||||
"resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.33.tgz",
|
||||
"integrity": "sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/resolve": {
|
||||
"version": "1.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
|
||||
|
@ -7497,6 +7608,15 @@
|
|||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/bytes": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
||||
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/c12": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz",
|
||||
|
@ -7633,6 +7753,18 @@
|
|||
],
|
||||
"license": "CC-BY-4.0"
|
||||
},
|
||||
"node_modules/case-anything": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.2.tgz",
|
||||
"integrity": "sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/mesqueeb"
|
||||
}
|
||||
},
|
||||
"node_modules/chai": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
|
||||
|
@ -9864,6 +9996,15 @@
|
|||
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/flattie": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz",
|
||||
"integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/floating-vue": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-5.2.2.tgz",
|
||||
|
@ -11229,6 +11370,15 @@
|
|||
"jiti": "lib/jiti-cli.mjs"
|
||||
}
|
||||
},
|
||||
"node_modules/jose": {
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
|
||||
"integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/panva"
|
||||
}
|
||||
},
|
||||
"node_modules/jquery": {
|
||||
"version": "3.7.1",
|
||||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
|
||||
|
@ -15488,6 +15638,51 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/nuxt-auth-utils": {
|
||||
"version": "0.5.20",
|
||||
"resolved": "https://registry.npmjs.org/nuxt-auth-utils/-/nuxt-auth-utils-0.5.20.tgz",
|
||||
"integrity": "sha512-hoXopfYeK4Cdu17WxxDWYc66EH7ZYG8JUodPxxef9vjfXOXqz3s1gxi/JWsiqkwN6s7K1RpKEESZGg1EopCgAA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@adonisjs/hash": "^9.0.5",
|
||||
"@nuxt/kit": "^3.15.4",
|
||||
"defu": "^6.1.4",
|
||||
"h3": "^1.14.0",
|
||||
"hookable": "^5.5.3",
|
||||
"jose": "^5.9.6",
|
||||
"ofetch": "^1.4.1",
|
||||
"openid-client": "^6.1.7",
|
||||
"pathe": "^2.0.2",
|
||||
"scule": "^1.3.0",
|
||||
"uncrypto": "^0.1.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@atproto/api": "^0.13.15",
|
||||
"@atproto/oauth-client-node": "^0.2.0",
|
||||
"@simplewebauthn/browser": "^11.0.0",
|
||||
"@simplewebauthn/server": "^11.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@atproto/api": {
|
||||
"optional": true
|
||||
},
|
||||
"@atproto/oauth-client-node": {
|
||||
"optional": true
|
||||
},
|
||||
"@simplewebauthn/browser": {
|
||||
"optional": true
|
||||
},
|
||||
"@simplewebauthn/server": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/nuxt-auth-utils/node_modules/pathe": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
|
||||
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nuxt-echarts": {
|
||||
"version": "0.2.4",
|
||||
"resolved": "https://registry.npmjs.org/nuxt-echarts/-/nuxt-echarts-0.2.4.tgz",
|
||||
|
@ -15734,6 +15929,15 @@
|
|||
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/oauth4webapi": {
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.5.1.tgz",
|
||||
"integrity": "sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/panva"
|
||||
}
|
||||
},
|
||||
"node_modules/object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
|
@ -15906,6 +16110,28 @@
|
|||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/openid-client": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.5.0.tgz",
|
||||
"integrity": "sha512-fAfYaTnOYE2kQCqEJGX9KDObW2aw7IQy4jWpU/+3D3WoCFLbix5Hg6qIPQ6Js9r7f8jDUmsnnguRNCSw4wU/IQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"jose": "^6.0.10",
|
||||
"oauth4webapi": "^3.5.1"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/panva"
|
||||
}
|
||||
},
|
||||
"node_modules/openid-client/node_modules/jose": {
|
||||
"version": "6.0.11",
|
||||
"resolved": "https://registry.npmjs.org/jose/-/jose-6.0.11.tgz",
|
||||
"integrity": "sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/panva"
|
||||
}
|
||||
},
|
||||
"node_modules/option": {
|
||||
"version": "0.2.4",
|
||||
"resolved": "https://registry.npmjs.org/option/-/option-0.2.4.tgz",
|
||||
|
@ -18050,6 +18276,15 @@
|
|||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/safe-stable-stringify": {
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
|
||||
"integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
|
@ -18469,6 +18704,22 @@
|
|||
"integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/secure-json-parse": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.0.0.tgz",
|
||||
"integrity": "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/fastify"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/fastify"
|
||||
}
|
||||
],
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
|
@ -18812,6 +19063,15 @@
|
|||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/slugify": {
|
||||
"version": "1.6.6",
|
||||
"resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
|
||||
"integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/smob": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz",
|
||||
|
@ -19489,6 +19749,12 @@
|
|||
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/truncatise": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/truncatise/-/truncatise-0.0.8.tgz",
|
||||
"integrity": "sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/ts-api-utils": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
"build-haditha": "env-cmd -f .env.haditha nuxt build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nuxt/icon": "^1.12.0",
|
||||
"@iconify/vue": "^4.3.0",
|
||||
"@nuxt/image": "^1.8.1",
|
||||
"@nuxt/ui": "^3.0.0-alpha.12",
|
||||
"@nuxtjs/supabase": "^1.4.5",
|
||||
|
@ -46,6 +46,7 @@
|
|||
"mitt": "^3.0.1",
|
||||
"npm": "^11.1.0",
|
||||
"nuxt": "^3.15.4",
|
||||
"nuxt-auth-utils": "^0.5.20",
|
||||
"nuxt-echarts": "^0.2.3",
|
||||
"pinia-plugin-persistedstate": "^4.1.1",
|
||||
"qrcode": "^1.5.4",
|
||||
|
@ -73,6 +74,7 @@
|
|||
"devDependencies": {
|
||||
"@iconify-json/lucide": "^1.2.28",
|
||||
"@iconify-json/vscode-icons": "^1.2.16",
|
||||
"@nuxt/icon": "^1.12.0",
|
||||
"@nuxt/test-utils": "^3.14.4",
|
||||
"@nuxtjs/i18n": "^9.0.0-rc.2",
|
||||
"@types/bootstrap": "^5.2.10",
|
||||
|
|
|
@ -1,25 +1,22 @@
|
|||
import { useAuthStore } from "~/stores/authStore";
|
||||
import { useStorage } from "@vueuse/core";
|
||||
|
||||
// let lsToken = useStorage("token", "GuestAccess");
|
||||
// if (lsToken == null || lsToken == "" || lsToken == undefined)
|
||||
// lsToken = "GuestAccess";
|
||||
|
||||
export default defineNuxtPlugin((nuxtApp) => {
|
||||
const config = useRuntimeConfig();
|
||||
|
||||
// const { session } = useUserSession();
|
||||
// const authStore = useAuthStore();
|
||||
let token = useStorage("id_token", "GuestAccess").value;
|
||||
const id_token = useCookie("id_token");
|
||||
const token = id_token.value ?? "GuestAccess";
|
||||
|
||||
const baseUrl =
|
||||
config.public.NUXT_PUBLIC_BASE_URL + config.public.NUXT_PUBLIC_API_NAME;
|
||||
|
||||
const api = $fetch.create({
|
||||
// baseURL: baseUrl,
|
||||
onRequest({ request, options, error }) {
|
||||
options.baseURL =
|
||||
config.public.NUXT_PUBLIC_BASE_URL +
|
||||
config.public.NUXT_PUBLIC_API_NAME +
|
||||
options.baseURL;
|
||||
options.baseURL = baseUrl + options.baseURL;
|
||||
|
||||
// options.baseURL = options.baseURL;
|
||||
|
||||
if (token) {
|
||||
const headers = (options.headers ||= {});
|
||||
|
||||
if (Array.isArray(headers)) {
|
||||
headers.push(["Authorization", token]);
|
||||
} else if (headers instanceof Headers) {
|
||||
|
|
|
@ -6,12 +6,10 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|||
const config = useRuntimeConfig();
|
||||
|
||||
const api = $fetch.create({
|
||||
onRequest({ request, options, error }) {
|
||||
options.baseURL =
|
||||
config.public.NUXT_PUBLIC_BASE_URL +
|
||||
config.public.NUXT_PUBLIC_API_NAME +
|
||||
options.baseURL;
|
||||
baseURL: config.public.NUXT_PUBLIC_BASE_URL +
|
||||
config.public.NUXT_PUBLIC_API_NAME,
|
||||
|
||||
onRequest({ request, options, error }) {
|
||||
if (token) {
|
||||
const headers = (options.headers ||= {});
|
||||
if (Array.isArray(headers)) {
|
||||
|
@ -38,7 +36,8 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|||
|
||||
// Add custom methods for GET, POST, and DELETE
|
||||
const http = {
|
||||
getRequest: (url: string, options = {}) => api(url, { method: "GET", ...options }),
|
||||
getRequest: (url: string, options = {}) =>
|
||||
api(url, { method: "GET", ...options }),
|
||||
postRequest: (url: string, body: any, options = {}) =>
|
||||
api(url, { method: "POST", body, ...options }),
|
||||
deleteRequest: (url: string, options = {}) =>
|
||||
|
|
384
plugins/persianNumber.js
Normal file
384
plugins/persianNumber.js
Normal file
|
@ -0,0 +1,384 @@
|
|||
export default defineNuxtPlugin(() => {
|
||||
console.info("persina number plugin");
|
||||
});
|
||||
|
||||
// const oneDigit = [
|
||||
// "صفر",
|
||||
// "یک",
|
||||
// "دو",
|
||||
// "سه",
|
||||
// "چهار",
|
||||
// "پنج",
|
||||
// "شش",
|
||||
// "هفت",
|
||||
// "هشت",
|
||||
// "نه",
|
||||
// ];
|
||||
// const twoDigits = {
|
||||
// 10: "ده",
|
||||
// 11: "یازده",
|
||||
// 12: "دوازده",
|
||||
// 13: "سیزده",
|
||||
// 14: "چهارده",
|
||||
// 15: "پانزده",
|
||||
// 16: "شانزده",
|
||||
// 17: "هفده",
|
||||
// 18: "هجده",
|
||||
// 19: "نوزده",
|
||||
// 20: "بیست",
|
||||
// 30: "سی",
|
||||
// 40: "چهل",
|
||||
// 50: "پنجاه",
|
||||
// 60: "شصت",
|
||||
// 70: "هفتاد",
|
||||
// 80: "هشتاد",
|
||||
// 90: "نود",
|
||||
// };
|
||||
// const threeDigits = {
|
||||
// 100: "صد",
|
||||
// 200: "دویست",
|
||||
// 300: "سیصد",
|
||||
// 400: "چهارصد",
|
||||
// 500: "پانصد",
|
||||
// 600: "شش صد",
|
||||
// 700: "هفت صد",
|
||||
// 800: "هشت صد",
|
||||
// 900: "نه صد",
|
||||
// };
|
||||
|
||||
// const types = ["تلیارد", "میلیارد", "میلیون", "هزار", ""];
|
||||
// const decimalTypes = ["دهم", "صدم", "هزارم", "ده هزارم"];
|
||||
// let numbers = [];
|
||||
// let decimals = [];
|
||||
|
||||
// //Convert Number To Words
|
||||
// const convert = (number) => {
|
||||
// let negative = "";
|
||||
// let decNumber = "";
|
||||
// let decimal = "";
|
||||
// let percent = "";
|
||||
|
||||
// if (isPercent(number)) {
|
||||
// number = number.replace("%", "");
|
||||
// percent = " درصد";
|
||||
// }
|
||||
|
||||
// number = getString(number);
|
||||
// if (number == "") return "";
|
||||
// sliceNumber(number);
|
||||
// if (isNegative(number)) negative = "منفی ";
|
||||
// number = number.replace("-", "");
|
||||
|
||||
// if (isDecimal(number)) {
|
||||
// let index = number.indexOf(".");
|
||||
// let decNumberStr = "";
|
||||
|
||||
// decNumber = number.substr(index + 1, number.length);
|
||||
// number = number.substr(0, index);
|
||||
// decNumberStr = parseInt(decNumber).toString();
|
||||
|
||||
// if (decNumberStr.length === 1 && decNumberStr != "0") {
|
||||
// decimal += oneDigit[decNumberStr] + " ";
|
||||
// decimal += decimalTypes[decNumber.length - 1];
|
||||
// } else {
|
||||
// decimal = calculateDigits(decimals);
|
||||
// decimal += " " + decimalTypes[decNumber.length - 1];
|
||||
// }
|
||||
// }
|
||||
|
||||
// if (number.length === 1) {
|
||||
// if (!decimal) {
|
||||
// return negative + oneDigit[number] + percent;
|
||||
// }
|
||||
|
||||
// if (number == "0") {
|
||||
// return negative + decimal + percent;
|
||||
// }
|
||||
|
||||
// return negative + oneDigit[number] + " ممیز " + decimal + percent;
|
||||
// }
|
||||
|
||||
// if (!decimal) {
|
||||
// return negative + calculateDigits(numbers) + percent;
|
||||
// }
|
||||
|
||||
// return negative + calculateDigits(numbers) + " ممیز " + decimal + percent;
|
||||
// };
|
||||
|
||||
// //split number 3 by 3 with a separator (123456789.3025=>123,456,789.3,025) Do Not Give It Persian Numbers
|
||||
// const sliceNumber = (number, separator = ",") => {
|
||||
// let percent = "";
|
||||
// let neg = "";
|
||||
// let dNum = "";
|
||||
// let n = "";
|
||||
// let d = "";
|
||||
|
||||
// if (isPercent(number)) {
|
||||
// number = number.replace("%", "");
|
||||
// percent = "%";
|
||||
// }
|
||||
|
||||
// number = getString(number);
|
||||
|
||||
// if (number == "") return "";
|
||||
// if (isNegative(number)) neg = "-";
|
||||
|
||||
// number = number.replace("-", "");
|
||||
|
||||
// if (isDecimal(number)) {
|
||||
// let index = number.indexOf(".");
|
||||
// dNum = number.substr(index + 1, number.length);
|
||||
// number = number.substr(0, index);
|
||||
// }
|
||||
|
||||
// n = putSeparator(number, separator);
|
||||
// numbers = n.split(separator);
|
||||
|
||||
// if (!dNum) return neg + n + percent;
|
||||
|
||||
// d = putSeparator(dNum, separator);
|
||||
// decimals = d.split(separator);
|
||||
|
||||
// return neg + n + "." + d + percent;
|
||||
// };
|
||||
|
||||
// //Puts a separator between the chunks of the given numString.
|
||||
// const putSeparator = (numString, separator = ",") => {
|
||||
// if (typeof numString !== "string") return "";
|
||||
// if (numString.length < 4) return numString;
|
||||
|
||||
// let result = "";
|
||||
// for (let i = numString.length - 1, counter = 0; i >= 0; i--) {
|
||||
// if (counter == 3) {
|
||||
// result += separator;
|
||||
// counter = 0;
|
||||
// }
|
||||
// result += numString[i];
|
||||
// counter++;
|
||||
// }
|
||||
|
||||
// result = result.split("").reverse().join("");
|
||||
// return result;
|
||||
// };
|
||||
|
||||
// //Processing on Digits of A Number
|
||||
// const calculateDigits = (arrNum) => {
|
||||
// let result = "";
|
||||
// for (let i = 0; i < arrNum.length; i++) {
|
||||
// let parsedNum = parseInt(arrNum[i]);
|
||||
// let number = parsedNum;
|
||||
// let sadgan = Math.floor(number / 100) * 100;
|
||||
// number = number % 100;
|
||||
// let dahgan = Math.floor(number / 10) * 10;
|
||||
// let yekan = number % 10;
|
||||
// result += i !== 0 && parsedNum ? " و " : "";
|
||||
|
||||
// result +=
|
||||
// getPersian(sadgan, dahgan, yekan, i, arrNum) + " " + getType(i, arrNum);
|
||||
// }
|
||||
|
||||
// return result.trim();
|
||||
// };
|
||||
|
||||
// //Main Process That Turn a Number Into a String(122=>100+20+2)
|
||||
// const getPersian = (sadgan, dahgan, yekan, index, numbers) => {
|
||||
// let flag = false;
|
||||
// let result = "";
|
||||
// let dahganPlusYekan = dahgan + yekan;
|
||||
|
||||
// if (threeDigits[sadgan]) {
|
||||
// result +=
|
||||
// yekan > 0 || dahgan > 0
|
||||
// ? threeDigits[sadgan] + " و "
|
||||
// : threeDigits[sadgan];
|
||||
// }
|
||||
|
||||
// if (twoDigits[dahganPlusYekan]) {
|
||||
// result += twoDigits[dahganPlusYekan] + " ";
|
||||
// return result;
|
||||
// }
|
||||
|
||||
// if (twoDigits[dahgan]) {
|
||||
// result += twoDigits[dahgan] + " و ";
|
||||
// }
|
||||
|
||||
// if (
|
||||
// numbers.length === 2 &&
|
||||
// index === 0 &&
|
||||
// yekan === 1 &&
|
||||
// dahgan === 0 &&
|
||||
// sadgan === 0
|
||||
// ) {
|
||||
// return result;
|
||||
// }
|
||||
|
||||
// if (
|
||||
// numbers.length > 2 &&
|
||||
// index === numbers.length - 2 &&
|
||||
// yekan === 1 &&
|
||||
// dahgan === 0 &&
|
||||
// sadgan === 0
|
||||
// ) {
|
||||
// return result;
|
||||
// }
|
||||
|
||||
// if (yekan > 0) result += oneDigit[yekan] + " ";
|
||||
|
||||
// return result;
|
||||
// };
|
||||
|
||||
// //getting The Type Of Each Number (Billion, Million,...)
|
||||
// const getType = (i, numbers) => {
|
||||
// let parsedNum = parseInt(numbers[i]);
|
||||
// if (isNaN(parsedNum)) return "";
|
||||
// if (!parsedNum) return "";
|
||||
// let length = numbers.length - i;
|
||||
// let index = types.length - length;
|
||||
// return types[index];
|
||||
// };
|
||||
|
||||
// //Calculate if number:String is Negative Or Not
|
||||
// const isNegative = (number) => {
|
||||
// number = getString(number);
|
||||
// if (!number) return false;
|
||||
// if (number[0] != "-") return false;
|
||||
// number = number.replace("-", "");
|
||||
// return number != "0";
|
||||
// };
|
||||
|
||||
// //Calculate if number:String has '%' as Percent
|
||||
// const isPercent = (string) => {
|
||||
// if (typeof string !== "string") return false;
|
||||
// let index = string.indexOf("%");
|
||||
// let lIndex = string.lastIndexOf("%");
|
||||
// if (index != lIndex) return false;
|
||||
// return index > 0;
|
||||
// };
|
||||
|
||||
// //is number:String:Number is a Valid Number? if type is Number turn it to String And Return it
|
||||
// const getString = (number) => {
|
||||
// if (number === undefined) return "";
|
||||
// if (number === null) return "";
|
||||
// if (isNaN(number)) return "";
|
||||
// if (typeof number === "number") return number.toString();
|
||||
// return number.trim();
|
||||
// };
|
||||
|
||||
// //Calculate if number:String has Decimal Point Or Not
|
||||
// const isDecimal = (number) => {
|
||||
// number = getString(number);
|
||||
// if (number == "") return false;
|
||||
// let index = number.indexOf(".");
|
||||
// let lIndex = number.lastIndexOf(".");
|
||||
// if (index != lIndex) return false;
|
||||
// return index > 0;
|
||||
// };
|
||||
// //Convert English Numbers To Persian Numbers
|
||||
// const convertEnToPe = (number) => {
|
||||
// if (number == null || number == undefined) return "";
|
||||
// if (typeof number == "number") number = number.toString();
|
||||
// let res = "";
|
||||
// for (let i = 0; i < number.length; i++) {
|
||||
// switch (number[i]) {
|
||||
// case "\u0030":
|
||||
// res += "\u06F0";
|
||||
// break;
|
||||
// case "\u0031":
|
||||
// res += "\u06F1";
|
||||
// break;
|
||||
// case "\u0032":
|
||||
// res += "\u06F2";
|
||||
// break;
|
||||
// case "\u0033":
|
||||
// res += "\u06F3";
|
||||
// break;
|
||||
// case "\u0034":
|
||||
// res += "\u06F4";
|
||||
// break;
|
||||
// case "\u0035":
|
||||
// res += "\u06F5";
|
||||
// break;
|
||||
// case "\u0036":
|
||||
// res += "\u06F6";
|
||||
// break;
|
||||
// case "\u0037":
|
||||
// res += "\u06F7";
|
||||
// break;
|
||||
// case "\u0038":
|
||||
// res += "\u06F8";
|
||||
// break;
|
||||
// case "\u0039":
|
||||
// res += "\u06F9";
|
||||
// break;
|
||||
// default:
|
||||
// res += number[i];
|
||||
// }
|
||||
// }
|
||||
// return res;
|
||||
// };
|
||||
// //Convert Persian Numbers To English Numbers
|
||||
// const convertPeToEn = (number) => {
|
||||
// if (number == null || number == undefined) return "";
|
||||
// let res = "";
|
||||
// for (let i = 0; i < number.length; i++) {
|
||||
// switch (number[i]) {
|
||||
// case "\u06F0":
|
||||
// res += "\u0030";
|
||||
// break;
|
||||
// case "\u06F1":
|
||||
// res += "\u0031";
|
||||
// break;
|
||||
// case "\u06F2":
|
||||
// res += "\u0032";
|
||||
// break;
|
||||
// case "\u06F3":
|
||||
// res += "\u0033";
|
||||
// break;
|
||||
// case "\u06F4":
|
||||
// res += "\u0034";
|
||||
// break;
|
||||
// case "\u06F5":
|
||||
// res += "\u0035";
|
||||
// break;
|
||||
// case "\u06F6":
|
||||
// res += "\u0036";
|
||||
// break;
|
||||
// case "\u06F7":
|
||||
// res += "\u0037";
|
||||
// break;
|
||||
// case "\u06F8":
|
||||
// res += "\u0038";
|
||||
// break;
|
||||
// case "\u06F9":
|
||||
// res += "\u0039";
|
||||
// break;
|
||||
// default:
|
||||
// res += number[i];
|
||||
// }
|
||||
// }
|
||||
// return res;
|
||||
// };
|
||||
|
||||
// const e2p = (s) => s.replace(/\d/g, (d) => "۰۱۲۳۴۵۶۷۸۹"[d]);
|
||||
// const e2a = (s) => s.replace(/\d/g, (d) => "٠١٢٣٤٥٦٧٨٩"[d]);
|
||||
|
||||
// const p2e = (s) => s.replace(/[۰-۹]/g, (d) => "۰۱۲۳۴۵۶۷۸۹".indexOf(d));
|
||||
// const a2e = (s) => s.replace(/[٠-٩]/g, (d) => "٠١٢٣٤٥٦٧٨٩".indexOf(d));
|
||||
|
||||
// const p2a = (s) =>
|
||||
// s.replace(/[۰-۹]/g, (d) => "٠١٢٣٤٥٦٧٨٩"["۰۱۲۳۴۵۶۷۸۹".indexOf(d)]);
|
||||
// const a2p = (s) =>
|
||||
// s.replace(/[٠-٩]/g, (d) => "۰۱۲۳۴۵۶۷۸۹"["٠١٢٣٤٥٦٧٨٩".indexOf(d)]);
|
||||
|
||||
// export {
|
||||
// convert,
|
||||
// sliceNumber,
|
||||
// convertEnToPe,
|
||||
// convertPeToEn,
|
||||
// e2p,
|
||||
// e2a,
|
||||
// p2e,
|
||||
// a2e,
|
||||
// p2a,
|
||||
// a2p,
|
||||
// };
|
11
public/img/haditha/font-icons/about-us.svg
Normal file
11
public/img/haditha/font-icons/about-us.svg
Normal file
|
@ -0,0 +1,11 @@
|
|||
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10.6668 1.83301H5.3335C2.66683 1.83301 1.3335 3.16634 1.3335 5.83301V14.4997C1.3335 14.8663 1.6335 15.1663 2.00016 15.1663H10.6668C13.3335 15.1663 14.6668 13.833 14.6668 11.1663V5.83301C14.6668 3.16634 13.3335 1.83301 10.6668 1.83301Z" stroke="#1B2132" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4.66748 6.83301H11.3341" stroke="url(#paint0_linear_67_3319)" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4.66748 10.166H9.33415" stroke="#1B2132" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_67_3319" x1="11.378" y1="6.83301" x2="4.33954" y2="7.69806" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#D284FF"/>
|
||||
<stop offset="1" stop-color="#4D00FF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 910 B |
4
public/img/haditha/font-icons/add.svg
Normal file
4
public/img/haditha/font-icons/add.svg
Normal file
|
@ -0,0 +1,4 @@
|
|||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.7002 12.2842H18.7002" stroke="#1B2132" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.7002 18.2842V6.28418" stroke="#1B2132" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
After Width: | Height: | Size: 304 B |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user