@gnar-engine/cli 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bootstrap/deploy.localdev.yml +30 -3
- package/bootstrap/secrets.localdev.yml +15 -4
- package/bootstrap/services/control/src/config.js +4 -0
- package/bootstrap/services/page/Dockerfile +23 -0
- package/bootstrap/services/page/package.json +16 -0
- package/bootstrap/services/page/src/app.js +50 -0
- package/bootstrap/services/page/src/commands/block.handler.js +94 -0
- package/bootstrap/services/page/src/commands/page.handler.js +167 -0
- package/bootstrap/services/page/src/config.js +62 -0
- package/bootstrap/services/page/src/controllers/block.http.controller.js +87 -0
- package/bootstrap/services/page/src/controllers/message.controller.js +51 -0
- package/bootstrap/services/page/src/controllers/page.http.controller.js +89 -0
- package/bootstrap/services/page/src/policies/block.policy.js +50 -0
- package/bootstrap/services/page/src/policies/page.policy.js +49 -0
- package/bootstrap/services/page/src/schema/page.schema.js +139 -0
- package/bootstrap/services/page/src/services/block.service.js +83 -0
- package/bootstrap/services/page/src/services/page.service.js +83 -0
- package/bootstrap/services/portal/Dockerfile +20 -0
- package/bootstrap/services/portal/README.md +73 -0
- package/bootstrap/services/portal/index.html +13 -0
- package/bootstrap/services/portal/nginx.conf +5 -0
- package/bootstrap/services/portal/package.json +33 -0
- package/bootstrap/services/portal/public/vite.svg +1 -0
- package/bootstrap/services/portal/react-router.config.js +7 -0
- package/bootstrap/services/portal/src/App.jsx +16 -0
- package/bootstrap/services/portal/src/assets/gnar-engine-white-logo.svg +9 -0
- package/bootstrap/services/portal/src/assets/icon-agent.svg +6 -0
- package/bootstrap/services/portal/src/assets/icon-cog.svg +4 -0
- package/bootstrap/services/portal/src/assets/icon-delete.svg +3 -0
- package/bootstrap/services/portal/src/assets/icon-home.svg +3 -0
- package/bootstrap/services/portal/src/assets/icon-padlock.svg +3 -0
- package/bootstrap/services/portal/src/assets/icon-page.svg +6 -0
- package/bootstrap/services/portal/src/assets/icon-reports.svg +3 -0
- package/bootstrap/services/portal/src/assets/icon-user.svg +3 -0
- package/bootstrap/services/portal/src/assets/icon-users.svg +3 -0
- package/bootstrap/services/portal/src/assets/login-green-rad-back-1.jpg +0 -0
- package/bootstrap/services/portal/src/assets/react.svg +1 -0
- package/bootstrap/services/portal/src/components/CrudList/CrudList.jsx +85 -0
- package/bootstrap/services/portal/src/components/CrudList/CrudList.less +59 -0
- package/bootstrap/services/portal/src/components/CustomSelect/CustomSelect.jsx +81 -0
- package/bootstrap/services/portal/src/components/CustomSelect/CustomSelect.less +0 -0
- package/bootstrap/services/portal/src/components/LoginForm/LoginForm.jsx +58 -0
- package/bootstrap/services/portal/src/components/PageBlockSwitch/PageBlockSwitch.jsx +129 -0
- package/bootstrap/services/portal/src/components/Sidebar/Sidebar.jsx +33 -0
- package/bootstrap/services/portal/src/components/Sidebar/Sidebar.less +37 -0
- package/bootstrap/services/portal/src/components/Topbar/Topbar.jsx +19 -0
- package/bootstrap/services/portal/src/components/Topbar/Topbar.less +22 -0
- package/bootstrap/services/portal/src/components/UserInfo/UserInfo.jsx +33 -0
- package/bootstrap/services/portal/src/components/UserInfo/UserInfo.less +21 -0
- package/bootstrap/services/portal/src/css/style.css +711 -0
- package/bootstrap/services/portal/src/data/pages.data.js +10 -0
- package/bootstrap/services/portal/src/elements/CustomSelect/CustomSelect.jsx +65 -0
- package/bootstrap/services/portal/src/elements/CustomSelect/CustomSelect.less +102 -0
- package/bootstrap/services/portal/src/elements/ImageInput/ImageInput.jsx +115 -0
- package/bootstrap/services/portal/src/elements/ImageInput/ImageInput.less +43 -0
- package/bootstrap/services/portal/src/elements/ImageMultiInput/ImageMultiInput.jsx +124 -0
- package/bootstrap/services/portal/src/elements/ImageMultiInput/ImageMultiInput.less +0 -0
- package/bootstrap/services/portal/src/elements/Repeater/Repeater.jsx +52 -0
- package/bootstrap/services/portal/src/elements/Repeater/Repeater.less +70 -0
- package/bootstrap/services/portal/src/elements/RichTextInput/RichTextInput.jsx +18 -0
- package/bootstrap/services/portal/src/elements/RichTextInput/RichTextInput.less +37 -0
- package/bootstrap/services/portal/src/elements/SaveButton/SaveButton.jsx +45 -0
- package/bootstrap/services/portal/src/elements/SelectRepeater/SelectRepeater.jsx +63 -0
- package/bootstrap/services/portal/src/elements/SelectRepeater/SelectRepeater.less +23 -0
- package/bootstrap/services/portal/src/elements/TextInput/TextInput.jsx +17 -0
- package/bootstrap/services/portal/src/layouts/Card/Card.jsx +15 -0
- package/bootstrap/services/portal/src/layouts/PortalLayout/PortalLayout.jsx +29 -0
- package/bootstrap/services/portal/src/layouts/PortalLayout/PortalLayout.less +49 -0
- package/bootstrap/services/portal/src/main.jsx +51 -0
- package/bootstrap/services/portal/src/pages/BlockSinglePage/BlockSinglePage.jsx +277 -0
- package/bootstrap/services/portal/src/pages/BlocksPage/BlocksPage.jsx +23 -0
- package/bootstrap/services/portal/src/pages/DashboardPage/DashboardPage.jsx +11 -0
- package/bootstrap/services/portal/src/pages/DashboardPage/DashboardPage.less +0 -0
- package/bootstrap/services/portal/src/pages/LoginPage/LoginPage.jsx +21 -0
- package/bootstrap/services/portal/src/pages/LoginPage/LoginPage.less +51 -0
- package/bootstrap/services/portal/src/pages/PageSinglePage/PageSinglePage.jsx +338 -0
- package/bootstrap/services/portal/src/pages/PagesPage/PagesPage.jsx +23 -0
- package/bootstrap/services/portal/src/pages/UserSinglePage/UserSinglePage.jsx +9 -0
- package/bootstrap/services/portal/src/pages/UserSinglePage/UserSinglePage.less +0 -0
- package/bootstrap/services/portal/src/pages/UsersPage/UsersPage.jsx +25 -0
- package/bootstrap/services/portal/src/pages/UsersPage/UsersPage.less +0 -0
- package/bootstrap/services/portal/src/services/block.js +28 -0
- package/bootstrap/services/portal/src/services/client.js +67 -0
- package/bootstrap/services/portal/src/services/gravatar.js +14 -0
- package/bootstrap/services/portal/src/services/page.js +28 -0
- package/bootstrap/services/portal/src/services/storage.js +62 -0
- package/bootstrap/services/portal/src/services/user.js +41 -0
- package/bootstrap/services/portal/src/slices/authSlice.js +101 -0
- package/bootstrap/services/portal/src/store/configureStore.js +10 -0
- package/bootstrap/services/portal/src/style/cards.less +57 -0
- package/bootstrap/services/portal/src/style/global.less +204 -0
- package/bootstrap/services/portal/src/style/icons.less +21 -0
- package/bootstrap/services/portal/src/style/inputs.less +52 -0
- package/bootstrap/services/portal/src/style/main.less +28 -0
- package/bootstrap/services/portal/src/utils/utils.js +9 -0
- package/bootstrap/services/portal/vite.config.js +12 -0
- package/bootstrap/services/user/src/app.js +6 -1
- package/bootstrap/services/user/src/commands/user.handler.js +0 -3
- package/bootstrap/services/user/src/config.js +5 -1
- package/bootstrap/services/user/src/policies/user.policy.js +3 -1
- package/bootstrap/services/user/src/tests/commands/user.test.js +22 -0
- package/install-from-clone.sh +30 -0
- package/package.json +1 -1
- package/src/cli.js +8 -0
- package/src/dev/commands.js +10 -2
- package/src/dev/dev.service.js +147 -60
- package/src/provisioner/Dockerfile +27 -0
- package/src/provisioner/package.json +19 -0
- package/src/provisioner/src/app.js +56 -0
- package/src/provisioner/src/services/mongodb.js +58 -0
- package/src/provisioner/src/services/mysql.js +51 -0
- package/src/provisioner/src/services/secrets.js +84 -0
- package/src/scaffolder/commands.js +1 -1
- package/src/scaffolder/scaffolder.handler.js +40 -15
- package/templates/service/src/app.js.hbs +12 -1
- package/templates/service/src/commands/{{serviceName}}.handler.js.hbs +1 -1
- package/templates/service/src/mongodb.config.js.hbs +5 -1
- package/templates/service/src/mysql.config.js.hbs +4 -0
- package/bootstrap/services/user/src/tests/user.test.js +0 -126
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg width="351" height="63" viewBox="0 0 351 63" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
2
|
+
<rect width="351" height="63" fill="url(#pattern0_491_897)"/>
|
|
3
|
+
<defs>
|
|
4
|
+
<pattern id="pattern0_491_897" patternContentUnits="objectBoundingBox" width="1" height="1">
|
|
5
|
+
<use xlink:href="#image0_491_897" transform="matrix(0.001 0 0 0.00557143 0 -0.00421429)"/>
|
|
6
|
+
</pattern>
|
|
7
|
+
<image id="image0_491_897" width="1000" height="181" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAC1CAYAAADMW9VQAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7tnQn8ddX0/wslmlMpRY/mpEkalQZS0kCSIVFIIcQflX6ojEmUmUiTMSkRDRo10KyZVE+T5jSiNPzfn6d7c5793ffec+89wz7nftbrtV7f791nn7XX+uy9z9lr77X3mWUWkxEwAkbACBgBI2AEjIARMAJGIILAk08+uSZ8Kvxf+FH49/AqkaxOMgJGwAgYASNgBIyAETACRsAIGAEjYATKQABHfD34P3BID5GwehllWqYRMAJGwAgYASNgBIyAETACRsAIGAEjECCAE35p6Jlnfp9twIyAETACRsAIGAEjYASMgBEwAkbACBiBkhHAEV+0j3OuS0/A85SshsUbgYlD4BkTZ7ENNgJGwAgYASNgBIyAETACRmAQArMPyDAr1wflGSDCl42AETACRsAIGAEjYASMgBEwAkbACBiBvgiwOj4rfHOfVfRr+grwRSNgBIyAETACRsAIGAEjYASMgBEwAkagGARwzt/ew0FXePvriynFUoyAETACRsAIGAEjYASMgBEwAkbACBiBgQjgiL8LvivjqN/G/28ZeKMzGAEjMBIC2jtiMgJGwAgYASNgBIyAETACRsAIRBHAIZ+NCyvBT8BXzDrrrI9FMzrRCBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYASMgBEwAkbACBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYASMgBEwAkbACBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYASMgBEwAkbACBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYASMgBEwAkbACBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYASMgBEwAkbACBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYASMgBEwAkbACBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYASMgBEwAkbACBgBI2AEjIARMAJGwAgYASNgBIyAETACRsAIGAEjYARKQ2DW0iTXJPjJJ5+cnaLn7BR/36yzzvpkTaq42JYiQBubC9Nm65j3EG3svy01tfFmUVdzY8SzZAj19M/GG2QDhkaANjB/56YHaQOP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"/>
|
|
8
|
+
</defs>
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M7.25141 9.19909C7.22766 9.19909 7.21182 9.19909 7.18807 9.19909C7.14849 9.19117 7.09307 9.19117 7.04557 9.19909C4.74974 9.12784 3.01599 7.32284 3.01599 5.09825C3.01599 2.83409 4.86057 0.989502 7.12474 0.989502C9.38891 0.989502 11.2335 2.83409 11.2335 5.09825C11.2256 7.32284 9.48391 9.12784 7.27516 9.19909C7.26724 9.19909 7.25932 9.19909 7.25141 9.19909ZM7.12474 2.177C5.51766 2.177 4.20349 3.49117 4.20349 5.09825C4.20349 6.68159 5.43849 7.95617 7.01391 8.01159C7.06141 8.00367 7.16432 8.00367 7.26724 8.01159C8.81891 7.94034 10.0381 6.66575 10.046 5.09825C10.046 3.49117 8.73182 2.177 7.12474 2.177Z" fill="#C0C0C0"/>
|
|
3
|
+
<path d="M13.0939 9.30216C13.0701 9.30216 13.0464 9.30216 13.0226 9.29425C12.698 9.32591 12.3655 9.09633 12.3339 8.77175C12.3022 8.44716 12.5001 8.15425 12.8247 8.11466C12.9197 8.10675 13.0226 8.10675 13.1097 8.10675C14.2655 8.04341 15.168 7.09341 15.168 5.92966C15.168 4.72633 14.1943 3.75258 12.991 3.75258C12.6664 3.7605 12.3972 3.49133 12.3972 3.16675C12.3972 2.84216 12.6664 2.573 12.991 2.573C14.8435 2.573 16.3555 4.08508 16.3555 5.93758C16.3555 7.75841 14.9305 9.23091 13.1176 9.30216C13.1097 9.30216 13.1018 9.30216 13.0939 9.30216Z" fill="#C0C0C0"/>
|
|
4
|
+
<path d="M7.25927 17.8522C5.70761 17.8522 4.14802 17.4563 2.96844 16.6647C1.86802 15.9363 1.26636 14.9388 1.26636 13.8542C1.26636 12.7697 1.86802 11.7642 2.96844 11.028C5.34344 9.45258 9.19094 9.45258 11.5501 11.028C12.6426 11.7563 13.2522 12.7538 13.2522 13.8384C13.2522 14.923 12.6505 15.9284 11.5501 16.6647C10.3626 17.4563 8.81094 17.8522 7.25927 17.8522ZM3.62552 12.0255C2.86552 12.5322 2.45386 13.1813 2.45386 13.8622C2.45386 14.5351 2.87344 15.1842 3.62552 15.683C5.59677 17.0051 8.92177 17.0051 10.893 15.683C11.653 15.1763 12.0647 14.5272 12.0647 13.8463C12.0647 13.1734 11.6451 12.5242 10.893 12.0255C8.92177 10.7113 5.59677 10.7113 3.62552 12.0255Z" fill="#C0C0C0"/>
|
|
5
|
+
<path d="M14.5188 16.4271C14.2417 16.4271 13.9963 16.2371 13.9409 15.9521C13.8776 15.6275 14.0834 15.3188 14.4001 15.2475C14.8988 15.1446 15.358 14.9467 15.7142 14.6696C16.1655 14.3292 16.4109 13.9017 16.4109 13.4504C16.4109 12.9992 16.1655 12.5717 15.7221 12.2392C15.3738 11.97 14.9384 11.78 14.4238 11.6613C14.1071 11.59 13.9013 11.2733 13.9726 10.9488C14.0438 10.6321 14.3605 10.4263 14.6851 10.4975C15.3659 10.6479 15.9596 10.9171 16.4426 11.2892C17.1788 11.8433 17.5984 12.6271 17.5984 13.4504C17.5984 14.2738 17.1709 15.0575 16.4346 15.6196C15.9438 15.9996 15.3263 16.2767 14.6455 16.4113C14.598 16.4271 14.5584 16.4271 14.5188 16.4271Z" fill="#C0C0C0"/>
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M17.5 21.8751C19.9163 21.8751 21.875 19.9163 21.875 17.5001C21.875 15.0838 19.9163 13.1251 17.5 13.1251C15.0838 13.1251 13.125 15.0838 13.125 17.5001C13.125 19.9163 15.0838 21.8751 17.5 21.8751Z" stroke="#C0C0C0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
<path d="M27.3106 21.4774C27.1341 21.8772 27.0815 22.3208 27.1595 22.7509C27.2375 23.1809 27.4425 23.5778 27.7481 23.8902L27.8277 23.9698C28.0742 24.216 28.2698 24.5085 28.4032 24.8304C28.5366 25.1522 28.6053 25.4973 28.6053 25.8457C28.6053 26.1942 28.5366 26.5392 28.4032 26.8611C28.2698 27.183 28.0742 27.4754 27.8277 27.7217C27.5814 27.9682 27.289 28.1638 26.9671 28.2972C26.6452 28.4306 26.3002 28.4993 25.9517 28.4993C25.6033 28.4993 25.2582 28.4306 24.9364 28.2972C24.6145 28.1638 24.322 27.9682 24.0758 27.7217L23.9962 27.6421C23.6838 27.3365 23.2869 27.1315 22.8569 27.0535C22.4268 26.9755 21.9832 27.0281 21.5834 27.2046C21.1912 27.3727 20.8568 27.6517 20.6213 28.0074C20.3857 28.3631 20.2593 28.7799 20.2576 29.2065V29.4319C20.2576 30.1351 19.9782 30.8095 19.481 31.3068C18.9837 31.8041 18.3093 32.0834 17.6061 32.0834C16.9029 32.0834 16.2284 31.8041 15.7312 31.3068C15.2339 30.8095 14.9546 30.1351 14.9546 29.4319V29.3126C14.9443 28.8738 14.8023 28.4482 14.5469 28.0912C14.2916 27.7341 13.9347 27.4622 13.5227 27.3107C13.1229 27.1342 12.6793 27.0816 12.2492 27.1595C11.8192 27.2375 11.4223 27.4426 11.1099 27.7482L11.0303 27.8277C10.7841 28.0743 10.4916 28.2698 10.1697 28.4033C9.84786 28.5367 9.50283 28.6054 9.15438 28.6054C8.80593 28.6054 8.46089 28.5367 8.139 28.4033C7.81712 28.2698 7.52468 28.0743 7.27843 27.8277C7.0319 27.5815 6.83633 27.289 6.70289 26.9672C6.56946 26.6453 6.50078 26.3002 6.50078 25.9518C6.50078 25.6033 6.56946 25.2583 6.70289 24.9364C6.83633 24.6145 7.0319 24.3221 7.27843 24.0758L7.35797 23.9963C7.66361 23.6838 7.86864 23.287 7.94662 22.8569C8.0246 22.4269 7.97195 21.9833 7.79547 21.5834C7.62742 21.1913 7.34837 20.8569 6.99268 20.6213C6.63699 20.3858 6.22019 20.2594 5.79358 20.2577H5.5682C4.86498 20.2577 4.19055 19.9783 3.6933 19.481C3.19604 18.9838 2.91669 18.3094 2.91669 17.6061C2.91669 16.9029 3.19604 16.2285 3.6933 15.7312C4.19055 15.234 4.86498 14.9546 5.5682 14.9546H5.68752C6.12634 14.9444 6.55192 14.8023 6.90894 14.547C7.26596 14.2916 7.5379 13.9348 7.68941 13.5228C7.86589 13.1229 7.91854 12.6794 7.84056 12.2493C7.76258 11.8192 7.55755 11.4224 7.25191 11.1099L7.17237 11.0304C6.92584 10.7841 6.73027 10.4917 6.59683 10.1698C6.4634 9.84792 6.39471 9.50289 6.39471 9.15444C6.39471 8.80599 6.4634 8.46095 6.59683 8.13907C6.73027 7.81718 6.92584 7.52474 7.17237 7.27849C7.41862 7.03196 7.71105 6.83639 8.03294 6.70295C8.35483 6.56952 8.69987 6.50084 9.04832 6.50084C9.39677 6.50084 9.7418 6.56952 10.0637 6.70295C10.3856 6.83639 10.678 7.03196 10.9243 7.27849L11.0038 7.35804C11.3163 7.66367 11.7131 7.8687 12.1432 7.94668C12.5732 8.02466 13.0168 7.97201 13.4167 7.79554H13.5227C13.9149 7.62748 14.2493 7.34843 14.4848 6.99274C14.7204 6.63706 14.8468 6.22025 14.8485 5.79364V5.56826C14.8485 4.86504 15.1279 4.19061 15.6251 3.69336C16.1224 3.1961 16.7968 2.91675 17.5 2.91675C18.2032 2.91675 18.8777 3.1961 19.3749 3.69336C19.8722 4.19061 20.1515 4.86504 20.1515 5.56826V5.68758C20.1532 6.11419 20.2796 6.531 20.5152 6.88668C20.7508 7.24237 21.0852 7.52142 21.4773 7.68948C21.8772 7.86595 22.3207 7.9186 22.7508 7.84062C23.1809 7.76264 23.5777 7.55761 23.8902 7.25198L23.9697 7.17243C24.216 6.9259 24.5084 6.73033 24.8303 6.59689C25.1522 6.46346 25.4972 6.39478 25.8457 6.39478C26.1941 6.39478 26.5391 6.46346 26.861 6.59689C27.1829 6.73033 27.4754 6.9259 27.7216 7.17243C27.9681 7.41868 28.1637 7.71112 28.2971 8.033C28.4306 8.35489 28.4993 8.69993 28.4993 9.04838C28.4993 9.39683 28.4306 9.74186 28.2971 10.0637C28.1637 10.3856 27.9681 10.6781 27.7216 10.9243L27.6421 11.0039C27.3364 11.3163 27.1314 11.7132 27.0534 12.1432C26.9754 12.5733 27.0281 13.0169 27.2046 13.4167V13.5228C27.3726 13.9149 27.6517 14.2493 28.0074 14.4849C28.363 14.7205 28.7798 14.8469 29.2065 14.8486H29.4318C30.1351 14.8486 30.8095 15.1279 31.3067 15.6252C31.804 16.1224 32.0834 16.7969 32.0834 17.5001C32.0834 18.2033 31.804 18.8777 31.3067 19.375C30.8095 19.8722 30.1351 20.1516 29.4318 20.1516H29.3125C28.8859 20.1533 28.4691 20.2797 28.1134 20.5153C27.7577 20.7508 27.4787 21.0852 27.3106 21.4774Z" stroke="#C0C0C0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M17 9L11 15M11 9L17 15M2.72 12.96L7.04 18.72C7.392 19.1893 7.568 19.424 7.79105 19.5932C7.9886 19.7432 8.21232 19.855 8.45077 19.9231C8.72 20 9.01334 20 9.6 20H17.2C18.8802 20 19.7202 20 20.362 19.673C20.9265 19.3854 21.3854 18.9265 21.673 18.362C22 17.7202 22 16.8802 22 15.2V8.8C22 7.11984 22 6.27976 21.673 5.63803C21.3854 5.07354 20.9265 4.6146 20.362 4.32698C19.7202 4 18.8802 4 17.2 4H9.6C9.01334 4 8.72 4 8.45077 4.07689C8.21232 4.14499 7.9886 4.25685 7.79105 4.40675C7.568 4.576 7.392 4.81067 7.04 5.28L2.72 11.04C2.46181 11.3843 2.33271 11.5564 2.28294 11.7454C2.23902 11.9123 2.23902 12.0877 2.28294 12.2546C2.33271 12.4436 2.46181 12.6157 2.72 12.96Z" stroke="#FF4D4F" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M12 28V18.1333C12 17.3866 12 17.0132 12.1454 16.728C12.2732 16.4771 12.4772 16.2732 12.728 16.1453C13.0133 16 13.3866 16 14.1334 16H17.8667C18.6134 16 18.9868 16 19.272 16.1453C19.5229 16.2732 19.7269 16.4771 19.8547 16.728C20 17.0132 20 17.3866 20 18.1333V28M2.66669 12.6667L14.72 3.62667C15.179 3.28241 15.4085 3.11028 15.6606 3.04393C15.8831 2.98536 16.117 2.98536 16.3394 3.04393C16.5915 3.11028 16.821 3.28241 17.28 3.62667L29.3334 12.6667M5.33336 10.6667V23.7333C5.33336 25.2268 5.33336 25.9735 5.62401 26.544C5.87967 27.0457 6.28762 27.4537 6.78938 27.7094C7.35982 28 8.10655 28 9.60003 28H22.4C23.8935 28 24.6402 28 25.2107 27.7094C25.7124 27.4537 26.1204 27.0457 26.376 26.544C26.6667 25.9735 26.6667 25.2268 26.6667 23.7333V10.6667L18.56 4.58667C17.642 3.89815 17.183 3.55389 16.6789 3.42119C16.2339 3.30405 15.7662 3.30405 15.3212 3.42119C14.8171 3.55389 14.358 3.89815 13.44 4.58667L5.33336 10.6667Z" stroke="#C0C0C0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M5.25 7.5V6C5.25 3.92893 6.92893 2.25 9 2.25C10.5377 2.25 11.8593 3.17557 12.438 4.5M9 10.875V12.375M6.6 15.75H11.4C12.6601 15.75 13.2902 15.75 13.7715 15.5048C14.1948 15.289 14.539 14.9448 14.7548 14.5215C15 14.0402 15 13.4101 15 12.15V11.1C15 9.83988 15 9.20982 14.7548 8.72852C14.539 8.30516 14.1948 7.96095 13.7715 7.74524C13.2902 7.5 12.6601 7.5 11.4 7.5H6.6C5.33988 7.5 4.70982 7.5 4.22852 7.74524C3.80516 7.96095 3.46095 8.30516 3.24524 8.72852C3 9.20982 3 9.83988 3 11.1V12.15C3 13.4101 3 14.0402 3.24524 14.5215C3.46095 14.9448 3.80516 15.289 4.22852 15.5048C4.70982 15.75 5.33988 15.75 6.6 15.75Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M22 10V15C22 20 20 22 15 22H9C4 22 2 20 2 15V9C2 4 4 2 9 2H14" stroke="#C0C0C0" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
<path d="M22 10H18C15 10 14 9 14 6V2L22 10Z" stroke="#C0C0C0" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
<path d="M7 13H13" stroke="#C0C0C0" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
+
<path d="M7 17H11" stroke="#C0C0C0" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M15 15.75C15 14.7033 15 14.18 14.8708 13.7541C14.58 12.7953 13.8297 12.045 12.8709 11.7542C12.445 11.625 11.9217 11.625 10.875 11.625H7.125C6.07833 11.625 5.55499 11.625 5.12914 11.7542C4.17034 12.045 3.42003 12.7953 3.12918 13.7541C3 14.18 3 14.7033 3 15.75M12.375 5.625C12.375 7.48896 10.864 9 9 9C7.13604 9 5.625 7.48896 5.625 5.625C5.625 3.76104 7.13604 2.25 9 2.25C10.864 2.25 12.375 3.76104 12.375 5.625Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="28" height="29" viewBox="0 0 28 29" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M25.6666 25.375V22.9583C25.6666 20.7062 24.1794 18.8138 22.1666 18.2773M18.0833 3.97633C19.7935 4.69334 21 6.42992 21 8.45833C21 10.4867 19.7935 12.2233 18.0833 12.9403M19.8333 25.375C19.8333 23.1229 19.8333 21.9969 19.4781 21.1087C19.0044 19.9244 18.096 18.9835 16.9525 18.4929C16.0949 18.125 15.0077 18.125 12.8333 18.125H9.33331C7.15892 18.125 6.07172 18.125 5.21412 18.4929C4.07066 18.9835 3.16218 19.9244 2.68854 21.1087C2.33331 21.9969 2.33331 23.1229 2.33331 25.375M15.75 8.45833C15.75 11.1277 13.6606 13.2917 11.0833 13.2917C8.50598 13.2917 6.41665 11.1277 6.41665 8.45833C6.41665 5.78896 8.50598 3.625 11.0833 3.625C13.6606 3.625 15.75 5.78896 15.75 8.45833Z" stroke="#C0C0C0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
function CrudList({
|
|
4
|
+
entityKey,
|
|
5
|
+
fetchData,
|
|
6
|
+
entitySingleName,
|
|
7
|
+
entityPluralName,
|
|
8
|
+
columns
|
|
9
|
+
}) {
|
|
10
|
+
|
|
11
|
+
const [page, setPage] = useState(1);
|
|
12
|
+
const [items, setItems] = useState([]);
|
|
13
|
+
const [loading, setLoading] = useState(false);
|
|
14
|
+
const [error, setError] = useState('');
|
|
15
|
+
|
|
16
|
+
// Fetch data
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
(async () => {
|
|
19
|
+
try {
|
|
20
|
+
setLoading(true);
|
|
21
|
+
const newData = await fetchData({page});
|
|
22
|
+
|
|
23
|
+
if (newData.length === 0) {
|
|
24
|
+
setLoading(false);
|
|
25
|
+
setError(`No ${entityPluralName} found.`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
setItems(newData[entityKey]);
|
|
30
|
+
setLoading(false);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error("Error fetching data:", error);
|
|
33
|
+
setLoading(false);
|
|
34
|
+
}
|
|
35
|
+
})();
|
|
36
|
+
}, [entityKey, page]);
|
|
37
|
+
|
|
38
|
+
const navigateToCrudSingle = (id) => {
|
|
39
|
+
window.location.href = `/portal/${entityKey}/${id}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<div className="crud-list">
|
|
44
|
+
<div className="top-action-bar">
|
|
45
|
+
<button onClick={() => {window.location.href = `/portal/${entityKey}/new`}}>Create New {entitySingleName}</button>
|
|
46
|
+
</div>
|
|
47
|
+
<div className="list-table">
|
|
48
|
+
<table>
|
|
49
|
+
<thead>
|
|
50
|
+
<tr>
|
|
51
|
+
{columns.map(col => (
|
|
52
|
+
<th key={col.key}>{col.label}</th>
|
|
53
|
+
))}
|
|
54
|
+
</tr>
|
|
55
|
+
</thead>
|
|
56
|
+
<tbody>
|
|
57
|
+
{loading ? (
|
|
58
|
+
<tr>
|
|
59
|
+
<td colSpan={columns.length}>Loading...</td>
|
|
60
|
+
</tr>
|
|
61
|
+
) : error ? (
|
|
62
|
+
<tr>
|
|
63
|
+
<td colSpan={columns.length}>{error}</td>
|
|
64
|
+
</tr>
|
|
65
|
+
) : items && items.length > 0 ? (
|
|
66
|
+
items.map((item, index) => (
|
|
67
|
+
<tr key={index} onClick={() => {navigateToCrudSingle(item.id)}}>
|
|
68
|
+
{columns.map(col => (
|
|
69
|
+
<td key={col.key}>{item[col.key]}</td>
|
|
70
|
+
))}
|
|
71
|
+
</tr>
|
|
72
|
+
))
|
|
73
|
+
) : (
|
|
74
|
+
<tr>
|
|
75
|
+
<td colSpan={columns.length}>No {entityPluralName} available.</td>
|
|
76
|
+
</tr>
|
|
77
|
+
)}
|
|
78
|
+
</tbody>
|
|
79
|
+
</table>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export default CrudList;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
.list-table {
|
|
2
|
+
table {
|
|
3
|
+
width: 100%;
|
|
4
|
+
border-collapse: collapse;
|
|
5
|
+
|
|
6
|
+
thead {
|
|
7
|
+
th {
|
|
8
|
+
padding-top: 24px;
|
|
9
|
+
padding-bottom: 24px;
|
|
10
|
+
font-size: 16px;
|
|
11
|
+
font-weight: 400;
|
|
12
|
+
text-align: left;
|
|
13
|
+
border: none;
|
|
14
|
+
background: @dark-3;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
|
|
17
|
+
&:first-child {
|
|
18
|
+
border-top-left-radius: 10px;
|
|
19
|
+
padding-left: 30px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
&:last-child {
|
|
23
|
+
border-top-right-radius: 10px;
|
|
24
|
+
padding-right: 30px;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
tr {
|
|
30
|
+
td {
|
|
31
|
+
padding-top: 15px;
|
|
32
|
+
padding-bottom: 15px;
|
|
33
|
+
transition: color 0.2s;
|
|
34
|
+
|
|
35
|
+
&:first-child {
|
|
36
|
+
padding-left: 30px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&:last-child {
|
|
40
|
+
padding-right: 30px;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&:nth-child(even) {
|
|
45
|
+
td {
|
|
46
|
+
background: @dark-3;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&:hover {
|
|
51
|
+
cursor: pointer;
|
|
52
|
+
|
|
53
|
+
td {
|
|
54
|
+
color: @green-main;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import React, {useState, useEffect, useRef} from "react";
|
|
2
|
+
|
|
3
|
+
type CustomSelectProps<T> = {
|
|
4
|
+
placeholder: string;
|
|
5
|
+
name: string;
|
|
6
|
+
options: T[];
|
|
7
|
+
labelKey: keyof T;
|
|
8
|
+
selectedOption: T | null;
|
|
9
|
+
setSelectedOption: (option: T) => void;
|
|
10
|
+
icon?: string | null;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const CustomSelect = ({
|
|
14
|
+
placeholder,
|
|
15
|
+
name,
|
|
16
|
+
options,
|
|
17
|
+
labelKey,
|
|
18
|
+
setSelectedOption,
|
|
19
|
+
selectedOption,
|
|
20
|
+
icon
|
|
21
|
+
}): CustomSelectProps<T> => {
|
|
22
|
+
|
|
23
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
24
|
+
const [isClosing, setIsClosing] = useState(false);
|
|
25
|
+
|
|
26
|
+
// Close dropdown
|
|
27
|
+
const closeDropdown = () => {
|
|
28
|
+
setIsClosing(true);
|
|
29
|
+
setIsOpen(false);
|
|
30
|
+
setTimeout(() => {
|
|
31
|
+
setIsClosing(false);
|
|
32
|
+
}, 300);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// Open dropdown
|
|
36
|
+
const openDropdown = () => {
|
|
37
|
+
setIsOpen(true);
|
|
38
|
+
setIsClosing(false);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Handle click for opening and closing
|
|
42
|
+
const handleClick = () => {
|
|
43
|
+
if (!isOpen) {
|
|
44
|
+
openDropdown();
|
|
45
|
+
} else {
|
|
46
|
+
closeDropdown();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<>
|
|
52
|
+
{placeholder && name && options && labelKey && setSelectedOption &&
|
|
53
|
+
<div className={`custom-select ${isOpen && "open"} ${isClosing ? "closing" : ""}`}>
|
|
54
|
+
<div className="custom-select-input" id={name} name={name} onClick={handleClick}>
|
|
55
|
+
{icon && <img src={icon} alt="icon" />}
|
|
56
|
+
{selectedOption && selectedOption[labelKey] ? (
|
|
57
|
+
<span>{selectedOption[labelKey]}</span>
|
|
58
|
+
) : (
|
|
59
|
+
<span>{placeholder}</span>
|
|
60
|
+
)}
|
|
61
|
+
</div>
|
|
62
|
+
{isOpen && (
|
|
63
|
+
<div className="custom-select-options" onMouseLeave={closeDropdown} >
|
|
64
|
+
<div className="custom-select-options-inner">
|
|
65
|
+
{options.map((option, index) => {
|
|
66
|
+
return (
|
|
67
|
+
<div key={index} className="custom-select-option" onClick={() => {setSelectedOption(option); setIsOpen(false)}}>
|
|
68
|
+
{option[labelKey]}
|
|
69
|
+
</div>
|
|
70
|
+
)
|
|
71
|
+
})}
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
)}
|
|
75
|
+
</div>
|
|
76
|
+
}
|
|
77
|
+
</>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export default CustomSelect;
|
|
File without changes
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Link } from "react-router-dom";
|
|
3
|
+
import { useDispatch } from "react-redux";
|
|
4
|
+
import { login } from "../../slices/authSlice";
|
|
5
|
+
|
|
6
|
+
function LoginForm() {
|
|
7
|
+
|
|
8
|
+
const dispatch = useDispatch();
|
|
9
|
+
const [username, setUsername] = useState("");
|
|
10
|
+
const [password, setPassword] = useState("");
|
|
11
|
+
const [loginMessage, setLoginMessage] = useState("");
|
|
12
|
+
|
|
13
|
+
const handleLogin = async (e) => {
|
|
14
|
+
e.preventDefault();
|
|
15
|
+
|
|
16
|
+
if (username === "" || password === "") {
|
|
17
|
+
setLoginMessage("Please enter your email and password");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
dispatch(login({username, password}));
|
|
22
|
+
} catch (error) {
|
|
23
|
+
setLoginMessage("Error logging in: " + error.response?.data?.message || "Unknown error");
|
|
24
|
+
console.error('Error logging in:', error);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<form className="login-form" onSubmit={handleLogin}>
|
|
30
|
+
<input
|
|
31
|
+
type="text"
|
|
32
|
+
name="username"
|
|
33
|
+
placeholder="username / email"
|
|
34
|
+
className="username"
|
|
35
|
+
value={username}
|
|
36
|
+
onChange={(e) => setUsername(e.target.value)}
|
|
37
|
+
/>
|
|
38
|
+
<input
|
|
39
|
+
type="password"
|
|
40
|
+
name="password"
|
|
41
|
+
placeholder="password"
|
|
42
|
+
className="password"
|
|
43
|
+
value={password}
|
|
44
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
45
|
+
/>
|
|
46
|
+
<button type="submit">Login</button>
|
|
47
|
+
{loginMessage && <div className="login-message">{loginMessage}</div>}
|
|
48
|
+
<Link
|
|
49
|
+
to="/portal/forgotten-password"
|
|
50
|
+
className="text-link forgotten-password"
|
|
51
|
+
>
|
|
52
|
+
Forgotten Password?
|
|
53
|
+
</Link>
|
|
54
|
+
</form>
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export default LoginForm;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import TextInput from '../../elements/TextInput/TextInput';
|
|
2
|
+
import Repeater from '../../elements/Repeater/Repeater';
|
|
3
|
+
import RichTextInput from '../../elements/RichTextInput/RichTextInput';
|
|
4
|
+
import ImageInput from '../../elements/ImageInput/ImageInput';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
|
|
7
|
+
function PageBlockSwitch({ block, pageBlocks, updatePageBlocks, blockIndex, allBlocks, parentBlockInstanceId }) {
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<>
|
|
11
|
+
{block.fields.map(field => {
|
|
12
|
+
switch (field.type) {
|
|
13
|
+
|
|
14
|
+
// text input
|
|
15
|
+
case 'text':
|
|
16
|
+
return (
|
|
17
|
+
<TextInput
|
|
18
|
+
key={field.key}
|
|
19
|
+
label={field.name}
|
|
20
|
+
placeholder={`Enter ${field.name}`}
|
|
21
|
+
value={field.value || ''}
|
|
22
|
+
onChange={(e) => {
|
|
23
|
+
const newBlock = {
|
|
24
|
+
...block,
|
|
25
|
+
fields: block.fields.map(f => ({ ...f }))
|
|
26
|
+
};
|
|
27
|
+
const newField = newBlock.fields.find(f => f.key === field.key);
|
|
28
|
+
newField.value = e.target.value;
|
|
29
|
+
updatePageBlocks(newBlock);
|
|
30
|
+
}}
|
|
31
|
+
errorMessage={`Invalid ${field.name}`}
|
|
32
|
+
isValid={true}
|
|
33
|
+
/>
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
// rich text
|
|
37
|
+
case 'richtext':
|
|
38
|
+
return (
|
|
39
|
+
<RichTextInput
|
|
40
|
+
key={field.key}
|
|
41
|
+
label={field.name}
|
|
42
|
+
value={field.value || ''}
|
|
43
|
+
onChange={(value) => {
|
|
44
|
+
const newBlock = {
|
|
45
|
+
...block,
|
|
46
|
+
fields: block.fields.map(f => ({ ...f }))
|
|
47
|
+
};
|
|
48
|
+
const newField = newBlock.fields.find(f => f.key === field.key);
|
|
49
|
+
newField.value = value;
|
|
50
|
+
updatePageBlocks(newBlock);
|
|
51
|
+
}}
|
|
52
|
+
errorMessage={`Invalid ${field.name}`}
|
|
53
|
+
isValid={true}
|
|
54
|
+
/>
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// image input
|
|
58
|
+
case 'image':
|
|
59
|
+
return (
|
|
60
|
+
<ImageInput
|
|
61
|
+
key={field.key}
|
|
62
|
+
label={field.name}
|
|
63
|
+
value={field.value || ''}
|
|
64
|
+
onChange={(base64File, mimeType, fileName) => {
|
|
65
|
+
const newBlock = {
|
|
66
|
+
...block,
|
|
67
|
+
fields: block.fields.map(f => ({ ...f }))
|
|
68
|
+
};
|
|
69
|
+
const newField = newBlock.fields.find(f => f.key === field.key);
|
|
70
|
+
newField.value = newField.value || {};
|
|
71
|
+
newField.value.file = base64File;
|
|
72
|
+
newField.value.mimeType = mimeType;
|
|
73
|
+
newField.value.fileName = fileName;
|
|
74
|
+
updatePageBlocks(newBlock);
|
|
75
|
+
}}
|
|
76
|
+
errorMessage={`Invalid ${field.name}`}
|
|
77
|
+
isValid={true}
|
|
78
|
+
/>
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// repeater
|
|
82
|
+
case 'repeater':
|
|
83
|
+
const newRepeaterBlock = allBlocks.find(b => b.key === field.repeaterType);
|
|
84
|
+
const defaultItem = {
|
|
85
|
+
...newRepeaterBlock,
|
|
86
|
+
instanceId: uuidv4(),
|
|
87
|
+
fields: newRepeaterBlock.fields.map(f => ({ ...f }))
|
|
88
|
+
};
|
|
89
|
+
delete defaultItem.id;
|
|
90
|
+
const existingRepeaterBlocks = block.fields.find(f => f.key === field.key)?.value || [];
|
|
91
|
+
|
|
92
|
+
return (
|
|
93
|
+
<div className="nested-block">
|
|
94
|
+
<Repeater
|
|
95
|
+
items={existingRepeaterBlocks}
|
|
96
|
+
setItem={(item, index, remove = false) => {
|
|
97
|
+
const parentInstanceId = block.instanceId;
|
|
98
|
+
updatePageBlocks({
|
|
99
|
+
...item,
|
|
100
|
+
fields: item.fields.map(f => ({ ...f }))
|
|
101
|
+
}, parentInstanceId, item.key, remove);
|
|
102
|
+
}}
|
|
103
|
+
defaultItem={defaultItem}
|
|
104
|
+
buttonText={`Add ${field.name}`}
|
|
105
|
+
renderRow={(item, index, updateItem) => {
|
|
106
|
+
console.log('Rendering nested PageBlockSwitch for item:', item);
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<PageBlockSwitch
|
|
110
|
+
block={item}
|
|
111
|
+
pageBlocks={pageBlocks}
|
|
112
|
+
updatePageBlocks={updatePageBlocks}
|
|
113
|
+
blockIndex={index}
|
|
114
|
+
allBlocks={allBlocks}
|
|
115
|
+
parentBlockInstanceId={block.instanceId}
|
|
116
|
+
/>
|
|
117
|
+
)
|
|
118
|
+
}}
|
|
119
|
+
/>
|
|
120
|
+
</div>
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
})}
|
|
125
|
+
</>
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export default PageBlockSwitch;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import UserInfo from "../UserInfo/UserInfo";
|
|
2
|
+
import { Link } from "react-router-dom";
|
|
3
|
+
|
|
4
|
+
function Sidebar() {
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
<div className="portal-sidebar">
|
|
8
|
+
<div className="inner">
|
|
9
|
+
<ul>
|
|
10
|
+
<li className="icon-dashboard"><Link to="/portal/dashboard">Dashboard</Link></li>
|
|
11
|
+
</ul>
|
|
12
|
+
<span className="separator"></span>
|
|
13
|
+
<ul>
|
|
14
|
+
<li className="icon-users"><Link to="/portal/users">Users</Link></li>
|
|
15
|
+
</ul>
|
|
16
|
+
<span className="separator"></span>
|
|
17
|
+
<ul>
|
|
18
|
+
<li className="icon-users"><Link to="/portal/pages">Pages</Link></li>
|
|
19
|
+
<li><Link to="/portal/blocks">Blocks</Link></li>
|
|
20
|
+
</ul>
|
|
21
|
+
<span className="separator"></span>
|
|
22
|
+
<ul>
|
|
23
|
+
<li className="icon-reports"><Link to="/portal/reports">Reports</Link></li>
|
|
24
|
+
<li><Link to="/portal/logs">Logs</Link></li>
|
|
25
|
+
</ul>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<UserInfo />
|
|
29
|
+
</div>
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default Sidebar;
|