Squashed commit of the following:
commitb9f910cc5fMerge:ba3e70c064f341Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Fri Nov 21 08:55:22 2025 +0700 Merge pull request #177 from dikstub-rssa/feat/prescription Feat/prescription commit064f34177cMerge:88d89f2ba3e70cAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Nov 21 08:52:24 2025 +0700 Merge branch 'dev' into feat/prescription commitba3e70c854Merge:d75b32cd6c4a1eAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Fri Nov 21 08:46:33 2025 +0700 Merge pull request #176 from dikstub-rssa/feat/device-order Feat/device order commitd6c4a1ebb4Merge:a8a71d8d75b32cAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Nov 21 08:42:09 2025 +0700 Merge branch 'dev' into feat/device-order commitd75b32cc08Merge:79d8bfa2e48f11Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Fri Nov 21 08:38:51 2025 +0700 Merge pull request #172 from dikstub-rssa/feat/uploads-85-after-reset Fix: debug Uplaod Doc after reset commit2e48f11f9cMerge:c3f1f9979d8bfaAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Nov 21 08:38:37 2025 +0700 Merge branch 'dev' into feat/uploads-85-after-reset commit79d8bfa782Merge:f375724cffaa2bAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Fri Nov 21 08:19:55 2025 +0700 Merge pull request #170 from dikstub-rssa/feat/medicine-form-167 Feat/medicine form 167 commitcffaa2b855Merge:ac5fd26f375724Author: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Nov 21 08:17:43 2025 +0700 Merge branch 'dev' into feat/medicine-form-167 commitf375724be1Merge:2c07b9c6780a65Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Fri Nov 21 07:43:22 2025 +0700 Merge pull request #152 from dikstub-rssa/feat/general-consent-145 ✨ feat (encounter): implement general consent feature commit6780a65f04Merge:1f3ca6f2c07b9cAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Nov 21 07:43:08 2025 +0700 Merge branch 'dev' into feat/general-consent-145 commit2c07b9cde8Merge:baf6ab1dab6adcAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Fri Nov 21 07:31:13 2025 +0700 Merge pull request #148 from dikstub-rssa/feat/resume-81 Feat: UI Rehab Medik - Resume commit1f3ca6f19bAuthor: Abizrh <abizarah857@gmail.com> Date: Thu Nov 20 13:43:19 2025 +0700 🐛 fix (general-consent): fix type error when create encounter commitb379a9bc94Author: Abizrh <abizarah857@gmail.com> Date: Thu Nov 20 13:04:27 2025 +0700 ✨ feat (general-consent): display file url in diagnose dialog commitf1307980ffAuthor: Abizrh <abizarah857@gmail.com> Date: Thu Nov 20 00:35:25 2025 +0700 🐛 fix (general-consent): fix mapping data from api commit0d821cbe31Author: Abizrh <abizarah857@gmail.com> Date: Thu Nov 20 00:13:44 2025 +0700 ⚙️ chore (general-consent): adjust general consent list and form component commitcf4f5574d3Author: Abizrh <abizarah857@gmail.com> Date: Wed Nov 19 23:46:21 2025 +0700 ✨ feat (generate-file): add generate file schema commit6e34e175e7Merge:e62ee1bbaf6ab1Author: Abizrh <abizarah857@gmail.com> Date: Wed Nov 19 23:12:38 2025 +0700 Merge branch 'dev' of https://github.com/dikstub-rssa/simrs-fe into feat/general-consent-145 commita8a71d8978Merge:bfbe72bbaf6ab1Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 19 22:22:03 2025 +0700 Merge branch 'dev' into feat/device-order commit88d89f2a2dMerge:512f8e8391469eAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 19 22:21:36 2025 +0700 Merge branch 'feat/prescription' of github.com:dikstub-rssa/simrs-fe into feat/prescription commit512f8e8c91Merge:f41a51dbaf6ab1Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 19 22:19:45 2025 +0700 Merge branch 'dev' into feat/prescription commitbaf6ab1fdaAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Wed Nov 19 20:09:19 2025 +0700 dev: hotfix, pubs + my-ui/confirmation/confirmation noTrueSlot from record-confirmation + my-ui/confirmation/confirmation additional message + my-ui/confirmation/record-confirmation supplies noTrueSlot + my-ui/modal/modal text size + my-ui/doc-entry semicolon export commitf41a51d9d0Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 19 10:58:26 2025 +0700 feat/prescription: cleaning commitc3f1f997b3Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 19 10:22:12 2025 +0700 Fix: refactor upload API url commitbfbe72be94Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 19 03:36:24 2025 +0700 feat/device-order: final commit0a68dbf3a6Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 18 15:31:04 2025 +0700 Fix: debug after reset commitac5fd26399Merge:94e4eadbcfb4c1Author: Muhammad Hasyim Chaidir Ali <68959522+Hasyim-Kai@users.noreply.github.com> Date: Tue Nov 18 13:33:09 2025 +0700 Merge branch 'dev' into feat/medicine-form-167 commit94e4ead8feAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 18 13:13:52 2025 +0700 Fix: debug updaate medicine master commitc98018bb4eAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 18 12:58:58 2025 +0700 Squashed commit of the following: commitbcfb4c1456Merge:1cbde57975c87dAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Mon Nov 17 11:15:14 2025 +0700 Merge pull request #147 from dikstub-rssa/feat/surat-kontrol-135 Feat: Integration Rehab Medik - Surat Kontrol commit975c87d99aMerge:f5820901cbde57Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 17 10:58:10 2025 +0700 Merge branch 'dev' into feat/surat-kontrol-135 commitf582090d18Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Thu Nov 13 11:56:21 2025 +0700 Fix: Refactor surat kontrol commita14c4a5d3cAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 11 14:21:58 2025 +0700 Fix: Refactor Surat Kontrol CRUD {id} to {code} commit24313adef6Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 7 10:35:46 2025 +0700 Fix: debug back btn in add, edit, detail content page commit59b44b5729Merge:99a61a0db15ec9Author: Muhammad Hasyim Chaidir Ali <68959522+Hasyim-Kai@users.noreply.github.com> Date: Fri Nov 7 09:11:10 2025 +0700 Merge branch 'dev' into feat/surat-kontrol-135 commit99a61a0bf2Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Thu Nov 6 08:06:01 2025 +0700 Feat: add right & bottom label in input base component commitdb48919325Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 5 13:53:43 2025 +0700 Feat: add banner in List if requirement not met commitbd57250f7eAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 5 13:26:48 2025 +0700 Fix: refactor getDetail url param commita361922e32Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 5 13:19:07 2025 +0700 Feat: Add & integrate add, edit, detail page commit331f4a6b20Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 4 16:56:08 2025 +0700 Feat: Integrate Control Letter commit2275f4dc99Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Oct 27 14:01:58 2025 +0700 Feat: add UI BPJS > Surat Kontrol commit89e0e7a2c8Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Oct 27 10:21:59 2025 +0700 Feat: add UI CRUD Surat Kontrol at Rehab Medik > kunjungan > Proses commitdab6adc4a9Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 18 11:19:48 2025 +0700 Fix: add role authorization in Resume commitc28fc8f7aaMerge:7ed1cc8bcfb4c1Author: Muhammad Hasyim Chaidir Ali <68959522+Hasyim-Kai@users.noreply.github.com> Date: Tue Nov 18 09:02:16 2025 +0700 Merge branch 'dev' into feat/resume-81 commit7ed1cc83bfAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 17 15:04:01 2025 +0700 Feat: add doc preview in Resume List commitbcfb4c1456Merge:1cbde57975c87dAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Mon Nov 17 11:15:14 2025 +0700 Merge pull request #147 from dikstub-rssa/feat/surat-kontrol-135 Feat: Integration Rehab Medik - Surat Kontrol commit975c87d99aMerge:f5820901cbde57Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 17 10:58:10 2025 +0700 Merge branch 'dev' into feat/surat-kontrol-135 commit15ab43c1b1Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 17 10:38:21 2025 +0700 Feat: add verification capthca and form adjustment commitdc0bcc3606Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 17 09:26:29 2025 +0700 Feat: integration Medicine Form commitdfb2c305caMerge:1cbde57d0aa69dAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 17 09:18:47 2025 +0700 Merge remote-tracking branch 'origin/feat/uploads-85' into feat/medicine-form-167 commit468c6a164fMerge:72532721cbde57Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Nov 17 07:12:38 2025 +0700 Merge branch 'dev' into feat/device-order commit20649c5917Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Nov 16 19:52:22 2025 +0700 feat/prescription: finalize #1 + integration + non mix entry commit0da8701a6cAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Nov 16 08:15:19 2025 +0700 feat/prescription: added group and flat list commit7253272681Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Nov 16 11:21:02 2025 +0700 feat/device-order: adjustment wip commit391469e633Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Nov 16 08:15:19 2025 +0700 feat/prescription: added group and flat list commitb1dbae7928Merge:b8478861cbde57Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Nov 16 08:14:09 2025 +0700 Merge branch 'dev' into feat/prescription commit1cbde57cf9Author: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Sun Nov 16 00:44:53 2025 +0700 dev: hotfix comps/pub/myui + updated data/types + updated data-table + updated nav-header + added toggle comps/pub/ui + updated button + updated toggle commitb847886601Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Nov 15 22:40:23 2025 +0700 feat/prescription: more adjustment commit83cdd070edMerge:224bc7cccabe01Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Nov 15 20:15:18 2025 +0700 Merge branch 'dev' into feat/prescription commit224bc7cd61Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Nov 15 20:13:15 2025 +0700 feat/prescription: integrated non-mix commitccabe0177bAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Nov 14 16:39:21 2025 +0700 dev: hotfix, added combobox objectsToItems commitd0aa69d9a1Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 14 17:12:17 2025 +0700 Fix: debug table typo Uplaod Doc commitbb0017ffcbAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 14 15:47:11 2025 +0700 Fix: refactor constList Uplaod Doc commit60c13649d9Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 14 14:55:32 2025 +0700 Fix: debug Uplaod Doc commit1d03258f44Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 14 14:08:47 2025 +0700 Fix: Typo uplaod doc type commit56109564cbAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Thu Nov 13 16:16:26 2025 +0700 Feat: API Integration supporting doc upload commitcbe1883c9fMerge:7f3fe810d97ba9Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Thu Nov 13 13:42:44 2025 +0700 Merge branch 'dev' into feat/device-order-x commitf582090d18Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Thu Nov 13 11:56:21 2025 +0700 Fix: Refactor surat kontrol commit0d97ba9d25Merge:02508b2bb8df3dAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Thu Nov 13 11:52:23 2025 +0700 Merge pull request #164 from dikstub-rssa/feeat/pendaftaran-kemoterapi-141 Feat: Pendaftaran Kemoterapi commit16626a2feeAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Thu Nov 13 11:49:28 2025 +0700 feat/prescription: added submit commitbb8df3d53aMerge:a592a0b02508b2Author: riefive <rie.five@gmail.com> Date: Thu Nov 13 10:14:17 2025 +0700 Merge branch 'dev' of https://github.com/dikstub-rssa/simrs-fe into feeat/pendaftaran-kemoterapi-141 commit02508b22deMerge:6b933de295bb81Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Thu Nov 13 07:56:31 2025 +0700 Merge pull request #162 from dikstub-rssa/fe-prescription-56 Fe prescription 56 commit295bb8120fMerge:8462eba6b933deAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Thu Nov 13 07:45:48 2025 +0700 Merge branch 'dev' into fe-prescription-56 commit6b933de212Merge:f2e98fc471c846Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Wed Nov 12 07:13:11 2025 +0700 Merge pull request #156 from dikstub-rssa/feat/cp-lab-order-48 Feat/cp lab order 48 commitf2e98fc732Merge:2e899c69b281deAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Wed Nov 12 07:12:40 2025 +0700 Merge pull request #158 from dikstub-rssa/feat/menu-structure Feat/menu structure commit471c846045Merge:f676c8a2e899c6Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 12 07:11:46 2025 +0700 Merge branch 'dev' into feat/cp-lab-order-48 commit9b281de00bMerge:80383a52e899c6Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 12 07:08:29 2025 +0700 Merge branch 'dev' into feat/menu-structure commit2e899c6022Merge:8effefbb7d4fcfAuthor: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Wed Nov 12 07:04:47 2025 +0700 Merge pull request #157 from dikstub-rssa/feat/encounter-status-107 Feat/encounter status 107 commit8effefb5adMerge:3f63f198e7f9b1Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Wed Nov 12 07:04:17 2025 +0700 Merge pull request #155 from dikstub-rssa/feat/radiology-order-54 Feat/radiology order 54 commit80383a5f0aAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 12 06:52:31 2025 +0700 feat/menu-structure: adjust page rehab commit93c9e74d08Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 12 06:52:14 2025 +0700 feat/menu-structure: adjust menu items all roles commitf0d2bc4de1Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 12 06:51:37 2025 +0700 feat/menu-structure: update access control commit02c14089f1Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 12 06:51:03 2025 +0700 feat/menu-structure: update role switcher commita14c4a5d3cAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 11 14:21:58 2025 +0700 Fix: Refactor Surat Kontrol CRUD {id} to {code} commite9e0e21d1bAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Tue Nov 11 12:30:43 2025 +0700 feat/menu-structure: wip commite62ee1b37eAuthor: Abizrh <abizarah857@gmail.com> Date: Tue Nov 11 08:57:49 2025 +0700 ✨ feat (encounter): implement general consent feature commit8e7f9b19e3Author: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Mon Nov 10 23:17:49 2025 +0700 feat/radiology-order-54: upgraded mcu-order/list commitb2a512314bAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 7 14:02:54 2025 +0700 Feat: UI uplaod doc pendukung commit24313adef6Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 7 10:35:46 2025 +0700 Fix: debug back btn in add, edit, detail content page commit59b44b5729Merge:99a61a0db15ec9Author: Muhammad Hasyim Chaidir Ali <68959522+Hasyim-Kai@users.noreply.github.com> Date: Fri Nov 7 09:11:10 2025 +0700 Merge branch 'dev' into feat/surat-kontrol-135 commit53bd8e7f6eAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Fri Nov 7 08:55:23 2025 +0700 Fix: refactor rehab medik - Resume UI commit99a61a0bf2Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Thu Nov 6 08:06:01 2025 +0700 Feat: add right & bottom label in input base component commit8462eba94bAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Nov 5 21:23:04 2025 +0700 feat/prescription-56: wip commitdb48919325Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 5 13:53:43 2025 +0700 Feat: add banner in List if requirement not met commitbd57250f7eAuthor: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 5 13:26:48 2025 +0700 Fix: refactor getDetail url param commita361922e32Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 5 13:19:07 2025 +0700 Feat: Add & integrate add, edit, detail page commit331f4a6b20Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 4 16:56:08 2025 +0700 Feat: Integrate Control Letter commita592a0be36Author: riefive <rie.five@gmail.com> Date: Tue Nov 4 15:15:38 2025 +0700 feat(cemo): add home encounter commitbe0a761170Author: riefive <rie.five@gmail.com> Date: Tue Nov 4 13:23:52 2025 +0700 feat(cemo): change flow admin commit64fe2524fbAuthor: riefive <rie.five@gmail.com> Date: Tue Nov 4 12:02:31 2025 +0700 feat(cemo): enhance admin mode functionality and update series handling commitfb7731188dAuthor: riefive <rie.five@gmail.com> Date: Mon Nov 3 15:52:35 2025 +0700 feat(cemo): add mode adm + series commit89b2fb9cd9Author: riefive <rie.five@gmail.com> Date: Mon Nov 3 15:03:56 2025 +0700 feat(chemo): add page process and modify components commitf676c8a4b9Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Nov 3 08:11:02 2025 +0700 feat/cp-lab-order-48: wip commit69ffe6bd49Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Fri Oct 31 14:35:39 2025 +0700 feat/radiology-order: added the page commitd1369d513bAuthor: riefive <rie.five@gmail.com> Date: Fri Oct 31 16:08:22 2025 +0700 feat(cemo): add list verification commita9ab75fd98Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Fri Oct 31 14:35:05 2025 +0700 feat/readiology-order: added mcu commit71d68e5a0eAuthor: riefive <rie.five@gmail.com> Date: Fri Oct 31 14:49:21 2025 +0700 feat(cemo): add dialog verification and list register commitf8d906b6c2Merge:66872c95f9e441Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Fri Oct 31 14:48:21 2025 +0700 Merge branch 'dev' into fe-prescription-56 commit40d78a999aAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Fri Oct 31 14:35:05 2025 +0700 feat/readiology-order: added mcu commitb3502df0f8Merge:831749a7119f67Author: riefive <rie.five@gmail.com> Date: Fri Oct 31 13:12:11 2025 +0700 Merge branch 'feat/fe-kemoterapi' into feeat/pendaftaran-kemoterapi-141 commit7119f67402Author: riefive <rie.five@gmail.com> Date: Fri Oct 31 13:09:59 2025 +0700 feat(cemo): modify schema commit66872c95f8Author: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Oct 31 07:56:36 2025 +0700 feat/prescription-56: wip commit45cc019ec1Author: riefive <rie.five@gmail.com> Date: Thu Oct 30 15:43:50 2025 +0700 feat(cemo): layouting form commite866c0cf2aAuthor: riefive <rie.five@gmail.com> Date: Thu Oct 30 14:41:52 2025 +0700 feat(cemo): layouting protocol commitdc4edc1dc0Author: riefive <rie.five@gmail.com> Date: Wed Oct 29 15:58:52 2025 +0700 feat(cemo): show list cemo commit3234853473Author: riefive <rie.five@gmail.com> Date: Wed Oct 29 15:39:55 2025 +0700 feat(cemo): add list of cemo commitfc308809b8Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Oct 29 14:57:19 2025 +0700 Feat: add UI Rehab Medik > Proses > Resume commit9b383a5437Merge:a4dc7d7831749aAuthor: Muhammad Hasyim Chaidir Ali <68959522+Hasyim-Kai@users.noreply.github.com> Date: Wed Oct 29 13:32:47 2025 +0700 Merge pull request #139 from dikstub-rssa/dev Update branch feat/resume-81 commit67ee129f4bMerge:9919b4b9e82d17Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Tue Oct 28 16:20:17 2025 +0700 Merge branch 'dev' into fe-prescription-56 commit2275f4dc99Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Oct 27 14:01:58 2025 +0700 Feat: add UI BPJS > Surat Kontrol commit89e0e7a2c8Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Oct 27 10:21:59 2025 +0700 Feat: add UI CRUD Surat Kontrol at Rehab Medik > kunjungan > Proses commit9919b4b896Merge:19a43bde93e72aAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Oct 25 15:36:29 2025 +0700 Merge branch 'dev' into fe-prescription-56 commitb7d4fcf939Merge:eaac4aae93e72aAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Oct 25 15:31:30 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commit19a43bd291Merge:d90e4003558672Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Oct 25 05:02:57 2025 +0700 Merge branch 'dev' into fe-prescription-56 commiteaac4aab85Merge:72e8d433558672Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Oct 25 05:01:45 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commitd90e40043cMerge:0c9f9deb90f0c1Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Fri Oct 24 12:40:59 2025 +0700 Merge branch 'dev' into fe-prescription-56 commit0c9f9deb7eAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Fri Oct 24 12:38:02 2025 +0700 fe-prescription-56: wip commit729474a2a0Merge:7159bd6ddd35d6Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Thu Oct 23 14:16:52 2025 +0700 Merge branch 'dev' into fe-prescription-56 commit7f3fe813c5Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Thu Oct 23 14:09:01 2025 +0700 feat/device-order: wip commit72e8d431d6Merge:3f77d922a9b78aAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Oct 22 07:17:41 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commit1b1fac7695Merge:0b4420627ab7c2Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Oct 22 04:28:31 2025 +0700 Merge branch 'dev' into feat/device-order-x commit3f77d927b6Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Tue Oct 21 22:48:34 2025 +0700 feat/encounter: done commitd8c861d60cMerge:6bdee6627ab7c2Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Tue Oct 21 00:15:01 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commit0b4420620dMerge:39af60502b2b76Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 20 13:35:00 2025 +0700 Merge branch 'dev' into feat/device-order-58 commit02b2b7657cMerge:7ddb14ae1942d1Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 20 11:24:54 2025 +0700 Merge branch 'dev' of github.com:dikstub-rssa/simrs-fe into dev commit39af6052e7Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 20 11:22:54 2025 +0700 feat/device-order-58: wip commit7ddb14acccAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Mon Oct 13 16:38:23 2025 +0700 dev: hotfix, added userQueryCRUD commit7159bd6566Merge:ccc9b0bbe5768bAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 13 07:45:15 2025 +0700 Merge branch 'dev' into fe-prescription-56 commitccc9b0bda3Merge:f94ccd7cad7ac6Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 13 06:29:03 2025 +0700 Merge branch 'dev' into fe-prescription-56 commit6bdee66cc6Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 13 06:26:30 2025 +0700 feat/encounter: wip commitf7c53fc4e5Merge:a7c7ef6cad7ac6Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 13 06:24:45 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commita7c7ef6dd8Merge:89b051bf52e516Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Oct 12 13:27:06 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commit89b051b883Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Oct 12 13:18:46 2025 +0700 feat/encounter-status-107: wip commit743c38804aMerge:d6d60e3f7b66d2Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Oct 12 11:53:03 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commitd6d60e38d0Merge:9530cdd18e00bfAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Oct 12 11:49:49 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commit18e00bf89aAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Sun Oct 12 11:40:53 2025 +0700 dev: hotfix, text-size standardization commit9530cdd4f9Merge:0820cb60d1e469Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Oct 12 11:41:49 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commit0d1e469eceAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Sun Oct 12 11:40:53 2025 +0700 dev: hotfix, text-size standardization commit0820cb653cMerge:fff1ce0867c1b4Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Oct 11 00:38:10 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commitfff1ce0eb7Merge:1a3edd53a4b2aaAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sat Oct 11 00:35:16 2025 +0700 Merge branch 'dev' into feat/encounter-status-107 commit3a4b2aa6fbAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Sat Oct 11 00:25:44 2025 +0700 dev: hotfix, moved combobox and datepicker commit1a3edd5a1eAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Fri Oct 10 23:58:44 2025 +0700 dev: hotfix, moved combobox and datepicker commitf94ccd707bMerge:064767551d1221Author: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Wed Oct 8 08:00:01 2025 +0700 Merge branch 'feat/consultation-82' into fe-prescription-56 commit06476756fbAuthor: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Wed Oct 8 07:58:48 2025 +0700 fe-prescription-56: wip commitfdbcfed87fMerge:4da896abd66a88Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Tue Oct 7 03:10:19 2025 +0700 Merge branch 'dev' into fe-prescription-56 commitbd66a8887dMerge:19e00faba61d05Author: Munawwirul Jamal <57973347+munaja@users.noreply.github.com> Date: Tue Oct 7 03:07:46 2025 +0700 Merge pull request #103 from dikstub-rssa/feat/fe-integrasi-org-src-72 Feat - Integrasi Org Src commitba61d05257Author: riefive <rie.five@gmail.com> Date: Mon Oct 6 12:42:08 2025 +0700 fix: adjustment division app + flow commit8601d4a4fdAuthor: riefive <rie.five@gmail.com> Date: Mon Oct 6 11:07:05 2025 +0700 fix: remove shared handlers commitfff5f2c11dAuthor: riefive <rie.five@gmail.com> Date: Mon Oct 6 11:06:29 2025 +0700 fix: update content list of specialist, subspecialist, etc commit301cb82803Author: riefive <rie.five@gmail.com> Date: Mon Oct 6 11:00:14 2025 +0700 fix: update list medicine commit3003ec9d80Author: riefive <rie.five@gmail.com> Date: Mon Oct 6 10:45:15 2025 +0700 fix: update list division + equipment commitd1bcd6e66cAuthor: riefive <rie.five@gmail.com> Date: Mon Oct 6 10:38:10 2025 +0700 fix: update some service commit78ae8a8aa0Author: riefive <rie.five@gmail.com> Date: Mon Oct 6 10:26:25 2025 +0700 fix: medicine method and group commit8eaf95dd3eAuthor: riefive <rie.five@gmail.com> Date: Mon Oct 6 10:20:05 2025 +0700 fix: update service for unit and uom commit58c0dde377Author: riefive <rie.five@gmail.com> Date: Mon Oct 6 10:14:51 2025 +0700 fix: update handler for unit and uom commitfe23c75acaAuthor: riefive <rie.five@gmail.com> Date: Mon Oct 6 10:09:24 2025 +0700 fix: update some service and handlers commit4da896a242Merge:285c3ee19e00faAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 6 09:55:24 2025 +0700 Merge branch 'dev' into fe-prescription-56 commitecdc5d80d9Author: riefive <rie.five@gmail.com> Date: Mon Oct 6 09:51:31 2025 +0700 fix: update device service and handler commit45ea70d415Author: riefive <rie.five@gmail.com> Date: Mon Oct 6 09:44:48 2025 +0700 fix: update crud base commit51ddb9d8b5Merge:42a54bb19e00faAuthor: riefive <rie.five@gmail.com> Date: Mon Oct 6 09:40:22 2025 +0700 fix: resolve conflict commit19e00fa143Author: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Mon Oct 6 08:26:08 2025 +0700 dev: hotfix, moved encounter to pub/component commit285c3ee4e5Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 6 07:56:29 2025 +0700 Merged Stash commit421159971eAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 6 04:41:21 2025 +0700 feat/prescription-56: wip commit3a45de413dAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 6 04:31:08 2025 +0700 Merge from Stash commite959c3ae61Merge:32c69afad4695cAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Oct 6 04:21:06 2025 +0700 Merge branch 'dev' into fe-prescription-56 commitad4695c867Author: Munawwirul Jamal <munawwirul.jamal@gmail.com> Date: Mon Oct 6 04:18:55 2025 +0700 dev: hotfix, encounter content back nav commit42a54bbb3bMerge:a7cbbee55559a4Author: riefive <rie.five@gmail.com> Date: Sat Oct 4 09:07:03 2025 +0700 fix: solve conflict after pull commita7cbbeeda9Author: riefive <rie.five@gmail.com> Date: Sat Oct 4 09:05:28 2025 +0700 feat(division): fixing logic treeview commit71e0615ee1Author: riefive <rie.five@gmail.com> Date: Sat Oct 4 08:49:38 2025 +0700 feat(division): restructure division parent commitf02903e756Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 15:00:10 2025 +0700 feat(division): change parent id to number before integrate commit2e8667a780Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 14:47:02 2025 +0700 feat(division): parent id to default null commite65e562690Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 12:45:05 2025 +0700 feat(division): change form attribute commit9407501c49Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 11:03:19 2025 +0700 feat(division): change compoent combobox to tree select commitc5ba07a226Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 10:54:35 2025 +0700 feat(division): create tree item converter for division commit8e7ce771b0Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 15:31:27 2025 +0700 test: call division position commit7edab33427Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:49:55 2025 +0700 fix: handler reset state commitce59eac86cAuthor: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:37:17 2025 +0700 fix: list unit commit39d2869ffbAuthor: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:34:19 2025 +0700 fix: list with params error commit3c046a4d82Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:12:10 2025 +0700 fix: list integration commit6feb480a51Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 11:16:23 2025 +0700 fix: change get encounter class to constants commitd7d984810eAuthor: riefive <rie.five@gmail.com> Date: Thu Oct 2 11:00:05 2025 +0700 remove previous list + form from any features commita6377ef943Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 15:24:54 2025 +0700 fix: includes for unit commitb00b9b198eAuthor: riefive <rie.five@gmail.com> Date: Wed Oct 1 15:17:31 2025 +0700 fix: includes for medicine list commit4908f16770Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 14:56:11 2025 +0700 fix: search on list file commit41405ae113Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 14:36:48 2025 +0700 fix: resolve list organization source commit6b69e48bd6Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 13:05:36 2025 +0700 feat(installation): add encounter list commit59847dce34Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 13:01:24 2025 +0700 chore: add shared handlers commite78342829eAuthor: riefive <rie.five@gmail.com> Date: Wed Oct 1 12:38:04 2025 +0700 feat(installation): integrate api installation commit55559a4683Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 15:00:10 2025 +0700 feat(division): change parent id to number before integrate commit2d8c751788Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 14:47:02 2025 +0700 feat(division): parent id to default null commitf374f9ef5bAuthor: riefive <rie.five@gmail.com> Date: Fri Oct 3 12:45:05 2025 +0700 feat(division): change form attribute commit1837afce6cAuthor: riefive <rie.five@gmail.com> Date: Fri Oct 3 11:03:19 2025 +0700 feat(division): change compoent combobox to tree select commit539a1cefb0Author: riefive <rie.five@gmail.com> Date: Fri Oct 3 10:54:35 2025 +0700 feat(division): create tree item converter for division commit32c69af4e1Merge:075285510bbee9Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Fri Oct 3 06:05:35 2025 +0700 Merge branch 'feat/layout-cleaning' into fe-prescription-56 commit757b8c0444Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 15:31:27 2025 +0700 test: call division position commit378e6773b8Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:49:55 2025 +0700 fix: handler reset state commit0e115eed5eAuthor: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:37:17 2025 +0700 fix: list unit commitd544d031c3Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:34:19 2025 +0700 fix: list with params error commit693d8225bfAuthor: riefive <rie.five@gmail.com> Date: Thu Oct 2 14:12:10 2025 +0700 fix: list integration commit0752855808Merge:f83dbfec0557ccAuthor: Andrian Roshandy <andrianovsky95@gmail.com> Date: Thu Oct 2 12:46:54 2025 +0700 Merge branch 'dev' into fe-prescription-56 commitfc3bda14f4Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 11:16:23 2025 +0700 fix: change get encounter class to constants commit9603915fd7Author: riefive <rie.five@gmail.com> Date: Thu Oct 2 11:00:05 2025 +0700 remove previous list + form from any features commit546423bdfbAuthor: riefive <rie.five@gmail.com> Date: Wed Oct 1 15:24:54 2025 +0700 fix: includes for unit commitdb48233f6cAuthor: riefive <rie.five@gmail.com> Date: Wed Oct 1 15:17:31 2025 +0700 fix: includes for medicine list commit54a5aaa78fAuthor: riefive <rie.five@gmail.com> Date: Wed Oct 1 14:56:11 2025 +0700 fix: search on list file commitcc41118570Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 14:36:48 2025 +0700 fix: resolve list organization source commit6a7a9cda80Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 13:05:36 2025 +0700 feat(installation): add encounter list commitc96d738379Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 13:01:24 2025 +0700 chore: add shared handlers commita48f375018Author: riefive <rie.five@gmail.com> Date: Wed Oct 1 12:38:04 2025 +0700 feat(installation): integrate api installation commitf83dbfeae3Merge:ba77ed1f29eb38Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Wed Oct 1 04:02:05 2025 +0700 Merge branch 'feat/layout-cleaning' into fe-prescription-56 commitba77ed1bb5Merge:4fbd8ee97d36f1Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Mon Sep 29 08:27:01 2025 +0700 Merge branch 'dev' into fe-prescription-56 commit4fbd8ee757Author: Andrian Roshandy <andrianovsky95@gmail.com> Date: Sun Sep 28 07:10:32 2025 +0700 feat/prescription-56: merapikan models
This commit is contained in:
@@ -8,6 +8,8 @@ interface ConfirmationProps {
|
||||
message?: string
|
||||
confirmText?: string
|
||||
cancelText?: string
|
||||
noTrueSlot?: boolean
|
||||
skipClosingMessage?: boolean
|
||||
variant?: 'default' | 'destructive' | 'warning'
|
||||
size?: 'sm' | 'md' | 'lg' | 'xl'
|
||||
}
|
||||
@@ -71,20 +73,22 @@ function handleCancel() {
|
||||
<Dialog v-model:open="isOpen" :title="title" :size="size">
|
||||
<div class="space-y-4">
|
||||
<!-- Icon dan pesan -->
|
||||
<div class="flex items-center gap-3">
|
||||
<div :class="[variantClasses.icon, variantClasses.iconColor]" class="w-6 h-6 mt-1 flex-shrink-0" />
|
||||
<div class="flex items-start gap-3">
|
||||
<div :class="[variantClasses.icon, variantClasses.iconColor]" class="w-4 h-4 2xl:h-5 2xl:h-6 flex-shrink-0" />
|
||||
<div class="flex-1">
|
||||
<p class="text-sm text-muted-foreground leading-relaxed">
|
||||
{{ message }}
|
||||
</p>
|
||||
{{ message }} {{ !noTrueSlot ? ' dengan informasi sebagai berikut:' : '.' }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Slot untuk konten custom -->
|
||||
<div v-if="$slots.default">
|
||||
<div>
|
||||
<slot />
|
||||
</div>
|
||||
|
||||
<div v-if="!skipClosingMessage" class="">
|
||||
Lanjutkan Proses?
|
||||
</div>
|
||||
|
||||
<!-- Footer buttons -->
|
||||
<div class="flex justify-end gap-3 pt-4">
|
||||
<Button variant="outline" @click="handleCancel">
|
||||
|
||||
@@ -46,31 +46,31 @@ const actionConfig = computed(() => {
|
||||
const configs = {
|
||||
delete: {
|
||||
title: 'Hapus Data',
|
||||
message: 'Apakah Anda yakin ingin menghapus data ini? Tindakan ini tidak dapat dibatalkan.',
|
||||
message: 'Akan dilakukan penghapusan data',
|
||||
confirmText: 'Hapus',
|
||||
variant: 'destructive' as const,
|
||||
},
|
||||
deactivate: {
|
||||
title: 'Nonaktifkan Data',
|
||||
message: 'Apakah Anda yakin ingin menonaktifkan data ini?',
|
||||
message: 'Akan dilakukan peng-nonaktifkan data',
|
||||
confirmText: 'Nonaktifkan',
|
||||
variant: 'warning' as const,
|
||||
},
|
||||
activate: {
|
||||
title: 'Aktifkan Data',
|
||||
message: 'Apakah Anda yakin ingin mengaktifkan data ini?',
|
||||
message: 'Akan dilakukan pengaktifkan data',
|
||||
confirmText: 'Aktifkan',
|
||||
variant: 'default' as const,
|
||||
},
|
||||
archive: {
|
||||
title: 'Arsipkan Data',
|
||||
message: 'Apakah Anda yakin ingin mengarsipkan data ini?',
|
||||
message: 'Akan dilakukan pengarsipan data',
|
||||
confirmText: 'Arsipkan',
|
||||
variant: 'warning' as const,
|
||||
},
|
||||
restore: {
|
||||
title: 'Pulihkan Data',
|
||||
message: 'Apakah Anda yakin ingin memulihkan data ini?',
|
||||
message: 'Akan dilakukan pemulihan data',
|
||||
confirmText: 'Pulihkan',
|
||||
variant: 'default' as const,
|
||||
},
|
||||
@@ -107,6 +107,8 @@ const finalCancelText = computed(() => {
|
||||
function handleConfirm() {
|
||||
if (props.record) {
|
||||
emit('confirm', props.record, props.action)
|
||||
} else {
|
||||
emit('confirm', { id: 0 }, 'confirmed')
|
||||
}
|
||||
emit('update:open', false)
|
||||
}
|
||||
@@ -119,11 +121,13 @@ function handleCancel() {
|
||||
|
||||
<template>
|
||||
<Confirmation
|
||||
v-model:open="isOpen" :title="finalTitle" :message="finalMessage" :confirm-text="finalConfirmText"
|
||||
:cancel-text="finalCancelText" :variant="actionConfig.variant" size="md" @confirm="handleConfirm"
|
||||
v-model:open="isOpen" :variant="actionConfig.variant" size="md"
|
||||
:title="finalTitle" :message="finalMessage"
|
||||
:confirm-text="finalConfirmText" :cancel-text="finalCancelText"
|
||||
:no-true-slot="$slots.default ? false : true"
|
||||
@confirm="handleConfirm"
|
||||
@cancel="handleCancel"
|
||||
>
|
||||
<!-- Slot untuk informasi tambahan record -->
|
||||
>
|
||||
<div v-if="record && $slots.default" class="mt-4 p-3 bg-muted rounded-md">
|
||||
<slot :record="record" :action="action" />
|
||||
</div>
|
||||
|
||||
@@ -22,7 +22,7 @@ const selected = ref<any[]>([])
|
||||
function toggleSelection(row: any, event?: Event) {
|
||||
if (event) event.stopPropagation() // cegah event bubble ke TableRow
|
||||
|
||||
const isMultiple = props.selectMode === 'multiple' // props.selectMode === 'multi' ||
|
||||
const isMultiple = props.selectMode === 'multiple' // props.selectMode === 'multi' ||
|
||||
|
||||
// gunakan pembanding berdasarkan id atau stringify data
|
||||
const findIndex = selected.value.findIndex((r) => JSON.stringify(r) === JSON.stringify(row))
|
||||
@@ -128,7 +128,7 @@ function handleActionCellClick(event: Event, _cellRef: string) {
|
||||
'bg-green-50':
|
||||
props.selectMode === 'single' && selected.some((r) => JSON.stringify(r) === JSON.stringify(row)),
|
||||
'bg-blue-50':
|
||||
(props.selectMode === 'multiple') && // props.selectMode === 'multi' ||
|
||||
(props.selectMode === 'multiple') && // props.selectMode === 'multi' ||
|
||||
selected.some((r) => JSON.stringify(r) === JSON.stringify(row)),
|
||||
}"
|
||||
@click="toggleSelection(row)"
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
<script setup lang="ts">
|
||||
import type { LinkItem, ListItemDto } from './types'
|
||||
import { ActionEvents } from './types'
|
||||
|
||||
const props = defineProps<{
|
||||
rec: ListItemDto
|
||||
}>()
|
||||
|
||||
const recId = inject<Ref<number>>('rec_id')!
|
||||
const recAction = inject<Ref<string>>('rec_action')!
|
||||
const recItem = inject<Ref<any>>('rec_item')!
|
||||
const timestamp = inject<Ref<number>>('timestamp')!
|
||||
const activeKey = ref<string | null>(null)
|
||||
const linkItems: LinkItem[] = [
|
||||
{
|
||||
label: 'Detail',
|
||||
onClick: () => {
|
||||
detail()
|
||||
},
|
||||
icon: 'i-lucide-eye',
|
||||
},
|
||||
{
|
||||
label: 'Hapus',
|
||||
onClick: () => {
|
||||
del()
|
||||
},
|
||||
icon: 'i-lucide-trash',
|
||||
},
|
||||
]
|
||||
|
||||
function detail() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showDetail
|
||||
recItem.value = props.rec
|
||||
timestamp.value = Date.now()
|
||||
}
|
||||
|
||||
function del() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showConfirmDelete
|
||||
recItem.value = props.rec
|
||||
timestamp.value = Date.now()
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger as-child>
|
||||
<SidebarMenuButton
|
||||
size="lg"
|
||||
class="data-[state=open]:text-sidebar-accent-foreground data-[state=open]:bg-white dark:data-[state=open]:bg-slate-800"
|
||||
>
|
||||
<Icon
|
||||
name="i-lucide-chevrons-up-down"
|
||||
class="ml-auto size-4"
|
||||
/>
|
||||
</SidebarMenuButton>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent
|
||||
class="w-[--radix-dropdown-menu-trigger-width] min-w-40 rounded-lg border border-slate-200 bg-white text-black dark:border-slate-700 dark:bg-slate-800 dark:text-white"
|
||||
align="end"
|
||||
>
|
||||
<DropdownMenuGroup>
|
||||
<DropdownMenuItem
|
||||
v-for="item in linkItems"
|
||||
:key="item.label"
|
||||
class="hover:bg-gray-100 dark:hover:bg-slate-700"
|
||||
@click="item.onClick"
|
||||
@mouseenter="activeKey = item.label"
|
||||
@mouseleave="activeKey = null"
|
||||
>
|
||||
<Icon :name="item.icon ?? ''" />
|
||||
<span :class="activeKey === item.label ? 'text-sidebar-accent-foreground' : ''">{{ item.label }}</span>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuGroup>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</div>
|
||||
</template>
|
||||
@@ -0,0 +1,95 @@
|
||||
<script setup lang="ts">
|
||||
import type { LinkItem, ListItemDto } from './types'
|
||||
import { ActionEvents } from './types'
|
||||
|
||||
interface Props {
|
||||
rec: ListItemDto
|
||||
size?: 'default' | 'sm' | 'lg'
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
size: 'lg',
|
||||
})
|
||||
|
||||
const recId = inject<Ref<number>>('rec_id')!
|
||||
const recAction = inject<Ref<string>>('rec_action')!
|
||||
const recItem = inject<Ref<any>>('rec_item')!
|
||||
const activeKey = ref<string | null>(null)
|
||||
const linkItems: LinkItem[] = [
|
||||
{
|
||||
label: 'Detail',
|
||||
onClick: () => {
|
||||
detail()
|
||||
},
|
||||
icon: 'i-lucide-eye',
|
||||
},
|
||||
{
|
||||
label: 'Submit',
|
||||
onClick: () => {
|
||||
submit()
|
||||
},
|
||||
icon: 'i-lucide-check',
|
||||
},
|
||||
{
|
||||
label: 'Hapus',
|
||||
onClick: () => {
|
||||
del()
|
||||
},
|
||||
icon: 'i-lucide-trash',
|
||||
},
|
||||
]
|
||||
|
||||
function detail() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showDetail
|
||||
recItem.value = props.rec
|
||||
}
|
||||
|
||||
function submit() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showConfirmSubmit
|
||||
recItem.value = props.rec
|
||||
}
|
||||
|
||||
function del() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showConfirmDelete
|
||||
recItem.value = props.rec
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger as-child>
|
||||
<SidebarMenuButton
|
||||
:size="size"
|
||||
class="data-[state=open]:text-sidebar-accent-foreground data-[state=open]:bg-white dark:data-[state=open]:bg-slate-800"
|
||||
>
|
||||
<Icon
|
||||
name="i-lucide-chevrons-up-down"
|
||||
class="ml-auto size-4"
|
||||
/>
|
||||
</SidebarMenuButton>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent
|
||||
class="w-[--radix-dropdown-menu-trigger-width] min-w-40 rounded-lg border border-slate-200 bg-white text-black dark:border-slate-700 dark:bg-slate-800 dark:text-white"
|
||||
align="end"
|
||||
>
|
||||
<DropdownMenuGroup>
|
||||
<DropdownMenuItem
|
||||
v-for="item in linkItems"
|
||||
:key="item.label"
|
||||
class="hover:bg-gray-100 dark:hover:bg-slate-700"
|
||||
@click="item.onClick"
|
||||
@mouseenter="activeKey = item.label"
|
||||
@mouseleave="activeKey = null"
|
||||
>
|
||||
<Icon :name="item.icon ?? ''" />
|
||||
<span :class="activeKey === item.label ? 'text-sidebar-accent-foreground' : ''">{{ item.label }}</span>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuGroup>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</div>
|
||||
</template>
|
||||
@@ -2,14 +2,9 @@
|
||||
import type { LinkItem, ListItemDto } from './types'
|
||||
import { ActionEvents } from './types'
|
||||
|
||||
interface Props {
|
||||
const props = defineProps<{
|
||||
rec: ListItemDto
|
||||
size?: 'default' | 'sm' | 'lg'
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
size: 'lg',
|
||||
})
|
||||
}>()
|
||||
|
||||
const recId = inject<Ref<number>>('rec_id')!
|
||||
const recAction = inject<Ref<string>>('rec_action')!
|
||||
@@ -63,7 +58,7 @@ function del() {
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger as-child>
|
||||
<SidebarMenuButton
|
||||
:size="size"
|
||||
size="lg"
|
||||
class="data-[state=open]:text-sidebar-accent-foreground data-[state=open]:bg-white dark:data-[state=open]:bg-slate-800"
|
||||
>
|
||||
<Icon
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
<script setup lang="ts">
|
||||
import type { LinkItem, ListItemDto } from './types'
|
||||
import { ActionEvents } from './types'
|
||||
|
||||
const props = defineProps<{
|
||||
rec: ListItemDto
|
||||
}>()
|
||||
|
||||
const recId = inject<Ref<number>>('rec_id')!
|
||||
const recAction = inject<Ref<string>>('rec_action')!
|
||||
const recItem = inject<Ref<any>>('rec_item')!
|
||||
const activeKey = ref<string | null>(null)
|
||||
const linkItems: LinkItem[] = [
|
||||
{
|
||||
label: 'Detail',
|
||||
onClick: () => {
|
||||
detail()
|
||||
},
|
||||
icon: 'i-lucide-eye',
|
||||
},
|
||||
{
|
||||
label: 'Verifikasi',
|
||||
onClick: () => {
|
||||
verify()
|
||||
},
|
||||
icon: 'i-lucide-check',
|
||||
},
|
||||
{
|
||||
label: 'Validasi',
|
||||
onClick: () => {
|
||||
validate()
|
||||
},
|
||||
icon: 'i-lucide-check-check',
|
||||
},
|
||||
{
|
||||
label: 'Print',
|
||||
onClick: () => {
|
||||
print()
|
||||
},
|
||||
icon: 'i-lucide-printer',
|
||||
},
|
||||
]
|
||||
|
||||
function detail() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showDetail
|
||||
recItem.value = props.rec
|
||||
}
|
||||
|
||||
function verify() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showVerify
|
||||
recItem.value = props.rec
|
||||
}
|
||||
|
||||
function validate() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showValidate
|
||||
recItem.value = props.rec
|
||||
}
|
||||
|
||||
function print() {
|
||||
recId.value = props.rec.id || 0
|
||||
recAction.value = ActionEvents.showPrint
|
||||
recItem.value = props.rec
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger as-child>
|
||||
<SidebarMenuButton
|
||||
size="lg"
|
||||
class="data-[state=open]:text-sidebar-accent-foreground data-[state=open]:bg-white dark:data-[state=open]:bg-slate-800"
|
||||
>
|
||||
<Icon
|
||||
name="i-lucide-chevrons-up-down"
|
||||
class="ml-auto size-4"
|
||||
/>
|
||||
</SidebarMenuButton>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent
|
||||
class="w-[--radix-dropdown-menu-trigger-width] min-w-40 rounded-lg border border-slate-200 bg-white text-black dark:border-slate-700 dark:bg-slate-800 dark:text-white"
|
||||
align="end"
|
||||
>
|
||||
<DropdownMenuGroup>
|
||||
<DropdownMenuItem
|
||||
v-for="item in linkItems"
|
||||
:key="item.label"
|
||||
class="hover:bg-gray-100 dark:hover:bg-slate-700"
|
||||
@click="item.onClick"
|
||||
@mouseenter="activeKey = item.label"
|
||||
@mouseleave="activeKey = null"
|
||||
>
|
||||
<Icon :name="item.icon ?? ''" />
|
||||
<span :class="activeKey === item.label ? 'text-sidebar-accent-foreground' : ''">{{ item.label }}</span>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuGroup>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</div>
|
||||
</template>
|
||||
@@ -79,10 +79,14 @@ export interface LinkItem {
|
||||
}
|
||||
|
||||
export const ActionEvents = {
|
||||
showConfirmSubmit: 'showConfirmSubmit',
|
||||
showConfirmDelete: 'showConfirmDel',
|
||||
showEdit: 'showEdit',
|
||||
showDetail: 'showDetail',
|
||||
showProcess: 'showProcess',
|
||||
showVerify: 'showVerify',
|
||||
showValidate: 'showValidate',
|
||||
showPrint: 'showPrint',
|
||||
}
|
||||
|
||||
export interface DataTableLoader {
|
||||
|
||||
@@ -64,7 +64,7 @@ const settingClass = computed(() => {
|
||||
}
|
||||
cls += ' [&:not(.preview)_.height-default]:pt-2 [&:not(.preview)_.height-default]:2xl:!pt-1.5 [&:not(.preview)_.height-compact]:!pt-1 '
|
||||
cls += '[&_textarea]:md:text-xs [&_textarea]:2xl:!text-sm '
|
||||
cls += '[&_label]:md:text-xs [&_label]:md:text-xs [&_label]:2xl:!text-sm'
|
||||
cls += '[&_label]:md:text-xs [&_label]:2xl:!text-sm '
|
||||
return cls
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
export { default as Block } from './block.vue'
|
||||
export { default as Colon } from './colon.vue'
|
||||
export { default as Cell } from './cell.vue'
|
||||
export { default as Label } from './label.vue'
|
||||
export { default as Field } from './field.vue'
|
||||
|
||||
@@ -62,7 +62,7 @@ async function onFileChange(event: Event, handleChange: (value: any) => void) {
|
||||
@change="onFileChange($event, handleChange)"
|
||||
type="file"
|
||||
:disabled="isDisabled"
|
||||
v-bind="componentField"
|
||||
v-bind="{ onBlur: componentField.onBlur }"
|
||||
:placeholder="placeholder"
|
||||
:class="cn('focus:border-primary focus:ring-2 focus:ring-primary focus:ring-offset-0')"
|
||||
/>
|
||||
|
||||
@@ -63,14 +63,14 @@ function handleInput(event: Event) {
|
||||
v-slot="{ componentField }"
|
||||
:name="fieldName"
|
||||
>
|
||||
<FormItem :class="`relative`">
|
||||
<FormItem :class="cn(`relative`,)">
|
||||
<FormControl>
|
||||
<Input
|
||||
:disabled="isDisabled"
|
||||
v-bind="componentField"
|
||||
:placeholder="placeholder"
|
||||
:maxlength="maxLength"
|
||||
:class="cn('focus:border-primary focus:ring-2 focus:ring-primary focus:ring-offset-0')"
|
||||
:class="cn('focus:border-primary focus:ring-2 focus:ring-primary focus:ring-offset-0', props.class)"
|
||||
autocomplete="off"
|
||||
aria-autocomplete="none"
|
||||
autocorrect="off"
|
||||
@@ -84,6 +84,6 @@ function handleInput(event: Event) {
|
||||
</FormItem>
|
||||
</FormField>
|
||||
</DE.Field>
|
||||
<p v-show="bottomLabel" class="text-gray-400">{{ bottomLabel }}</p>
|
||||
<p v-show="bottomLabel" class="text-gray-400 mt-1">{{ bottomLabel }}</p>
|
||||
</DE.Cell>
|
||||
</template>
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
<script setup lang="ts">
|
||||
import type { FormErrors } from '~/types/error'
|
||||
import FieldGroup from '~/components/pub/my-ui/form/field-group.vue'
|
||||
import Field from '~/components/pub/my-ui/form/field.vue'
|
||||
import Label from '~/components/pub/my-ui/form/label.vue'
|
||||
import { Input } from '~/components/pub/ui/input'
|
||||
import { cn } from '~/lib/utils'
|
||||
|
||||
import * as DE from '~/components/pub/my-ui/doc-entry'
|
||||
|
||||
const props = defineProps<{
|
||||
fieldName: string
|
||||
placeholder: string
|
||||
label: string
|
||||
errors?: FormErrors
|
||||
class?: string
|
||||
colSpan?: number
|
||||
numericOnly?: boolean
|
||||
maxLength?: number
|
||||
isRequired?: boolean
|
||||
isDisabled?: boolean
|
||||
}>()
|
||||
|
||||
function handleInput(event: Event) {
|
||||
const target = event.target as HTMLInputElement
|
||||
let value = target.value
|
||||
|
||||
// Filter numeric only jika diperlukan
|
||||
if (props.numericOnly) {
|
||||
value = value.replace(/\D/g, '')
|
||||
}
|
||||
|
||||
// Batasi panjang maksimal jika diperlukan
|
||||
if (props.maxLength && value.length > props.maxLength) {
|
||||
value = value.slice(0, props.maxLength)
|
||||
}
|
||||
|
||||
// Update value jika ada perubahan
|
||||
if (target.value !== value) {
|
||||
target.value = value
|
||||
// Trigger input event untuk update form
|
||||
target.dispatchEvent(new Event('input', { bubbles: true }))
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<DE.Cell :col-span="colSpan || 1">
|
||||
<DE.Label
|
||||
class="mb-1"
|
||||
v-if="label !== ''"
|
||||
:label-for="fieldName"
|
||||
:is-required="isRequired && !isDisabled"
|
||||
>
|
||||
{{ label }}
|
||||
</DE.Label>
|
||||
<DE.Field
|
||||
:id="fieldName"
|
||||
:errors="errors"
|
||||
>
|
||||
<FormField
|
||||
v-slot="{ componentField }"
|
||||
:name="fieldName"
|
||||
>
|
||||
<FormItem>
|
||||
<FormControl>
|
||||
<Textarea
|
||||
:disabled="isDisabled"
|
||||
v-bind="componentField"
|
||||
:placeholder="placeholder"
|
||||
:maxlength="maxLength"
|
||||
:class="cn('focus:border-primary focus:ring-2 focus:ring-primary focus:ring-offset-0')"
|
||||
autocomplete="off"
|
||||
aria-autocomplete="none"
|
||||
autocorrect="off"
|
||||
autocapitalize="off"
|
||||
spellcheck="false"
|
||||
@input="handleInput"
|
||||
/>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
</FormField>
|
||||
</DE.Field>
|
||||
</DE.Cell>
|
||||
</template>
|
||||
@@ -0,0 +1,175 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, watch, defineEmits, defineProps, onMounted, nextTick, defineExpose } from 'vue'
|
||||
import Input from '~/components/pub/ui/input/Input.vue';
|
||||
import Button from '~/components/pub/ui/button/Button.vue';
|
||||
import waveyFingerprint from '~/assets/svg/wavey-fingerprint.svg'
|
||||
|
||||
/**
|
||||
* TextCaptcha props:
|
||||
* - length: number of characters in the core captcha
|
||||
* - caseSensitive: whether validation is case sensitive
|
||||
* - useSpacing: show spaced-out characters (visual obfuscation only)
|
||||
* - noiseChars: include random noise characters visually (not required to type)
|
||||
*/
|
||||
const props = defineProps({
|
||||
length: { type: Number, default: 6 },
|
||||
caseSensitive: { type: Boolean, default: false },
|
||||
useSpacing: { type: Boolean, default: true },
|
||||
noiseChars: { type: Boolean, default: false }, // adds random noise characters to display
|
||||
refreshCooldownMs: { type: Number, default: 500 }, // guard repeated refresh
|
||||
})
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:valid', valid: boolean): void
|
||||
(e: 'validated', valid: boolean): void
|
||||
(e: 'change', value: string): void
|
||||
}>()
|
||||
|
||||
// Internal state
|
||||
const raw = ref('') // the canonical captcha value (what user must match, ignoring visual noise)
|
||||
const display = ref('') // randomized visual representation (may include spacing/noise)
|
||||
const input = ref('') // user typed value
|
||||
const lastRefresh = ref(0)
|
||||
const valid = inject('isCaptchaValid') as Ref<boolean>
|
||||
const errorMessage = ref('')
|
||||
|
||||
/** Characters excluding ambiguous ones: 0/O, 1/l/I etc. */
|
||||
const CHARS = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||||
|
||||
function randomChar() {
|
||||
return CHARS.charAt(Math.floor(Math.random() * CHARS.length))
|
||||
}
|
||||
|
||||
/** Generate the canonical captcha string */
|
||||
function genRaw(len = props.length) {
|
||||
let s = ''
|
||||
for (let i = 0; i < len; i++) s += randomChar()
|
||||
return s
|
||||
}
|
||||
|
||||
/** Create a visually obfuscated display string (spacing, noise, random case) */
|
||||
function genDisplay(base: string) {
|
||||
const arr: string[] = []
|
||||
for (const ch of base) {
|
||||
// toggle case randomly (only for letters)
|
||||
const c = /[A-Za-z]/.test(ch) && Math.random() > 0.5 ? (Math.random() > 0.5 ? ch.toLowerCase() : ch.toUpperCase()) : ch
|
||||
arr.push(c)
|
||||
if (props.useSpacing && Math.random() > 0.3) arr.push(' ') // random space
|
||||
}
|
||||
return arr.join('')
|
||||
}
|
||||
|
||||
/** Refresh captcha */
|
||||
function refresh() {
|
||||
const now = Date.now()
|
||||
if (now - lastRefresh.value < props.refreshCooldownMs) return
|
||||
lastRefresh.value = now
|
||||
|
||||
raw.value = genRaw(props.length)
|
||||
display.value = genDisplay(raw.value)
|
||||
input.value = ''
|
||||
valid.value = false
|
||||
errorMessage.value = ''
|
||||
// emit change so parent knows new value (but we don't send the raw canonical in production)
|
||||
emit('change', display.value)
|
||||
}
|
||||
|
||||
/** Normalize input and canonical for comparison */
|
||||
function normalizeForCompare(s: string) {
|
||||
const normalized = s.replace(/\s+/g, '') // strip spaces
|
||||
return props.caseSensitive ? normalized : normalized.toLowerCase()
|
||||
}
|
||||
|
||||
/** Validate the current input */
|
||||
function validate() {
|
||||
const left = normalizeForCompare(input.value)
|
||||
const right = normalizeForCompare(raw.value)
|
||||
if (!input.value) {
|
||||
valid.value = false
|
||||
errorMessage.value = 'Please enter the captcha text.'
|
||||
} else if (left === right) {
|
||||
valid.value = true
|
||||
errorMessage.value = ''
|
||||
} else {
|
||||
valid.value = false
|
||||
errorMessage.value = 'Captcha does not match.'
|
||||
}
|
||||
emit('update:valid', valid.value)
|
||||
emit('validated', valid.value)
|
||||
return valid.value
|
||||
}
|
||||
|
||||
// expose a refresh method to parent via ref
|
||||
defineExpose({ refresh, validate, isValid: computed(() => valid.value) })
|
||||
|
||||
// generate on mount
|
||||
onMounted(() => refresh())
|
||||
|
||||
// // re-validate whenever input changes (lightweight)
|
||||
// watch(input, () => {
|
||||
// // we don't auto-pass until the user explicitly validate (but we can optionally live-validate)
|
||||
// // Here we perform live feedback but still emit validated only when called
|
||||
// const left = normalizeForCompare(input.value)
|
||||
// const right = normalizeForCompare(raw.value)
|
||||
// valid.value = !!input.value && left === right
|
||||
// // emit a live update so the parent can disable submit accordingly
|
||||
// emit('update:valid', valid.value)
|
||||
// })
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="space-y-2 w-full max-w-sm">
|
||||
<div class="flex items-center justify-between gap-3">
|
||||
<!-- Captcha visual box -->
|
||||
<div
|
||||
role="img"
|
||||
aria-label="Text captcha, type the characters shown"
|
||||
tabindex="0"
|
||||
class="select-none p-3 rounded-md border border-gray-200 text-white text-xl font-mono tracking-wider text-center w-full"
|
||||
>
|
||||
<span class="inline-block" v-html="display"></span>
|
||||
</div>
|
||||
|
||||
<!-- Refresh -->
|
||||
<div class="flex-shrink-0">
|
||||
<Button variant="ghost" type="button" @click="refresh" title="Refresh captcha">
|
||||
<Icon name="i-lucide-refresh-cw" />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Input -->
|
||||
<div class="flex gap-3 items-start">
|
||||
<div class="flex-grow">
|
||||
<Input
|
||||
v-model="input"
|
||||
:aria-invalid="valid ? 'false' : 'true'"
|
||||
inputmode="text"
|
||||
placeholder="Type the captcha text"
|
||||
@keyup.enter="validate"
|
||||
/>
|
||||
<p v-if="errorMessage" class="text-xs text-red-500 mt-1">{{ errorMessage }}</p>
|
||||
<p v-else-if="valid" class="text-xs text-green-500 mt-1">Correct</p>
|
||||
<p v-else class="text-xs text-gray-500 mt-1">Not case-sensitive</p>
|
||||
</div>
|
||||
<Button variant="outline" type="button" @click="validate" title="Validate"
|
||||
class="border-orange-400">
|
||||
<Icon name="i-lucide-check" class="text-orange-400" />
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* small nicety: make noise/spaced display look irregular */
|
||||
div[role="img"] {
|
||||
background: url('~/assets/svg/wavey-fingerprint.svg') repeat center;
|
||||
}
|
||||
|
||||
div[role="img"] span {
|
||||
letter-spacing: 0.12em;
|
||||
font-weight: 600;
|
||||
user-select: none;
|
||||
}
|
||||
</style>
|
||||
@@ -52,8 +52,8 @@ const isOpen = computed({
|
||||
>
|
||||
<DialogHeader>
|
||||
<DialogTitle :class="`text-sm 2xl:text-base font-semibold flex ${titleClass || ''}`">
|
||||
<div class="me-2 pt-0.5">
|
||||
<Icon v-if="props.titleIcon" :name="props.titleIcon" :class="`!pt-2`" />
|
||||
<div v-if="props.titleIcon" class="me-2 pt-0.5">
|
||||
<Icon :name="props.titleIcon" :class="`!pt-2`" />
|
||||
</div>
|
||||
<div>
|
||||
{{ props.title }}
|
||||
@@ -61,7 +61,7 @@ const isOpen = computed({
|
||||
</DialogTitle>
|
||||
<DialogDescription v-if="props.description">{{ props.description }}</DialogDescription>
|
||||
</DialogHeader>
|
||||
<DialogDescription :class="sizeClass">
|
||||
<DialogDescription :class="`${sizeClass} md:text-xs 2xl:text-sm`">
|
||||
<slot />
|
||||
</DialogDescription>
|
||||
</DialogContent>
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<script setup lang="ts">
|
||||
|
||||
const props = defineProps<{
|
||||
link: string
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
// submit: [values: InstallationFormData, resetForm: () => void]
|
||||
// cancel: [resetForm: () => void]
|
||||
}>()
|
||||
|
||||
// Form cancel handler
|
||||
// function onCancelForm({ resetForm }: { resetForm: () => void }) {
|
||||
// emit('cancel', resetForm)
|
||||
// }
|
||||
function onExternalLink() {
|
||||
navigateTo(props.link, {external: true,open: { target: "_blank" },});
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Button variant="link" class="absolute top-4 right-16" @click="onExternalLink">
|
||||
Open in Browser
|
||||
<Icon name="i-lucide-external-link" class="h-4 w-4" />
|
||||
</Button>
|
||||
<div class="border border-gray-400 rounded-lg w-full h-[80vh] overflow-hidden">
|
||||
<embed style="width: 100%; height: 100%" :src="props.link" />
|
||||
</div>
|
||||
</template>
|
||||
@@ -30,8 +30,8 @@ function onClick(type: ClickType) {
|
||||
Back
|
||||
</Button>
|
||||
</div>
|
||||
<div>
|
||||
<Button v-show="enableDraft" variant="secondary" type="button" @click="onClick('draft')">
|
||||
<div v-show="props.enableDraft">
|
||||
<Button variant="secondary" type="button" @click="onClick('draft')">
|
||||
<Icon name="i-lucide-file" />
|
||||
Draft
|
||||
</Button>
|
||||
@@ -43,4 +43,4 @@ function onClick(type: ClickType) {
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
Reference in New Issue
Block a user