From 622c9f8eb7d5808bbc8da8d5e2af286736137854 Mon Sep 17 00:00:00 2001 From: dwindown Date: Tue, 28 Apr 2026 16:48:08 +0700 Subject: [PATCH] feat: add React FieldRenderer system for settings and metaboxes Complete React-based field rendering system that replaces WPCFTO Vue.js layer while maintaining PHP field configuration compatibility. Components: - FieldRenderer: Main renderer with tabs support (metabox) and direct mode (settings) - FieldTypes: 15+ field types (Text, Number, Select, Radio, Date, etc.) - RepeaterField: Collapsible repeater with currency label parsing - DependencyEngine: Show/hide fields based on conditions - ValidationEngine: Client-side validation with error messages - SettingsRenderer: Settings page with AJAX save to wp_options Features: - Repeater rows collapsed by default with readable currency titles - Searchable dropdowns using Popover + Command pattern - Proper label resolution for pre-selected values - Hidden input sync for WordPress form submission Also includes: - FieldConfigBridge: Transform PHP configs to React format - Updated Settings.php for React-based settings page - Radio-group UI component - wp-admin-restore.css for admin panel isolation --- .gitignore | 15 +- FINDINGS.md | 196 ---- MIGRATION_STRATEGY.md | 282 ------ TASKLIST.md | 193 ---- includes/Access.php | 134 +-- includes/Admin/FieldConfigBridge.php | 460 ++++++++++ includes/Admin/ReactAdmin.php | 34 +- includes/Coupon.php | 205 ++++- includes/Settings.php | 166 +++- ...6014fa44009043f15306d9b1367cc53311.json.gz | Bin 649 -> 0 bytes ...9f25aefd101c5c0ef986454ff4dcd06071.json.gz | Bin 1012 -> 0 bytes ...2340cc890cf903cf840777316b379e45b3.json.gz | Bin 1449 -> 0 bytes ...b0c1e706cf4a1c00a6f34556a6b032790d.json.gz | Bin 934 -> 0 bytes ...d607e5a8c6e67cbdc541cb3eac6504933d.json.gz | Bin 1034 -> 0 bytes ...8a87a42c6120b6a9f04a201490ba67741c.json.gz | Bin 960 -> 0 bytes ...1374b225048ab0d451abbe333d09fab460.json.gz | Bin 700 -> 0 bytes ...dc2601c81ee83787cba3ef8a21c1a61a98.json.gz | Bin 827 -> 0 bytes ...7090775b2f114883efd987240eeb836858.json.gz | Bin 2635 -> 0 bytes ...d9e4f30538d3f73e7dabbde22493ecd5f5.json.gz | Bin 2615 -> 0 bytes ...fe025601bbd7f741bc481da551d52937e0.json.gz | Bin 2942 -> 0 bytes ...6e3ce0455b2ffc6fe20655310e48e3fcfa.json.gz | Bin 3682 -> 0 bytes ...556cfd9934ff7d7c5bd9901013c072f54b.json.gz | Bin 1280 -> 0 bytes ...1ef2358d08761db0147c49525d248ceddb.json.gz | Bin 1140 -> 0 bytes ...1913ebadf428560780b121588c6c0cdf65.json.gz | Bin 3557 -> 0 bytes ...954fa5f10a4b2ae8e4c257d9476fd17232.json.gz | Bin 3220 -> 0 bytes ...282abe6ee2cf37849fea42b95cf0ead53d.json.gz | Bin 2629 -> 0 bytes ...8ba13cafe629ac4cbda7f836d7b5a83c4f.json.gz | Bin 1411 -> 0 bytes ...74a2b6f2fab5aa4e98f372c3d374ecb7fa.json.gz | Bin 2607 -> 0 bytes ...ad6b3f9d60b7c51f3c15ea09d83af3ca3b.json.gz | Bin 3224 -> 0 bytes ...f6b1f77d86028e9fd23efb1693778105bc.json.gz | Bin 1036 -> 0 bytes ...45bdd5f1beb5580fec7214e2cad3b4eb57.json.gz | Bin 5294 -> 0 bytes ...490ab0f6323fb8ea902b10fb49eb403b3d.json.gz | Bin 668 -> 0 bytes ...2a144e049aa343aa048a2e21241fcf1732.json.gz | Bin 2018 -> 0 bytes ...067b738ec7bede839c1e70a4a22b04b753.json.gz | Bin 2882 -> 0 bytes ...078500b912790b54cac66002a8925b67d7.json.gz | Bin 1669 -> 0 bytes ...e99aa8acbc329e070074e0e488e1e45cb7.json.gz | Bin 481 -> 0 bytes ...076758a922a7013dae8f82212b9abb6739.json.gz | Bin 3773 -> 0 bytes ...947e95c55edff194cce928d21de9c13b91.json.gz | Bin 1770 -> 0 bytes ...c39c2cd9891c273b41e0a8443e312d26f3.json.gz | Bin 1744 -> 0 bytes ...f21c19646d275b40062957dbcef3289488.json.gz | Bin 696 -> 0 bytes ...1c3a1530a7051fbb8d7e7390f33b51529f.json.gz | Bin 4525 -> 0 bytes ...d91023a3de95e1efd6f29d107893ef8cde.json.gz | Bin 10213 -> 0 bytes ...9a735f7fd259f9103c9a80fd6b45371c52.json.gz | Bin 1206 -> 0 bytes ...5da944cb1b9a304e5963a6cb7c67a08f3a.json.gz | Bin 492 -> 0 bytes ...4b410220376f0269fa8e65567d5f09560e.json.gz | Bin 2120 -> 0 bytes ...e699d302357d69dd944de87b9e90acc5b2.json.gz | Bin 1327 -> 0 bytes ...b9ea75e3c7c9935cb0cf2f4425f5e701ee.json.gz | Bin 2592 -> 0 bytes ...4034e158274e73a10338d67abefd4bdb74.json.gz | Bin 1331 -> 0 bytes ...c0e9508be06858205d6d61cae39dea4b2e.json.gz | Bin 12088 -> 0 bytes ...2ecee6d5cc9456e05e1894e47c8af95690.json.gz | Bin 2435 -> 0 bytes ...b9e30a28bdc17fba9f40edf0b3adde993e.json.gz | Bin 976 -> 0 bytes ...02d2acc01a41ddbdb4ef943bf013b2982b.json.gz | Bin 377 -> 0 bytes ...e327b398f37d45d2d9e2336e460917215c.json.gz | Bin 1303 -> 0 bytes ...3a4cb4dcfc1656a871c047022e2901b8e8.json.gz | Bin 995 -> 0 bytes ...a64cc7262104a35228af9cefbac72c57eb.json.gz | Bin 2240 -> 0 bytes ...a26bbd7b51edc56eb9447ae968ea1f9725.json.gz | Bin 1460 -> 0 bytes ...d5bc8f7a74878d710cd61e786f7dece1f9.json.gz | Bin 3258 -> 0 bytes ...761c03747c09a08c265122869f0005264b.json.gz | Bin 3858 -> 0 bytes ...3fc356c53b589e5bd29ba76a5a07f98cfd.json.gz | Bin 731 -> 0 bytes ...49ba7b79895722a37b94fd018e18bd2ac4.json.gz | Bin 330 -> 0 bytes ...4a3237f0af89f6da2b476e42126790366a.json.gz | Bin 2932 -> 0 bytes ...e236cca65f4149c9c42135fa79a1f8d24b.json.gz | Bin 10150 -> 0 bytes ...1e799ee018b9105f438b90f6d82a19ca75.json.gz | Bin 2248 -> 0 bytes ...308dacff02cd1b74d9d32eff007bcff386.json.gz | Bin 3851 -> 0 bytes ...c2fbaf04621d06ae71f8568bae5ed52c34.json.gz | Bin 874 -> 0 bytes ...c2ad7d378e499ac1f4a918dc1f1fff740f.json.gz | Bin 594 -> 0 bytes ...69dc9fb2a7c7bfc3f04075dd253e479259.json.gz | Bin 1680 -> 0 bytes ...9ceed7a027159c89bcbf5598c9fe56b8d1.json.gz | Bin 1032 -> 0 bytes ...b5492d9d187745b1bcb12655fe751c3ed7.json.gz | Bin 12043 -> 0 bytes ...561717e806497911d2fccb63ed06d04ed7.json.gz | Bin 1092 -> 0 bytes ...601f79c647c34df3c77ae4b5e9c025c959.json.gz | Bin 1990 -> 0 bytes ...6d451696b52a728544a3a028125159b35b.json.gz | Bin 946 -> 0 bytes ...d055c580bd2b7c87b28d303c5414dda449.json.gz | Bin 4502 -> 0 bytes ...20d20be3ba21f3d898ef1239e5e2e77ee8.json.gz | Bin 896 -> 0 bytes ...08beba46619d742fd339d4f93457ffc4a0.json.gz | Bin 2236 -> 0 bytes ...24768f48d46e6f3c420e3ef493f3776689.json.gz | Bin 332 -> 0 bytes ...f711dd307c272a17c0b3fa63dac70658e8.json.gz | Bin 5246 -> 0 bytes ...c4220b4b7c3aaf05789564f2153fe8564a.json.gz | Bin 1992 -> 0 bytes ...47bc063b0da8c0af765b6f90647731ca80.json.gz | Bin 1881 -> 0 bytes ...4f9833484004d3ebd442de956e40f29c90.json.gz | Bin 1722 -> 0 bytes ...adb8b2d2d6a2eb64c50d073e4969aaf4d6.json.gz | Bin 1118 -> 0 bytes ...d1a53571a297e42f76e12bfea69008e0e1.json.gz | Bin 608 -> 0 bytes ...b7cec36e726e38e29cbc1defd7d681f8fb.json.gz | Bin 1467 -> 0 bytes ...689875db81b8a599935bbe5818021c146f.json.gz | Bin 3179 -> 0 bytes ...cf3d64a741cb2fb022cf781fac4171a8f0.json.gz | Bin 1512 -> 0 bytes ...46121966f836ee2a2fe60307338dc66c9a.json.gz | Bin 2565 -> 0 bytes ...e204402eb5d142535b9b3de424d026ed50.json.gz | Bin 470 -> 0 bytes ...824aea3bbf9997d55a62c5aa71669730b2.json.gz | Bin 2627 -> 0 bytes ...b3fbeed194dca7c3c788e28b55f18454b4.json.gz | Bin 744 -> 0 bytes ...801edf799cc77924d3794f2bf566d3c348.json.gz | Bin 2795 -> 0 bytes ...f62f81ff6400630b08f6d2900f354bcb5e.json.gz | Bin 10400 -> 0 bytes ...7ea398f869af510a764cb9feee9ecb6bd2.json.gz | Bin 950 -> 0 bytes ...240215968cecc7ce5ed7df96aae15cf23c.json.gz | Bin 2495 -> 0 bytes ...354be15632d4208fff53cb9d84f7309af6.json.gz | Bin 3729 -> 0 bytes ...d470c996d742a08eb93b740e7669165b6c.json.gz | Bin 5290 -> 0 bytes ...84d62ea96f4e64147e8c86d8e7d286b681.json.gz | Bin 3812 -> 0 bytes ...7bcd4f833ddbb91198129c7c6962ce6dd8.json.gz | Bin 10549 -> 0 bytes ...68fd5210954faa4b43093b5d079e6c650c.json.gz | Bin 2633 -> 0 bytes ...3733effd023c686ccdd2deac44e89bcb55.json.gz | Bin 10574 -> 0 bytes ...acd20270a20d2dffc1965c33439d07ae37.json.gz | Bin 3252 -> 0 bytes ...ad9f7cebce4fc4fb80b7669ec46448a356.json.gz | Bin 792 -> 0 bytes ...779b37880fe1b1538e6b7e5545194d8451.json.gz | Bin 2919 -> 0 bytes ...03eb1db0401b9dd5fb07164d0bac532706.json.gz | Bin 1149 -> 0 bytes ...e63def96054e41eeb7184e2fd3ab589941.json.gz | Bin 3254 -> 0 bytes ...a113adb4302283be03e9d9fed59c15bc95.json.gz | Bin 1013 -> 0 bytes ...aa4e379af0ea1ec959329f494590092f95.json.gz | Bin 2571 -> 0 bytes ...a154c33a34e8a5ba903c937fa21ea0940d.json.gz | Bin 314 -> 0 bytes ...1ba3a458bc348e766a382a697884f13791.json.gz | Bin 1456 -> 0 bytes ...571f92d021b35626b04e1893841866e121.json.gz | Bin 781 -> 0 bytes ...71d22d28b9a1206db42363d2314834d09e.json.gz | Bin 1148 -> 0 bytes ...3fd22301890abaee9ff2e34c6aa35df12c.json.gz | Bin 3261 -> 0 bytes ...2f39e6631b46caae84f548766c0bc44d2e.json.gz | Bin 12092 -> 0 bytes ...ed8d492e0a1b4c12583b0265a38ac7fe1c.json.gz | Bin 2938 -> 0 bytes ...966064aaf20ef47c14e00b953fa5f2a90f.json.gz | Bin 4331 -> 0 bytes ...0939182ea6867d80c10950d522da931645.json.gz | Bin 337 -> 0 bytes ...6363675a38a97ed270c522e81684d3a00c.json.gz | Bin 3846 -> 0 bytes ...1db436dce322f4e27c7bf491a17f683a8c.json.gz | Bin 1113 -> 0 bytes ...9aa67e2208bf3af45eecd263821439d691.json.gz | Bin 671 -> 0 bytes ...5df4573733e046da871b44cb191b658753.json.gz | Bin 1747 -> 0 bytes ...2b4bd8b59737b8f7332afd0bd888723c97.json.gz | Bin 12053 -> 0 bytes ...bc80716ef8e1e601716cb0e4c36412d093.json.gz | Bin 3796 -> 0 bytes ...0a35d7ec3efcae54a6548bd74391ca508c.json.gz | Bin 4528 -> 0 bytes ...828972e9a28adff36ea5959cd830f2bb2c.json.gz | Bin 668 -> 0 bytes ...61513de1cd10172c31a562660b3bc429d6.json.gz | Bin 776 -> 0 bytes ...9a7650fe483a71d78b804a736e833c1285.json.gz | Bin 981 -> 0 bytes ...f5948d308c8405ee75e2830902d6ede1e6.json.gz | Bin 1957 -> 0 bytes ...376996397a48339e10a875fc39de53507a.json.gz | Bin 1240 -> 0 bytes ...97448a34f4b857307e9679bdc83684074e.json.gz | Bin 3868 -> 0 bytes ...a0f1d036561c1bc9ec2925a980e80e01a2.json.gz | Bin 561 -> 0 bytes ...fc20fafce4c932851056c5c4f12da5f041.json.gz | Bin 4354 -> 0 bytes ...caa73d6c087b5a567c44c4f51e9b44f981.json.gz | Bin 1164 -> 0 bytes ...ce59d33deeaa57e8201d0362c23f81b46e.json.gz | Bin 3043 -> 0 bytes ...4cbeaf869a996fcecc39b58034960a9cdb.json.gz | Bin 10171 -> 0 bytes ...dbfc4da37737f244f90051c188cd78ddd8.json.gz | Bin 2508 -> 0 bytes ...bc273e964ba039179bc01ee68daa5e5556.json.gz | Bin 2638 -> 0 bytes ...7b3f225fcdde88fee2d4b06743fce98062.json.gz | Bin 1245 -> 0 bytes ...1369c2a5a65b19233f83519678c5e92fde.json.gz | Bin 1278 -> 0 bytes ...213462abe951c7317b80c6207b8d5ae1a2.json.gz | Bin 2209 -> 0 bytes ...591b702f809c31bc9099c97e653288eb95.json.gz | Bin 2629 -> 0 bytes ...f3b4cb26eb063065063fadb75e21483230.json.gz | Bin 2528 -> 0 bytes ...94f91ea7dfd2561e0825f578402b494a75.json.gz | Bin 1768 -> 0 bytes ...97c5192cc26b2eba9a88137a56f5241cad.json.gz | Bin 2648 -> 0 bytes ...dc630384cf4f12bfa0017cabc0b3d22e87.json.gz | Bin 2165 -> 0 bytes ...1d3c659acc1da1885b7e778aab0fe32045.json.gz | Bin 2098 -> 0 bytes ...ae541e6b8d685b2752e1ccfe32f70ac9a8.json.gz | Bin 3254 -> 0 bytes ...f7ac05a4a5e7651db435e7c1edd7ecb6cc.json.gz | Bin 979 -> 0 bytes ...ca1bac0185e9a5467996f9400108d8b99c.json.gz | Bin 10175 -> 0 bytes ...925210a838a13951e7932659a085214a27.json.gz | Bin 2624 -> 0 bytes ...06851602eddca5fa04708b8a23f79894ca.json.gz | Bin 471 -> 0 bytes ...a8c02f484ce3a08d7799f8dc0ef696fe2e.json.gz | Bin 2011 -> 0 bytes ...6a7ad25504bb51743d91923493c38cc93c.json.gz | Bin 2455 -> 0 bytes ...6c887cc20e8e476a9f74461348eace8573.json.gz | Bin 2565 -> 0 bytes ...13816ba665fbe73e2afb1165ee3f11af61.json.gz | Bin 1060 -> 0 bytes ...68563eaae529e6486652260fe4c84bb16f.json.gz | Bin 1047 -> 0 bytes ...a72d8da1380b01e34d6ff458720c03eeb1.json.gz | Bin 2236 -> 0 bytes ...23b8f61d7be3838703b535c8832d36e1e0.json.gz | Bin 2624 -> 0 bytes ...0f46752d6f3749bf8c96a0c28d9659f87b.json.gz | Bin 864 -> 0 bytes ...1c20c5c693b20f6cb85cb5097e12f163cc.json.gz | Bin 1004 -> 0 bytes ...cf6c7803bdd251ab474b477be97e0b5eae.json.gz | Bin 1973 -> 0 bytes ...89176db32f81e09354d1e7679385396df6.json.gz | Bin 3056 -> 0 bytes node_modules/.package-lock.json | 855 +++++++++++++++++ package-lock.json | 858 ++++++++++++++++++ package.json | 3 + src/admin/components/App.js | 2 +- src/admin/components/SettingsRenderer.js | 229 +++++ src/admin/components/coupons/CouponMetabox.js | 294 +++++- .../dashboard/AnalyticsDashboard.js | 39 +- .../field-renderer/DependencyEngine.js | 73 ++ .../field-renderer/FieldRenderer.js | 278 ++++++ .../FieldTypes/AutocompleteField.js | 229 +++++ .../field-renderer/FieldTypes/ColorField.js | 70 ++ .../field-renderer/FieldTypes/DateField.js | 54 ++ .../FieldTypes/HintTextareaField.js | 105 +++ .../field-renderer/FieldTypes/ImageField.js | 124 +++ .../FieldTypes/ImageSelectField.js | 99 ++ .../FieldTypes/MultiCheckboxField.js | 82 ++ .../FieldTypes/NotificationField.js | 40 + .../field-renderer/FieldTypes/NumberField.js | 57 ++ .../field-renderer/FieldTypes/RadioField.js | 64 ++ .../FieldTypes/RepeaterField.js | 250 +++++ .../field-renderer/FieldTypes/SectionField.js | 29 + .../field-renderer/FieldTypes/SwitchField.js | 46 + .../field-renderer/FieldTypes/TextField.js | 55 ++ .../FieldTypes/TextareaField.js | 55 ++ .../field-renderer/FieldTypes/TinymceField.js | 107 +++ .../field-renderer/HiddenInputSync.js | 58 ++ .../field-renderer/ValidationEngine.js | 98 ++ src/admin/components/field-renderer/index.js | 12 + .../products/VariationPricingTable.css | 126 --- .../products/VariationPricingTable.js | 666 ++++++-------- .../components/settings/GlobalSettings.js | 28 +- src/admin/components/ui/dialog.js | 24 +- src/admin/components/ui/dropdown-menu.js | 22 +- src/admin/components/ui/input.js | 4 +- src/admin/components/ui/radio-group.js | 39 + src/admin/components/ui/select.js | 4 +- src/admin/components/ui/table.js | 6 +- src/admin/index.js | 56 +- src/admin/pages/Access.js | 120 ++- src/admin/pages/Coupons.js | 73 +- src/admin/pages/Customers.js | 10 +- src/admin/pages/Forms.js | 58 +- src/admin/pages/Licenses.js | 28 +- src/admin/pages/Products.js | 60 +- src/admin/styles/globals.css | 4 +- src/admin/styles/wp-admin-restore.css | 122 +++ 206 files changed, 5788 insertions(+), 1612 deletions(-) delete mode 100644 FINDINGS.md delete mode 100644 MIGRATION_STRATEGY.md delete mode 100644 TASKLIST.md create mode 100644 includes/Admin/FieldConfigBridge.php delete mode 100644 node_modules/.cache/babel-loader/045d3f8e6f1af846e24137490aafb46014fa44009043f15306d9b1367cc53311.json.gz delete mode 100644 node_modules/.cache/babel-loader/05edf767bde3958483f734f8e5ab899f25aefd101c5c0ef986454ff4dcd06071.json.gz delete mode 100644 node_modules/.cache/babel-loader/06cd6379690b1a291bee5352eec6a32340cc890cf903cf840777316b379e45b3.json.gz delete mode 100644 node_modules/.cache/babel-loader/0768553d56341503b378d5da5d3440b0c1e706cf4a1c00a6f34556a6b032790d.json.gz delete mode 100644 node_modules/.cache/babel-loader/0ad392e4a022a30eb82054a0147079d607e5a8c6e67cbdc541cb3eac6504933d.json.gz delete mode 100644 node_modules/.cache/babel-loader/0b419eacf377617e67471a6c10a4dd8a87a42c6120b6a9f04a201490ba67741c.json.gz delete mode 100644 node_modules/.cache/babel-loader/0b7882e19c8bdddd6808bd0b54fcd61374b225048ab0d451abbe333d09fab460.json.gz delete mode 100644 node_modules/.cache/babel-loader/0c16c9c136622a9dffba1e2e0345c0dc2601c81ee83787cba3ef8a21c1a61a98.json.gz delete mode 100644 node_modules/.cache/babel-loader/0c906e042fcec3ff659f4d48b76e357090775b2f114883efd987240eeb836858.json.gz delete mode 100644 node_modules/.cache/babel-loader/1135cd978e74ef4ace58bbb07912f7d9e4f30538d3f73e7dabbde22493ecd5f5.json.gz delete mode 100644 node_modules/.cache/babel-loader/14306388a25a4b8b3a799fd624f101fe025601bbd7f741bc481da551d52937e0.json.gz delete mode 100644 node_modules/.cache/babel-loader/14b79987dc3a84ec3a760fa9a4ef506e3ce0455b2ffc6fe20655310e48e3fcfa.json.gz delete mode 100644 node_modules/.cache/babel-loader/161d4a33da4330458afa67644422dc556cfd9934ff7d7c5bd9901013c072f54b.json.gz delete mode 100644 node_modules/.cache/babel-loader/1988a833a5ed49147d6b6ad50aabda1ef2358d08761db0147c49525d248ceddb.json.gz delete mode 100644 node_modules/.cache/babel-loader/1a741df843f1088b111b34098367931913ebadf428560780b121588c6c0cdf65.json.gz delete mode 100644 node_modules/.cache/babel-loader/207fa0ae15859b8a4e0b42b7383880954fa5f10a4b2ae8e4c257d9476fd17232.json.gz delete mode 100644 node_modules/.cache/babel-loader/20cd7d71e889fb4f86d3fc861a3deb282abe6ee2cf37849fea42b95cf0ead53d.json.gz delete mode 100644 node_modules/.cache/babel-loader/215ccb96814ec5dad6acde72ebf5628ba13cafe629ac4cbda7f836d7b5a83c4f.json.gz delete mode 100644 node_modules/.cache/babel-loader/23caee4e453767675cc67f11b1993e74a2b6f2fab5aa4e98f372c3d374ecb7fa.json.gz delete mode 100644 node_modules/.cache/babel-loader/23efb8bd1108d8bcd2059ebb0183a0ad6b3f9d60b7c51f3c15ea09d83af3ca3b.json.gz delete mode 100644 node_modules/.cache/babel-loader/2c16f687347357ed6f396cf4981b97f6b1f77d86028e9fd23efb1693778105bc.json.gz delete mode 100644 node_modules/.cache/babel-loader/2d4f7d4d0f8f62e2acfe3293217b1545bdd5f1beb5580fec7214e2cad3b4eb57.json.gz delete mode 100644 node_modules/.cache/babel-loader/3053032f66a0f732dc147fde0fa793490ab0f6323fb8ea902b10fb49eb403b3d.json.gz delete mode 100644 node_modules/.cache/babel-loader/311922837edbbdae21f8bb4ae3421e2a144e049aa343aa048a2e21241fcf1732.json.gz delete mode 100644 node_modules/.cache/babel-loader/34f09794b9a529a535e41ab268f852067b738ec7bede839c1e70a4a22b04b753.json.gz delete mode 100644 node_modules/.cache/babel-loader/376ac673e9f6e3f956bbce98c538bb078500b912790b54cac66002a8925b67d7.json.gz delete mode 100644 node_modules/.cache/babel-loader/389f811ff9f262e0be744b84cc04a0e99aa8acbc329e070074e0e488e1e45cb7.json.gz delete mode 100644 node_modules/.cache/babel-loader/3a08871aa808e620b9298452a2638f076758a922a7013dae8f82212b9abb6739.json.gz delete mode 100644 node_modules/.cache/babel-loader/3a5850ea685e3d4d797c8bc9cfca9a947e95c55edff194cce928d21de9c13b91.json.gz delete mode 100644 node_modules/.cache/babel-loader/3abdeae1dba3dda270c32c3aec049cc39c2cd9891c273b41e0a8443e312d26f3.json.gz delete mode 100644 node_modules/.cache/babel-loader/3b3826c901df315916fe33d0e37afbf21c19646d275b40062957dbcef3289488.json.gz delete mode 100644 node_modules/.cache/babel-loader/3dc69700142d08627b69de13c68c4d1c3a1530a7051fbb8d7e7390f33b51529f.json.gz delete mode 100644 node_modules/.cache/babel-loader/3e0c80852595c04cdb34c154a893d8d91023a3de95e1efd6f29d107893ef8cde.json.gz delete mode 100644 node_modules/.cache/babel-loader/3f2973fd2f8134ecc06c9146179b859a735f7fd259f9103c9a80fd6b45371c52.json.gz delete mode 100644 node_modules/.cache/babel-loader/3f5c82d17a06143641942822b4334b5da944cb1b9a304e5963a6cb7c67a08f3a.json.gz delete mode 100644 node_modules/.cache/babel-loader/406557e43ef90df4f92c72d94507404b410220376f0269fa8e65567d5f09560e.json.gz delete mode 100644 node_modules/.cache/babel-loader/40a49fa8d838d5ad3c7a94cf6749e0e699d302357d69dd944de87b9e90acc5b2.json.gz delete mode 100644 node_modules/.cache/babel-loader/43b4846c9b00f0d272d3982cb39468b9ea75e3c7c9935cb0cf2f4425f5e701ee.json.gz delete mode 100644 node_modules/.cache/babel-loader/453e089ef2f27b2662355c107ae1f34034e158274e73a10338d67abefd4bdb74.json.gz delete mode 100644 node_modules/.cache/babel-loader/475a2a45118be08d612cf04effa639c0e9508be06858205d6d61cae39dea4b2e.json.gz delete mode 100644 node_modules/.cache/babel-loader/4761dd3ce917ca057f6568fe4d42192ecee6d5cc9456e05e1894e47c8af95690.json.gz delete mode 100644 node_modules/.cache/babel-loader/4eccc33cc79e4736ed7be423dbc5bbb9e30a28bdc17fba9f40edf0b3adde993e.json.gz delete mode 100644 node_modules/.cache/babel-loader/4fd35e2e049de1a500aa0b22088fb502d2acc01a41ddbdb4ef943bf013b2982b.json.gz delete mode 100644 node_modules/.cache/babel-loader/4fe73c5c54f1c20f8d6b184380037ae327b398f37d45d2d9e2336e460917215c.json.gz delete mode 100644 node_modules/.cache/babel-loader/502b22a0aaf17aae320b451c537aca3a4cb4dcfc1656a871c047022e2901b8e8.json.gz delete mode 100644 node_modules/.cache/babel-loader/5522c2d64085e482e0dfc280478c68a64cc7262104a35228af9cefbac72c57eb.json.gz delete mode 100644 node_modules/.cache/babel-loader/565207e7fbd18187e191263c954119a26bbd7b51edc56eb9447ae968ea1f9725.json.gz delete mode 100644 node_modules/.cache/babel-loader/56f67cf10fe3d950cf66b38e21f1c6d5bc8f7a74878d710cd61e786f7dece1f9.json.gz delete mode 100644 node_modules/.cache/babel-loader/56ff2da9eaca4044ea8bcd1b989a0c761c03747c09a08c265122869f0005264b.json.gz delete mode 100644 node_modules/.cache/babel-loader/579e5cca1d2aaf338c42d12ca9e17c3fc356c53b589e5bd29ba76a5a07f98cfd.json.gz delete mode 100644 node_modules/.cache/babel-loader/5814d1e982c2d192333e7d785d45a549ba7b79895722a37b94fd018e18bd2ac4.json.gz delete mode 100644 node_modules/.cache/babel-loader/59dec7e3902b1addbd783ba1ba2fd24a3237f0af89f6da2b476e42126790366a.json.gz delete mode 100644 node_modules/.cache/babel-loader/59e6cb50a62c21cd73de0ec3a02847e236cca65f4149c9c42135fa79a1f8d24b.json.gz delete mode 100644 node_modules/.cache/babel-loader/5a27f19ce1f1ca46b061d1feeb1df31e799ee018b9105f438b90f6d82a19ca75.json.gz delete mode 100644 node_modules/.cache/babel-loader/5aab4366ac87b889d35d3e884b6b07308dacff02cd1b74d9d32eff007bcff386.json.gz delete mode 100644 node_modules/.cache/babel-loader/5be92bf48ed7a014a1507c8f4653dbc2fbaf04621d06ae71f8568bae5ed52c34.json.gz delete mode 100644 node_modules/.cache/babel-loader/5befb0b3ac8516f8814ec95d4e5221c2ad7d378e499ac1f4a918dc1f1fff740f.json.gz delete mode 100644 node_modules/.cache/babel-loader/5c8c87eeb43061043fd34c196b878669dc9fb2a7c7bfc3f04075dd253e479259.json.gz delete mode 100644 node_modules/.cache/babel-loader/5d5c2338351a9de824f67a1cda051a9ceed7a027159c89bcbf5598c9fe56b8d1.json.gz delete mode 100644 node_modules/.cache/babel-loader/5dda7b3abb8a708d5a4a5496c7826eb5492d9d187745b1bcb12655fe751c3ed7.json.gz delete mode 100644 node_modules/.cache/babel-loader/65b5fff42904efd9c9a1398b89959f561717e806497911d2fccb63ed06d04ed7.json.gz delete mode 100644 node_modules/.cache/babel-loader/66986739223199f2555c453810a346601f79c647c34df3c77ae4b5e9c025c959.json.gz delete mode 100644 node_modules/.cache/babel-loader/6ae537d7fe763dcb0d763b1c0a10796d451696b52a728544a3a028125159b35b.json.gz delete mode 100644 node_modules/.cache/babel-loader/6b23656ba3af17f3dc43f2e503885bd055c580bd2b7c87b28d303c5414dda449.json.gz delete mode 100644 node_modules/.cache/babel-loader/6c8d197c6aef81da583f60809805cf20d20be3ba21f3d898ef1239e5e2e77ee8.json.gz delete mode 100644 node_modules/.cache/babel-loader/6fa0661cdd51dc37cfd6fd37b6e1eb08beba46619d742fd339d4f93457ffc4a0.json.gz delete mode 100644 node_modules/.cache/babel-loader/7082dbd657156770d731a66a9accfc24768f48d46e6f3c420e3ef493f3776689.json.gz delete mode 100644 node_modules/.cache/babel-loader/70a0d55c8dc72ef14140ec53febc2ff711dd307c272a17c0b3fa63dac70658e8.json.gz delete mode 100644 node_modules/.cache/babel-loader/7143bc45b681c41e6aed6009c6919bc4220b4b7c3aaf05789564f2153fe8564a.json.gz delete mode 100644 node_modules/.cache/babel-loader/71f4553745f70a67147c89629685a447bc063b0da8c0af765b6f90647731ca80.json.gz delete mode 100644 node_modules/.cache/babel-loader/757e005cd7d8064797f4acf3ee23694f9833484004d3ebd442de956e40f29c90.json.gz delete mode 100644 node_modules/.cache/babel-loader/77c71f7312c55e51ee34833bbbae06adb8b2d2d6a2eb64c50d073e4969aaf4d6.json.gz delete mode 100644 node_modules/.cache/babel-loader/7916e405c9407ec66fffcbaf3cdf8fd1a53571a297e42f76e12bfea69008e0e1.json.gz delete mode 100644 node_modules/.cache/babel-loader/7b4d58247fbd4610bdea98659070acb7cec36e726e38e29cbc1defd7d681f8fb.json.gz delete mode 100644 node_modules/.cache/babel-loader/7d59c9f7ac694670aa532bda1596a4689875db81b8a599935bbe5818021c146f.json.gz delete mode 100644 node_modules/.cache/babel-loader/7e14adc209a2f91edde190f1c99acfcf3d64a741cb2fb022cf781fac4171a8f0.json.gz delete mode 100644 node_modules/.cache/babel-loader/81bc671315573b551e0bfafda03cf846121966f836ee2a2fe60307338dc66c9a.json.gz delete mode 100644 node_modules/.cache/babel-loader/8483ed0fa3b2693a979e68bb8e2ba6e204402eb5d142535b9b3de424d026ed50.json.gz delete mode 100644 node_modules/.cache/babel-loader/86930ed88a7e28745a41fd8ea79627824aea3bbf9997d55a62c5aa71669730b2.json.gz delete mode 100644 node_modules/.cache/babel-loader/879bba7d2f096ffd06e487e598e0acb3fbeed194dca7c3c788e28b55f18454b4.json.gz delete mode 100644 node_modules/.cache/babel-loader/88aee7ccf6295384d11a3e94762c94801edf799cc77924d3794f2bf566d3c348.json.gz delete mode 100644 node_modules/.cache/babel-loader/8ad61b9bd1cdfe0ddc52c8e65cbe1ef62f81ff6400630b08f6d2900f354bcb5e.json.gz delete mode 100644 node_modules/.cache/babel-loader/8aec4f12ecae7ed43bbac9f9590f417ea398f869af510a764cb9feee9ecb6bd2.json.gz delete mode 100644 node_modules/.cache/babel-loader/8b096f8149a5ad8c6ee12d75f49bc2240215968cecc7ce5ed7df96aae15cf23c.json.gz delete mode 100644 node_modules/.cache/babel-loader/8c0f4882f684e83867700f22af9cdb354be15632d4208fff53cb9d84f7309af6.json.gz delete mode 100644 node_modules/.cache/babel-loader/8c9d8b60729ff6d2f5463f198397a7d470c996d742a08eb93b740e7669165b6c.json.gz delete mode 100644 node_modules/.cache/babel-loader/8cb92a48b38da03407ba5f647265a084d62ea96f4e64147e8c86d8e7d286b681.json.gz delete mode 100644 node_modules/.cache/babel-loader/8cc6fe2d32e01bdb05f4edf32353fc7bcd4f833ddbb91198129c7c6962ce6dd8.json.gz delete mode 100644 node_modules/.cache/babel-loader/8dd5ba2fce8cf2b07004cd90c4bd5068fd5210954faa4b43093b5d079e6c650c.json.gz delete mode 100644 node_modules/.cache/babel-loader/8e426bcfb6f3020726963f561d49573733effd023c686ccdd2deac44e89bcb55.json.gz delete mode 100644 node_modules/.cache/babel-loader/8efef825f086cfe4a5abfaaad9f99dacd20270a20d2dffc1965c33439d07ae37.json.gz delete mode 100644 node_modules/.cache/babel-loader/8ff0b9507ffef823cde6831d73d204ad9f7cebce4fc4fb80b7669ec46448a356.json.gz delete mode 100644 node_modules/.cache/babel-loader/917dbb60eabfe705d18c0ed71309c6779b37880fe1b1538e6b7e5545194d8451.json.gz delete mode 100644 node_modules/.cache/babel-loader/92116829bf4ca7bfd69fedfa9a859c03eb1db0401b9dd5fb07164d0bac532706.json.gz delete mode 100644 node_modules/.cache/babel-loader/92365b161cdd21e95aeff200a75ffce63def96054e41eeb7184e2fd3ab589941.json.gz delete mode 100644 node_modules/.cache/babel-loader/929635886c76223418cfd22c17cab2a113adb4302283be03e9d9fed59c15bc95.json.gz delete mode 100644 node_modules/.cache/babel-loader/92abeab5da30d7e2144ff5737a2bd7aa4e379af0ea1ec959329f494590092f95.json.gz delete mode 100644 node_modules/.cache/babel-loader/92d2d68744d462552234c01faf37cfa154c33a34e8a5ba903c937fa21ea0940d.json.gz delete mode 100644 node_modules/.cache/babel-loader/9bfe7c785b2b641544ba7e347b3cb61ba3a458bc348e766a382a697884f13791.json.gz delete mode 100644 node_modules/.cache/babel-loader/9c9100125c88ad0b7765dade3f3a5a571f92d021b35626b04e1893841866e121.json.gz delete mode 100644 node_modules/.cache/babel-loader/9e4e8d2894f4085717a98e04e3974871d22d28b9a1206db42363d2314834d09e.json.gz delete mode 100644 node_modules/.cache/babel-loader/a080d1a23754648bdb5e8c7415aa0a3fd22301890abaee9ff2e34c6aa35df12c.json.gz delete mode 100644 node_modules/.cache/babel-loader/a257a070456d041ea76151dee68ced2f39e6631b46caae84f548766c0bc44d2e.json.gz delete mode 100644 node_modules/.cache/babel-loader/a29cac8cf8dab5757bb7e7dd68c6cded8d492e0a1b4c12583b0265a38ac7fe1c.json.gz delete mode 100644 node_modules/.cache/babel-loader/a3ab99a7ada54d733d4c0d7ee23003966064aaf20ef47c14e00b953fa5f2a90f.json.gz delete mode 100644 node_modules/.cache/babel-loader/ac3817f11ad96cd7c906b29d05f9080939182ea6867d80c10950d522da931645.json.gz delete mode 100644 node_modules/.cache/babel-loader/acb512dd62b4aba9580d7caf58090f6363675a38a97ed270c522e81684d3a00c.json.gz delete mode 100644 node_modules/.cache/babel-loader/aea0c7b05b214d804d3c192558bbc51db436dce322f4e27c7bf491a17f683a8c.json.gz delete mode 100644 node_modules/.cache/babel-loader/b3b6dc03ee608800225dedc49cce4b9aa67e2208bf3af45eecd263821439d691.json.gz delete mode 100644 node_modules/.cache/babel-loader/b677fbd73752330d4c51b01c730d1c5df4573733e046da871b44cb191b658753.json.gz delete mode 100644 node_modules/.cache/babel-loader/b68235784a8a1155ce21560f2190ce2b4bd8b59737b8f7332afd0bd888723c97.json.gz delete mode 100644 node_modules/.cache/babel-loader/b9ad9415434e146b824f735780f297bc80716ef8e1e601716cb0e4c36412d093.json.gz delete mode 100644 node_modules/.cache/babel-loader/badac212d16b2d946a43a49faafee10a35d7ec3efcae54a6548bd74391ca508c.json.gz delete mode 100644 node_modules/.cache/babel-loader/bc439bf28014792e142da51d71bb37828972e9a28adff36ea5959cd830f2bb2c.json.gz delete mode 100644 node_modules/.cache/babel-loader/bcad760df9d8a736199b023ff4e27a61513de1cd10172c31a562660b3bc429d6.json.gz delete mode 100644 node_modules/.cache/babel-loader/be553e714c83718e8bddf3087425d89a7650fe483a71d78b804a736e833c1285.json.gz delete mode 100644 node_modules/.cache/babel-loader/bf45c8260791bbd05d8126d6c8542df5948d308c8405ee75e2830902d6ede1e6.json.gz delete mode 100644 node_modules/.cache/babel-loader/bf58c7a21648a27fad71c7bc0d7097376996397a48339e10a875fc39de53507a.json.gz delete mode 100644 node_modules/.cache/babel-loader/c0a34917af04d61d4c029f54d6939197448a34f4b857307e9679bdc83684074e.json.gz delete mode 100644 node_modules/.cache/babel-loader/c0b8bdfbff93f377f8fb0beac6322da0f1d036561c1bc9ec2925a980e80e01a2.json.gz delete mode 100644 node_modules/.cache/babel-loader/c1d25cfb3503c120e0ccb68f82d0aefc20fafce4c932851056c5c4f12da5f041.json.gz delete mode 100644 node_modules/.cache/babel-loader/c2a8e91893d88b1e67443d54d123adcaa73d6c087b5a567c44c4f51e9b44f981.json.gz delete mode 100644 node_modules/.cache/babel-loader/c3bc25e09be9a4021f7955cfa24938ce59d33deeaa57e8201d0362c23f81b46e.json.gz delete mode 100644 node_modules/.cache/babel-loader/c606103bba57e717885d000da0ada54cbeaf869a996fcecc39b58034960a9cdb.json.gz delete mode 100644 node_modules/.cache/babel-loader/ca772a20aee5982135b3f1d9422a27dbfc4da37737f244f90051c188cd78ddd8.json.gz delete mode 100644 node_modules/.cache/babel-loader/cd6fc8fa7a018c13337e86cfa2f603bc273e964ba039179bc01ee68daa5e5556.json.gz delete mode 100644 node_modules/.cache/babel-loader/cdaea07aa4df61fecc9dcc789aa0237b3f225fcdde88fee2d4b06743fce98062.json.gz delete mode 100644 node_modules/.cache/babel-loader/ce89bfaf800d8b3cde05388aee47431369c2a5a65b19233f83519678c5e92fde.json.gz delete mode 100644 node_modules/.cache/babel-loader/ceeb3cdf10658cc4ac8d273e264fd5213462abe951c7317b80c6207b8d5ae1a2.json.gz delete mode 100644 node_modules/.cache/babel-loader/cff5c02dccd055737cecc7dedcc45c591b702f809c31bc9099c97e653288eb95.json.gz delete mode 100644 node_modules/.cache/babel-loader/d567911666ce4ef783ae71cb439aa0f3b4cb26eb063065063fadb75e21483230.json.gz delete mode 100644 node_modules/.cache/babel-loader/d63221cb0b6269ac298d5747d704b094f91ea7dfd2561e0825f578402b494a75.json.gz delete mode 100644 node_modules/.cache/babel-loader/d91b2b36e48ca7c0ebb556e15f0c5897c5192cc26b2eba9a88137a56f5241cad.json.gz delete mode 100644 node_modules/.cache/babel-loader/db14184189cdf8443ceb7e3ce19a86dc630384cf4f12bfa0017cabc0b3d22e87.json.gz delete mode 100644 node_modules/.cache/babel-loader/dc77c849468835206eacb1ece80dce1d3c659acc1da1885b7e778aab0fe32045.json.gz delete mode 100644 node_modules/.cache/babel-loader/df45a76525273611566339468727cdae541e6b8d685b2752e1ccfe32f70ac9a8.json.gz delete mode 100644 node_modules/.cache/babel-loader/e00d875e481d22f47d6360bc3ecce5f7ac05a4a5e7651db435e7c1edd7ecb6cc.json.gz delete mode 100644 node_modules/.cache/babel-loader/e45f6611ae3be43cc6b5aa48e32a8dca1bac0185e9a5467996f9400108d8b99c.json.gz delete mode 100644 node_modules/.cache/babel-loader/e73c00b9e00cbf33ad52e119af09a2925210a838a13951e7932659a085214a27.json.gz delete mode 100644 node_modules/.cache/babel-loader/e8bb88eb05d83df788e2a10f96234a06851602eddca5fa04708b8a23f79894ca.json.gz delete mode 100644 node_modules/.cache/babel-loader/ed13c9a54578f079d8c9d4ed21f8e6a8c02f484ce3a08d7799f8dc0ef696fe2e.json.gz delete mode 100644 node_modules/.cache/babel-loader/ed21795abbfd1a2691c92acf4df52a6a7ad25504bb51743d91923493c38cc93c.json.gz delete mode 100644 node_modules/.cache/babel-loader/edcf8fe97e6ff6547bf56432618c726c887cc20e8e476a9f74461348eace8573.json.gz delete mode 100644 node_modules/.cache/babel-loader/efb6d49c98f2a7a00c27a048e1de9d13816ba665fbe73e2afb1165ee3f11af61.json.gz delete mode 100644 node_modules/.cache/babel-loader/f1005b5d39cef2b0b72cb853cfcdf568563eaae529e6486652260fe4c84bb16f.json.gz delete mode 100644 node_modules/.cache/babel-loader/f28eeabcf73d2de8205b053399af26a72d8da1380b01e34d6ff458720c03eeb1.json.gz delete mode 100644 node_modules/.cache/babel-loader/f68317661b41a2048ea6563d69b6e323b8f61d7be3838703b535c8832d36e1e0.json.gz delete mode 100644 node_modules/.cache/babel-loader/f9379c17e8d0d328a2c9b0293531b40f46752d6f3749bf8c96a0c28d9659f87b.json.gz delete mode 100644 node_modules/.cache/babel-loader/fb86862ce9a8d9c0cc7c1762c37edd1c20c5c693b20f6cb85cb5097e12f163cc.json.gz delete mode 100644 node_modules/.cache/babel-loader/fe313d2e0b67af7d79fdab50cb57c5cf6c7803bdd251ab474b477be97e0b5eae.json.gz delete mode 100644 node_modules/.cache/babel-loader/ff547fafbfc3fcf6efaaf2a54c8b9b89176db32f81e09354d1e7679385396df6.json.gz create mode 100644 src/admin/components/SettingsRenderer.js create mode 100644 src/admin/components/field-renderer/DependencyEngine.js create mode 100644 src/admin/components/field-renderer/FieldRenderer.js create mode 100644 src/admin/components/field-renderer/FieldTypes/AutocompleteField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/ColorField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/DateField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/HintTextareaField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/ImageField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/ImageSelectField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/MultiCheckboxField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/NotificationField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/NumberField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/RadioField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/RepeaterField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/SectionField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/SwitchField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/TextField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/TextareaField.js create mode 100644 src/admin/components/field-renderer/FieldTypes/TinymceField.js create mode 100644 src/admin/components/field-renderer/HiddenInputSync.js create mode 100644 src/admin/components/field-renderer/ValidationEngine.js create mode 100644 src/admin/components/field-renderer/index.js delete mode 100644 src/admin/components/products/VariationPricingTable.css create mode 100644 src/admin/components/ui/radio-group.js create mode 100644 src/admin/styles/wp-admin-restore.css diff --git a/.gitignore b/.gitignore index 2d0b7c544..66f134d30 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,17 @@ coverage *.ntvs* *.njsproj *.sln -*.sw?node_modules/ +*.sw? + +# Build output +build/ + +# Development notes +FINDINGS.md +MIGRATION_STRATEGY.md +TASKLIST.md +docs/ + +# npm +package-lock.json +node_modules/.package-lock.json diff --git a/FINDINGS.md b/FINDINGS.md deleted file mode 100644 index dbd102366..000000000 --- a/FINDINGS.md +++ /dev/null @@ -1,196 +0,0 @@ -# 🔍 Formipay Plugin — Comprehensive Audit Report - -**Date:** April 17, 2026 -**Auditor:** GitHub Copilot -**Plugin Version:** 1.0.0 -**Files Analyzed:** ~60+ files, ~15,000+ lines of PHP, JS, CSS, HTML - ---- - -## Table of Contents - -- [1. Bugs & Defects](#1-bugs--defects) - - [1.1 Critical Bugs](#11-critical-bugs) - - [1.2 Moderate Bugs](#12-moderate-bugs) -- [2. Security Concerns](#2-security-concerns) -- [3. Architecture & Code Quality Issues](#3-architecture--code-quality-issues) -- [4. Missing Features & Modules](#4-missing-features--modules) -- [5. Performance Issues](#5-performance-issues) -- [6. Missing Admin Pages / Settings](#6-missing-admin-pages--settings) -- [7. Code Cleanup Needed](#7-code-cleanup-needed) -- [8. Opportunities & Nice-to-Haves](#8-opportunities--nice-to-haves) -- [9. Summary Priority Matrix](#9-summary-priority-matrix) -- [10. Architectural Recommendation](#10-architectural-recommendation) - ---- - -## 1. Bugs & Defects - -### 1.1 Critical Bugs - -| # | Location | Issue | Detail | -|---|----------|-------|--------| -| 1 | `includes/Customer.php` ~line 172 `update()` | **Undefined variable — fatal error** | Method builds `$insert_data` and `$where`, but the `$wpdb->update()` call references undefined `$table_name` and `$new_args`. Every customer update will throw a PHP fatal error. | -| 2 | `includes/Order.php` `delete()` | **Undefined `$id` variable** | Uses `$id` in the `$wpdb->delete()` where clause instead of the method parameter `$order_id`. Every order deletion call will fail. | -| 3 | `includes/Order.php` `formipay_bulk_delete_order()` | **Iterates wrong variable** | Loops `foreach($ids as $id)` but calls `$this->delete($order_id)` — `$order_id` comes from the outer scope (nonce check), not the loop variable. Bulk delete will repeatedly delete the same (or zero) orders. | -| 4 | `includes/Notification/Email.php` `send_email()` | **Wrong class reference — fatal error** | Calls `\Formipay_Notification::update_notification_data()` — this class does not exist. Should use `parent::update_notification_data()`. Email status tracking will crash. | -| 5 | `includes/Integration/Paypal.php` `auto_cancel_order_on_timeout()` | **Undefined `Order` class** | Calls `Order::update(...)` but unlike `BankTransfer.php`, `Paypal.php` does not import `use Formipay\Order as Order`. This will throw a class-not-found error on timeout. | -| 6 | `includes/Integration/Paypal.php` `process_payment()` | **Undefined `self::paypal_settings`** | The PayPal class never declares a `$paypal_settings` property. Accessing it leads to undefined property notices and broken payment flow. | - -### 1.2 Moderate Bugs - -| # | Location | Issue | -|---|----------|-------| -| 7 | `includes/Payment/BankTransfer.php` `check_unique_code()` | Uses `MAX(id)+1` for unique codes — predictable and subject to race conditions. Two concurrent orders can receive the same unique code. | -| 8 | `includes/Payment/BankTransfer.php` `add_unique_code_details()` | Calls `$this->check_unique_code()` **three times** per request (once for `'item'`, once for `'amount'`, once for `'subtotal'`). Each call queries the DB independently and may return different values. Displayed unique code may not match the stored one. | -| 9 | `admin/functions.php` `formipay_field_type_collection()` | Color field label says `'Number'` instead of `'Color'` — copy-paste error. | -| 10 | `includes/Render.php` field rendering | No `default` fallback rendered when field type doesn't match any case in the switch — unknown field types silently produce no output. | -| 11 | `includes/Order.php` `render_form_submit()` | `$field_value` is sometimes an array (from checkbox fields) but the code assumes string context. Nested `if(is_array($field_value))` only handles one level. | -| 12 | `includes/Thankyou.php` `check_parse_query()` vs `formipay_get_order()` | Old cookie-based URL (`base64_encode`) co-exists with new Token-based validation. `formipay_get_order()` generates the old-format URL for the `thankyou` link, but the new Token system expects a different format. Inconsistent access path. | - ---- - -## 2. Security Concerns - -| # | Severity | Location | Issue | -|---|----------|----------|-------| -| 1 | **High** | `includes/Order.php` `retrieve_form_data()` | Cookie `fp_access` uses `maybe_serialize()` — **PHP object injection** risk if an attacker can manipulate cookie values. Should use `json_encode()`/`json_decode()`. | -| 2 | **High** | `includes/Thankyou.php` `set_endpoint()` | Calls `flush_rewrite_rules()` on **every `init`** hook — extremely expensive and causes race conditions under concurrent load. Should only flush on activation/deactivation or settings save. | -| 3 | **High** | `includes/Payment/Payment.php` `set_endpoint()` | Same `flush_rewrite_rules()` issue — fires on every page load. | -| 4 | **Medium** | `includes/Order.php` `retrieve_form_data()` | Thank-you URL uses `base64_encode(form_id:::order_id:::session_id)` — base64 is not encryption. Sequential order IDs can be guessed. The `Token` class provides proper tokens but the old path remains active. | -| 5 | **Medium** | `includes/LicenseAPI.php` | All REST endpoints use `permission_callback => '__return_true'`. The `revoke` endpoint has a stub permission callback that always returns `true`. Anyone can revoke or manipulate licenses without authentication. | -| 6 | **Medium** | `includes/Integration/Paypal.php` `webhook_endpoint()` | No PayPal webhook signature verification. An attacker could forge webhook calls to mark orders as paid without actual payment. | -| 7 | **Medium** | `includes/Customer.php` `formipay_tabledata_customers()` | No nonce check (`check_ajax_referer`). Any authenticated user can dump all customer data via direct AJAX call. | -| 8 | **Low** | `includes/Render.php` | Inline `