adminforth 1.1.23 → 1.1.24
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/dist/index.js +12 -12
- package/dist/plugins/AccessControl/index.js +3 -56
- package/dist/plugins/AuditLog/index.js +13 -0
- package/dist/plugins/AuditLog/types.js +1 -0
- package/dist/plugins/plugins/ForeignInlineListPlugin/custom/InlineList.vue +248 -0
- package/dist/spa/index.html +2 -2
- package/dist/spa/package-lock.json +1 -189
- package/dist/spa/package.json +1 -6
- package/dist/spa/spa/src/components/ShowTableItem.vue +14 -0
- package/dist/spa/spa/src/views/HomeView.vue +8 -0
- package/dist/spa/src/App.vue +57 -76
- package/dist/spa/src/components/AcceptModal.vue +1 -1
- package/dist/spa/src/components/CustomDatePicker.vue +3 -3
- package/dist/spa/src/components/CustomDateRangePicker.vue +3 -3
- package/dist/spa/src/components/Dropdown.vue +4 -13
- package/dist/spa/src/components/Filters.vue +22 -55
- package/dist/spa/src/components/MenuLink.vue +2 -2
- package/dist/spa/src/components/ResourceForm.vue +99 -157
- package/dist/spa/src/components/ValueRenderer.vue +1 -11
- package/dist/spa/src/router/index.ts +2 -3
- package/dist/spa/src/stores/core.ts +33 -22
- package/dist/spa/src/utils.ts +3 -5
- package/dist/spa/src/views/CreateView.vue +7 -15
- package/dist/spa/src/views/EditView.vue +8 -36
- package/dist/spa/src/views/HomeView.vue +8 -0
- package/dist/spa/src/views/ListView.vue +23 -35
- package/dist/spa/src/views/LoginView.vue +1 -1
- package/dist/spa/src/views/ResourceParent.vue +1 -1
- package/dist/spa/src/views/ShowView.vue +9 -20
- package/dist/spa/tailwind.config.js +2 -5
- package/dist/types/AdminForthConfig.js +9 -0
- package/index.ts +16 -18
- package/package.json +1 -1
- package/plugins/AuditLog/index.ts +29 -0
- package/plugins/AuditLog/types.ts +4 -0
- package/types/AdminForthConfig.ts +23 -1
- package/dist/spa/src/components/CustomRangePicker.vue +0 -148
|
@@ -9,17 +9,12 @@
|
|
|
9
9
|
"version": "0.0.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@iconify-prerendered/vue-flowbite": "^0.23.1714023977",
|
|
12
|
-
"@unhead/vue": "^1.9.12",
|
|
13
|
-
"@vueuse/core": "^10.10.0",
|
|
14
12
|
"dayjs": "^1.11.11",
|
|
15
|
-
"debounce": "^2.1.0",
|
|
16
13
|
"flowbite": "^2.3.0",
|
|
17
14
|
"flowbite-datepicker": "^1.2.6",
|
|
18
15
|
"pinia": "^2.1.7",
|
|
19
|
-
"unhead": "^1.9.12",
|
|
20
16
|
"vue": "^3.4.21",
|
|
21
|
-
"vue-router": "^4.3.0"
|
|
22
|
-
"vue-slider-component": "^4.1.0-beta.7"
|
|
17
|
+
"vue-router": "^4.3.0"
|
|
23
18
|
},
|
|
24
19
|
"devDependencies": {
|
|
25
20
|
"@rushstack/eslint-patch": "^1.8.0",
|
|
@@ -955,11 +950,6 @@
|
|
|
955
950
|
"undici-types": "~5.26.4"
|
|
956
951
|
}
|
|
957
952
|
},
|
|
958
|
-
"node_modules/@types/web-bluetooth": {
|
|
959
|
-
"version": "0.0.20",
|
|
960
|
-
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
|
|
961
|
-
"integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
|
|
962
|
-
},
|
|
963
953
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
|
964
954
|
"version": "7.9.0",
|
|
965
955
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz",
|
|
@@ -1151,58 +1141,6 @@
|
|
|
1151
1141
|
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
|
|
1152
1142
|
"dev": true
|
|
1153
1143
|
},
|
|
1154
|
-
"node_modules/@unhead/dom": {
|
|
1155
|
-
"version": "1.9.12",
|
|
1156
|
-
"resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.9.12.tgz",
|
|
1157
|
-
"integrity": "sha512-3MY1TbZmEjGNZapi3wvJW0vWNS2CLKHt7/m57sScDHCNvNBe1mTwrIOhtZFDgAndhml2EVQ68RMa0Vhum/M+cw==",
|
|
1158
|
-
"dependencies": {
|
|
1159
|
-
"@unhead/schema": "1.9.12",
|
|
1160
|
-
"@unhead/shared": "1.9.12"
|
|
1161
|
-
},
|
|
1162
|
-
"funding": {
|
|
1163
|
-
"url": "https://github.com/sponsors/harlan-zw"
|
|
1164
|
-
}
|
|
1165
|
-
},
|
|
1166
|
-
"node_modules/@unhead/schema": {
|
|
1167
|
-
"version": "1.9.12",
|
|
1168
|
-
"resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.9.12.tgz",
|
|
1169
|
-
"integrity": "sha512-ue2FKyIZKsuZDpWJBMlBGwMm4s+vFeU3NUWsNt8Z+2JkOUIqO/VG43LxNgY1M595bOS71Gdxk+G9VtzfKJ5uEA==",
|
|
1170
|
-
"dependencies": {
|
|
1171
|
-
"hookable": "^5.5.3",
|
|
1172
|
-
"zhead": "^2.2.4"
|
|
1173
|
-
},
|
|
1174
|
-
"funding": {
|
|
1175
|
-
"url": "https://github.com/sponsors/harlan-zw"
|
|
1176
|
-
}
|
|
1177
|
-
},
|
|
1178
|
-
"node_modules/@unhead/shared": {
|
|
1179
|
-
"version": "1.9.12",
|
|
1180
|
-
"resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.9.12.tgz",
|
|
1181
|
-
"integrity": "sha512-72wlLXG3FP3sXUrwd42Uv8jYpHSg4R6IFJcsl+QisRjKM89JnjOFSw1DqWO4IOftW5xOxS4J5v7SQyJ4NJo7Bw==",
|
|
1182
|
-
"dependencies": {
|
|
1183
|
-
"@unhead/schema": "1.9.12"
|
|
1184
|
-
},
|
|
1185
|
-
"funding": {
|
|
1186
|
-
"url": "https://github.com/sponsors/harlan-zw"
|
|
1187
|
-
}
|
|
1188
|
-
},
|
|
1189
|
-
"node_modules/@unhead/vue": {
|
|
1190
|
-
"version": "1.9.12",
|
|
1191
|
-
"resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.9.12.tgz",
|
|
1192
|
-
"integrity": "sha512-keE4EuswgzCqVU7zmZprU+ToMvNWc3s8NoLreH5AtJd2u0FgBygD8sxRVyEnZw1KwFYOJ2C7yD2TChSKZioPGQ==",
|
|
1193
|
-
"dependencies": {
|
|
1194
|
-
"@unhead/schema": "1.9.12",
|
|
1195
|
-
"@unhead/shared": "1.9.12",
|
|
1196
|
-
"hookable": "^5.5.3",
|
|
1197
|
-
"unhead": "1.9.12"
|
|
1198
|
-
},
|
|
1199
|
-
"funding": {
|
|
1200
|
-
"url": "https://github.com/sponsors/harlan-zw"
|
|
1201
|
-
},
|
|
1202
|
-
"peerDependencies": {
|
|
1203
|
-
"vue": ">=2.7 || >=3"
|
|
1204
|
-
}
|
|
1205
|
-
},
|
|
1206
1144
|
"node_modules/@vitejs/plugin-vue": {
|
|
1207
1145
|
"version": "5.0.4",
|
|
1208
1146
|
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
|
|
@@ -1392,89 +1330,6 @@
|
|
|
1392
1330
|
"integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==",
|
|
1393
1331
|
"dev": true
|
|
1394
1332
|
},
|
|
1395
|
-
"node_modules/@vueuse/core": {
|
|
1396
|
-
"version": "10.10.0",
|
|
1397
|
-
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.10.0.tgz",
|
|
1398
|
-
"integrity": "sha512-vexJ/YXYs2S42B783rI95lMt3GzEwkxzC8Hb0Ndpd8rD+p+Lk/Za4bd797Ym7yq4jXqdSyj3JLChunF/vyYjUw==",
|
|
1399
|
-
"dependencies": {
|
|
1400
|
-
"@types/web-bluetooth": "^0.0.20",
|
|
1401
|
-
"@vueuse/metadata": "10.10.0",
|
|
1402
|
-
"@vueuse/shared": "10.10.0",
|
|
1403
|
-
"vue-demi": ">=0.14.7"
|
|
1404
|
-
},
|
|
1405
|
-
"funding": {
|
|
1406
|
-
"url": "https://github.com/sponsors/antfu"
|
|
1407
|
-
}
|
|
1408
|
-
},
|
|
1409
|
-
"node_modules/@vueuse/core/node_modules/vue-demi": {
|
|
1410
|
-
"version": "0.14.8",
|
|
1411
|
-
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
|
|
1412
|
-
"integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
|
|
1413
|
-
"hasInstallScript": true,
|
|
1414
|
-
"bin": {
|
|
1415
|
-
"vue-demi-fix": "bin/vue-demi-fix.js",
|
|
1416
|
-
"vue-demi-switch": "bin/vue-demi-switch.js"
|
|
1417
|
-
},
|
|
1418
|
-
"engines": {
|
|
1419
|
-
"node": ">=12"
|
|
1420
|
-
},
|
|
1421
|
-
"funding": {
|
|
1422
|
-
"url": "https://github.com/sponsors/antfu"
|
|
1423
|
-
},
|
|
1424
|
-
"peerDependencies": {
|
|
1425
|
-
"@vue/composition-api": "^1.0.0-rc.1",
|
|
1426
|
-
"vue": "^3.0.0-0 || ^2.6.0"
|
|
1427
|
-
},
|
|
1428
|
-
"peerDependenciesMeta": {
|
|
1429
|
-
"@vue/composition-api": {
|
|
1430
|
-
"optional": true
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
},
|
|
1434
|
-
"node_modules/@vueuse/metadata": {
|
|
1435
|
-
"version": "10.10.0",
|
|
1436
|
-
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.10.0.tgz",
|
|
1437
|
-
"integrity": "sha512-UNAo2sTCAW5ge6OErPEHb5z7NEAg3XcO9Cj7OK45aZXfLLH1QkexDcZD77HBi5zvEiLOm1An+p/4b5K3Worpug==",
|
|
1438
|
-
"funding": {
|
|
1439
|
-
"url": "https://github.com/sponsors/antfu"
|
|
1440
|
-
}
|
|
1441
|
-
},
|
|
1442
|
-
"node_modules/@vueuse/shared": {
|
|
1443
|
-
"version": "10.10.0",
|
|
1444
|
-
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.10.0.tgz",
|
|
1445
|
-
"integrity": "sha512-2aW33Ac0Uk0U+9yo3Ypg9s5KcR42cuehRWl7vnUHadQyFvCktseyxxEPBi1Eiq4D2yBGACOnqLZpx1eMc7g5Og==",
|
|
1446
|
-
"dependencies": {
|
|
1447
|
-
"vue-demi": ">=0.14.7"
|
|
1448
|
-
},
|
|
1449
|
-
"funding": {
|
|
1450
|
-
"url": "https://github.com/sponsors/antfu"
|
|
1451
|
-
}
|
|
1452
|
-
},
|
|
1453
|
-
"node_modules/@vueuse/shared/node_modules/vue-demi": {
|
|
1454
|
-
"version": "0.14.8",
|
|
1455
|
-
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
|
|
1456
|
-
"integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
|
|
1457
|
-
"hasInstallScript": true,
|
|
1458
|
-
"bin": {
|
|
1459
|
-
"vue-demi-fix": "bin/vue-demi-fix.js",
|
|
1460
|
-
"vue-demi-switch": "bin/vue-demi-switch.js"
|
|
1461
|
-
},
|
|
1462
|
-
"engines": {
|
|
1463
|
-
"node": ">=12"
|
|
1464
|
-
},
|
|
1465
|
-
"funding": {
|
|
1466
|
-
"url": "https://github.com/sponsors/antfu"
|
|
1467
|
-
},
|
|
1468
|
-
"peerDependencies": {
|
|
1469
|
-
"@vue/composition-api": "^1.0.0-rc.1",
|
|
1470
|
-
"vue": "^3.0.0-0 || ^2.6.0"
|
|
1471
|
-
},
|
|
1472
|
-
"peerDependenciesMeta": {
|
|
1473
|
-
"@vue/composition-api": {
|
|
1474
|
-
"optional": true
|
|
1475
|
-
}
|
|
1476
|
-
}
|
|
1477
|
-
},
|
|
1478
1333
|
"node_modules/acorn": {
|
|
1479
1334
|
"version": "8.11.3",
|
|
1480
1335
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
|
|
@@ -1861,17 +1716,6 @@
|
|
|
1861
1716
|
"integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
|
|
1862
1717
|
"dev": true
|
|
1863
1718
|
},
|
|
1864
|
-
"node_modules/debounce": {
|
|
1865
|
-
"version": "2.1.0",
|
|
1866
|
-
"resolved": "https://registry.npmjs.org/debounce/-/debounce-2.1.0.tgz",
|
|
1867
|
-
"integrity": "sha512-OkL3+0pPWCqoBc/nhO9u6TIQNTK44fnBnzuVtJAbp13Naxw9R6u21x+8tVTka87AhDZ3htqZ2pSSsZl9fqL2Wg==",
|
|
1868
|
-
"engines": {
|
|
1869
|
-
"node": ">=18"
|
|
1870
|
-
},
|
|
1871
|
-
"funding": {
|
|
1872
|
-
"url": "https://github.com/sponsors/sindresorhus"
|
|
1873
|
-
}
|
|
1874
|
-
},
|
|
1875
1719
|
"node_modules/debug": {
|
|
1876
1720
|
"version": "4.3.4",
|
|
1877
1721
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
|
@@ -2525,11 +2369,6 @@
|
|
|
2525
2369
|
"he": "bin/he"
|
|
2526
2370
|
}
|
|
2527
2371
|
},
|
|
2528
|
-
"node_modules/hookable": {
|
|
2529
|
-
"version": "5.5.3",
|
|
2530
|
-
"resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
|
|
2531
|
-
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="
|
|
2532
|
-
},
|
|
2533
2372
|
"node_modules/ignore": {
|
|
2534
2373
|
"version": "5.3.1",
|
|
2535
2374
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
|
|
@@ -3973,20 +3812,6 @@
|
|
|
3973
3812
|
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
|
|
3974
3813
|
"dev": true
|
|
3975
3814
|
},
|
|
3976
|
-
"node_modules/unhead": {
|
|
3977
|
-
"version": "1.9.12",
|
|
3978
|
-
"resolved": "https://registry.npmjs.org/unhead/-/unhead-1.9.12.tgz",
|
|
3979
|
-
"integrity": "sha512-s6VxcTV45hy8c/IioKQOonFnAO+kBOSpgDfqEHhnU0YVSQYaRPEp9pzW1qSPf0lx+bg9RKeOQyNNbSGGUP26aQ==",
|
|
3980
|
-
"dependencies": {
|
|
3981
|
-
"@unhead/dom": "1.9.12",
|
|
3982
|
-
"@unhead/schema": "1.9.12",
|
|
3983
|
-
"@unhead/shared": "1.9.12",
|
|
3984
|
-
"hookable": "^5.5.3"
|
|
3985
|
-
},
|
|
3986
|
-
"funding": {
|
|
3987
|
-
"url": "https://github.com/sponsors/harlan-zw"
|
|
3988
|
-
}
|
|
3989
|
-
},
|
|
3990
3815
|
"node_modules/update-browserslist-db": {
|
|
3991
3816
|
"version": "1.0.16",
|
|
3992
3817
|
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
|
|
@@ -4145,11 +3970,6 @@
|
|
|
4145
3970
|
"vue": "^3.2.0"
|
|
4146
3971
|
}
|
|
4147
3972
|
},
|
|
4148
|
-
"node_modules/vue-slider-component": {
|
|
4149
|
-
"version": "4.1.0-beta.7",
|
|
4150
|
-
"resolved": "https://registry.npmjs.org/vue-slider-component/-/vue-slider-component-4.1.0-beta.7.tgz",
|
|
4151
|
-
"integrity": "sha512-Qb7K920ZG7PoQswoF6Ias+i3W2rd3k4fpk04JUl82kEUcN86Yg6et7bVSKWt/7VpQe8a5IT3BqCKSCOZ7AJgCA=="
|
|
4152
|
-
},
|
|
4153
3973
|
"node_modules/vue-template-compiler": {
|
|
4154
3974
|
"version": "2.7.16",
|
|
4155
3975
|
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
|
|
@@ -4333,14 +4153,6 @@
|
|
|
4333
4153
|
"funding": {
|
|
4334
4154
|
"url": "https://github.com/sponsors/sindresorhus"
|
|
4335
4155
|
}
|
|
4336
|
-
},
|
|
4337
|
-
"node_modules/zhead": {
|
|
4338
|
-
"version": "2.2.4",
|
|
4339
|
-
"resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz",
|
|
4340
|
-
"integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==",
|
|
4341
|
-
"funding": {
|
|
4342
|
-
"url": "https://github.com/sponsors/harlan-zw"
|
|
4343
|
-
}
|
|
4344
4156
|
}
|
|
4345
4157
|
}
|
|
4346
4158
|
}
|
package/dist/spa/package.json
CHANGED
|
@@ -13,17 +13,12 @@
|
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@iconify-prerendered/vue-flowbite": "^0.23.1714023977",
|
|
16
|
-
"@unhead/vue": "^1.9.12",
|
|
17
|
-
"@vueuse/core": "^10.10.0",
|
|
18
16
|
"dayjs": "^1.11.11",
|
|
19
|
-
"debounce": "^2.1.0",
|
|
20
17
|
"flowbite": "^2.3.0",
|
|
21
18
|
"flowbite-datepicker": "^1.2.6",
|
|
22
19
|
"pinia": "^2.1.7",
|
|
23
|
-
"unhead": "^1.9.12",
|
|
24
20
|
"vue": "^3.4.21",
|
|
25
|
-
"vue-router": "^4.3.0"
|
|
26
|
-
"vue-slider-component": "^4.1.0-beta.7"
|
|
21
|
+
"vue-router": "^4.3.0"
|
|
27
22
|
},
|
|
28
23
|
"devDependencies": {
|
|
29
24
|
"@rushstack/eslint-patch": "^1.8.0",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<td class="px-6 py-4 whitespace-nowrap">
|
|
3
|
+
{{ column.label }}
|
|
4
|
+
</td>
|
|
5
|
+
<td class="px-6 py-4 whitespace-nowrap whitespace-pre-wrap">
|
|
6
|
+
<ValueRenderer :column="column" :row="row" />
|
|
7
|
+
</td>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script setup>
|
|
11
|
+
import ValueRenderer from '@/components/ValueRenderer.vue';
|
|
12
|
+
|
|
13
|
+
defineProps(['column', 'row']);
|
|
14
|
+
</script>
|
package/dist/spa/src/App.vue
CHANGED
|
@@ -1,84 +1,88 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<nav
|
|
3
3
|
v-if="loggedIn"
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
class="fixed h-14 top-0 z-50 w-full bg-white border-b border-gray-200 dark:bg-gray-800 dark:border-gray-700">
|
|
5
6
|
<div class="px-3 py-3 lg:px-5 lg:pl-3">
|
|
6
7
|
<div class="flex items-center justify-between">
|
|
7
8
|
<div class="flex items-center justify-start rtl:justify-end">
|
|
8
|
-
<button data-drawer-target="logo-sidebar" data-drawer-toggle="logo-sidebar" aria-controls="logo-sidebar" type="button" class="inline-flex items-center p-2 text-sm
|
|
9
|
+
<button data-drawer-target="logo-sidebar" data-drawer-toggle="logo-sidebar" aria-controls="logo-sidebar" type="button" class="inline-flex items-center p-2 text-sm text-gray-500 rounded-lg sm:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600">
|
|
9
10
|
<span class="sr-only">Open sidebar</span>
|
|
10
11
|
<svg class="w-6 h-6" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
|
11
12
|
<path clip-rule="evenodd" fill-rule="evenodd" d="M2 4.75A.75.75 0 012.75 4h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 4.75zm0 10.5a.75.75 0 01.75-.75h7.5a.75.75 0 010 1.5h-7.5a.75.75 0 01-.75-.75zM2 10a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 10z"></path>
|
|
12
13
|
</svg>
|
|
13
14
|
</button>
|
|
14
|
-
|
|
15
|
+
<div class="flex ms-2 md:me-24">
|
|
16
|
+
<img src="https://flowbite.com/docs/images/logo.svg" class="h-8 me-3" alt="FlowBite Logo" />
|
|
17
|
+
<span class="self-center text-xl font-semibold sm:text-2xl whitespace-nowrap dark:text-white">
|
|
18
|
+
{{ coreStore.config?.brandName }}
|
|
19
|
+
</span>
|
|
20
|
+
</div>
|
|
15
21
|
</div>
|
|
16
22
|
<div class="flex items-center">
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
<
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
<p class="text-sm text-gray-900 dark:text-header-text" role="none" v-if="coreStore.userFullname">
|
|
29
|
-
{{ coreStore.userFullname }}
|
|
30
|
-
</p>
|
|
31
|
-
<p class="text-sm font-medium text-gray-900 truncate dark:text-nav-menu-text" role="none">
|
|
32
|
-
{{ coreStore.username }}
|
|
33
|
-
</p>
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
<div class="flex items-center ms-3">
|
|
26
|
+
<div>
|
|
27
|
+
<button type="button" class="flex text-sm bg-gray-100 rounded-full focus:ring-4 focus:ring-gray-300 dark:focus:ring-gray-600 dark:bg-gray-700" aria-expanded="false" data-dropdown-toggle="dropdown-user">
|
|
28
|
+
<span class="sr-only">Open user menu</span>
|
|
29
|
+
<svg class="w-8 h-8 text-gray-400 dark:text-white" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
|
|
30
|
+
<path fill-rule="evenodd" d="M12 20a7.966 7.966 0 0 1-5.002-1.756l.002.001v-.683c0-1.794 1.492-3.25 3.333-3.25h3.334c1.84 0 3.333 1.456 3.333 3.25v.683A7.966 7.966 0 0 1 12 20ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10c0 5.5-4.44 9.963-9.932 10h-.138C6.438 21.962 2 17.5 2 12Zm10-5c-1.84 0-3.333 1.455-3.333 3.25S10.159 13.5 12 13.5c1.84 0 3.333-1.455 3.333-3.25S13.841 7 12 7Z" clip-rule="evenodd"/>
|
|
31
|
+
</svg>
|
|
32
|
+
|
|
33
|
+
</button>
|
|
34
34
|
</div>
|
|
35
|
-
<
|
|
36
|
-
<
|
|
37
|
-
<
|
|
38
|
-
{{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
</
|
|
43
|
-
</
|
|
44
|
-
<
|
|
45
|
-
<
|
|
35
|
+
<div class="z-50 hidden my-4 text-base list-none bg-white divide-y divide-gray-100 rounded shadow dark:bg-gray-700 dark:divide-gray-600 dark:shadow-xl" id="dropdown-user">
|
|
36
|
+
<div class="px-4 py-3" role="none">
|
|
37
|
+
<p class="text-sm text-gray-900 dark:text-white" role="none" v-if="coreStore.userFullname">
|
|
38
|
+
{{ coreStore.userFullname }}
|
|
39
|
+
</p>
|
|
40
|
+
<p class="text-sm font-medium text-gray-900 truncate dark:text-gray-300" role="none">
|
|
41
|
+
{{ coreStore.username }}
|
|
42
|
+
</p>
|
|
43
|
+
</div>
|
|
44
|
+
<ul class="py-1" role="none">
|
|
45
|
+
<li>
|
|
46
|
+
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white" role="menuitem">Dashboard</a>
|
|
47
|
+
</li>
|
|
48
|
+
<li >
|
|
49
|
+
<span @click="toggleTheme" class=" cursor-pointer flex items-center gap-1 block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white" role="menuitem">
|
|
50
|
+
{{ theme === 'dark' ? 'Light' : 'Dark' }}
|
|
51
|
+
<IconMoonSolid class="w-5 h-5 text-blue-300
|
|
52
|
+
" v-if="theme !== 'dark'"/>
|
|
53
|
+
<IconSunSolid class="w-5 h-5 text-yellow-300
|
|
54
|
+
" v-else/>
|
|
55
|
+
mode
|
|
56
|
+
</span>
|
|
57
|
+
</li>
|
|
58
|
+
|
|
59
|
+
<li>
|
|
60
|
+
<button @click="logout" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white" role="menuitem">Sign out</button>
|
|
46
61
|
</li>
|
|
47
|
-
|
|
62
|
+
</ul>
|
|
63
|
+
</div>
|
|
48
64
|
</div>
|
|
49
65
|
</div>
|
|
50
|
-
</div>
|
|
51
66
|
</div>
|
|
52
67
|
</div>
|
|
53
|
-
</nav>
|
|
54
|
-
|
|
55
|
-
|
|
68
|
+
</nav>
|
|
56
69
|
|
|
57
70
|
<aside
|
|
58
71
|
v-if="loggedIn"
|
|
59
72
|
|
|
60
|
-
id="logo-sidebar" class="fixed
|
|
61
|
-
<div class="h-full px-3 pb-4 overflow-y-auto bg-
|
|
62
|
-
<div class="flex ms-2 md:me-24 m-4 ">
|
|
63
|
-
<img src="https://flowbite.com/docs/images/logo.svg" class="h-8 me-3" alt="FlowBite Logo" />
|
|
64
|
-
<span class="self-center text-header-text-size font-semibold sm:text-header-text-size whitespace-nowrap dark:text-header-text text-header-logo-color">
|
|
65
|
-
{{ coreStore.config?.brandName }}
|
|
66
|
-
</span>
|
|
67
|
-
</div>
|
|
73
|
+
id="logo-sidebar" class="fixed top-0 left-0 z-10 w-64 h-screen pt-20 transition-transform -translate-x-full bg-white border-r border-gray-200 sm:translate-x-0 dark:bg-gray-800 dark:border-gray-700" aria-label="Sidebar">
|
|
74
|
+
<div class="h-full px-3 pb-4 overflow-y-auto bg-white dark:bg-gray-800">
|
|
68
75
|
<ul class="space-y-2 font-medium">
|
|
69
76
|
<template v-for="(item, i) in coreStore.menu" :key="`menu-${i}`">
|
|
70
|
-
<div v-if="item.type === 'divider'" class="border-t border-
|
|
77
|
+
<div v-if="item.type === 'divider'" class="border-t border-gray-200 dark:border-gray-700"></div>
|
|
71
78
|
<div v-else-if="item.type === 'gap'" class="flex items-center justify-center h-8"></div>
|
|
72
|
-
<div v-else-if="item.type === 'heading'" class="flex items-center justify-left pl-2 h-8 text-gray-400 dark:text-gray-400
|
|
73
|
-
">{{ item.label }}</div>
|
|
74
|
-
|
|
75
79
|
|
|
76
80
|
<li v-else-if="item.children">
|
|
77
|
-
<button type="button" class="flex items-center w-full p-2 text-base text-
|
|
81
|
+
<button type="button" class="flex items-center w-full p-2 text-base text-gray-900 transition duration-75 rounded-lg group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700"
|
|
78
82
|
:aria-controls="`dropdown-example${i}`"
|
|
79
83
|
:data-collapse-toggle="`dropdown-example${i}`"
|
|
80
84
|
>
|
|
81
|
-
<component v-if="item.icon" :is="getIcon(item.icon)" class="w-5 h-5 text-gray-500 transition duration-75 dark:text-gray-400
|
|
85
|
+
<component v-if="item.icon" :is="getIcon(item.icon)" class="w-5 h-5 text-gray-500 transition duration-75 dark:text-gray-400 group-hover:text-gray-900 dark:group-hover:text-white" ></component>
|
|
82
86
|
|
|
83
87
|
<span class="flex-1 ms-3 text-left rtl:text-right whitespace-nowrap">{{ item.label }}</span>
|
|
84
88
|
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 10 6">
|
|
@@ -86,7 +90,7 @@
|
|
|
86
90
|
</svg>
|
|
87
91
|
</button>
|
|
88
92
|
|
|
89
|
-
<ul :id="`dropdown-example${i}`" role="none" class="
|
|
93
|
+
<ul :id="`dropdown-example${i}`" role="none" class="py-2 space-y-2" :class="{ 'hidden': !item.open }">
|
|
90
94
|
<template v-for="(child, j) in item.children" :key="`menu-${i}-${j}`">
|
|
91
95
|
<li>
|
|
92
96
|
<MenuLink :item="child" isChild="true" />
|
|
@@ -108,7 +112,7 @@
|
|
|
108
112
|
</div>
|
|
109
113
|
</div>
|
|
110
114
|
|
|
111
|
-
<div v-else
|
|
115
|
+
<div v-else>
|
|
112
116
|
<RouterView/>
|
|
113
117
|
</div>
|
|
114
118
|
<AcceptModal />
|
|
@@ -128,23 +132,10 @@ import AcceptModal from './components/AcceptModal.vue';
|
|
|
128
132
|
import MenuLink from './components/MenuLink.vue';
|
|
129
133
|
import { useRoute, useRouter } from 'vue-router';
|
|
130
134
|
import { getIcon } from '@/utils';
|
|
131
|
-
import { useHead } from 'unhead'
|
|
132
|
-
import { createHead } from 'unhead'
|
|
133
|
-
// import { link } from 'fs';
|
|
134
|
-
const coreStore = useCoreStore();
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
createHead()
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
135
|
|
|
143
136
|
|
|
144
137
|
const route = useRoute();
|
|
145
138
|
const router = useRouter();
|
|
146
|
-
const title = ref('');
|
|
147
|
-
|
|
148
139
|
|
|
149
140
|
const routerIsReady = ref(false);
|
|
150
141
|
|
|
@@ -162,6 +153,7 @@ async function logout() {
|
|
|
162
153
|
router.push({ name: 'login' });
|
|
163
154
|
}
|
|
164
155
|
|
|
156
|
+
const coreStore = useCoreStore();
|
|
165
157
|
|
|
166
158
|
|
|
167
159
|
|
|
@@ -175,17 +167,6 @@ onMounted(async () => {
|
|
|
175
167
|
initRouter();
|
|
176
168
|
initFlowbite();
|
|
177
169
|
await coreStore.fetchMenuAndResource();
|
|
178
|
-
title.value = coreStore.config.title || 'Admin Forth';
|
|
179
|
-
useHead({
|
|
180
|
-
title: title.value,
|
|
181
|
-
link: [
|
|
182
|
-
{
|
|
183
|
-
rel: 'icon',
|
|
184
|
-
href: coreStore.config.favicon || '/favicon.ico',
|
|
185
|
-
},
|
|
186
|
-
],
|
|
187
|
-
|
|
188
|
-
})
|
|
189
170
|
})
|
|
190
171
|
|
|
191
172
|
</script>
|
|
@@ -16,7 +16,7 @@ const modalStore = useModalStore();
|
|
|
16
16
|
<Teleport to="body">
|
|
17
17
|
<div v-if="modalStore.isOpened" class="bg-gray-900/50 dark:bg-gray-900/80 overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-full">
|
|
18
18
|
<div class="relative p-4 w-full max-w-md max-h-full top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 " >
|
|
19
|
-
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700
|
|
19
|
+
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
|
|
20
20
|
<button type="button"@click="modalStore.togleModal" class="absolute top-3 end-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" >
|
|
21
21
|
<svg class="w-3 h-3" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
|
|
22
22
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<label for="start-time" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">{{ label }}</label>
|
|
6
6
|
|
|
7
7
|
<div class="relative">
|
|
8
|
-
<div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5
|
|
8
|
+
<div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5">
|
|
9
9
|
<IconCalendar class="w-4 h-4 text-gray-500 dark:text-gray-400"/>
|
|
10
10
|
</div>
|
|
11
11
|
|
|
@@ -97,7 +97,7 @@ const start = computed(() => {
|
|
|
97
97
|
})
|
|
98
98
|
|
|
99
99
|
function updateFromProps() {
|
|
100
|
-
if (
|
|
100
|
+
if (props.valueStart === undefined) {
|
|
101
101
|
datepickerStartEl.value.value = '';
|
|
102
102
|
startTime.value = '';
|
|
103
103
|
}
|
|
@@ -157,5 +157,5 @@ onMounted(() => {
|
|
|
157
157
|
|
|
158
158
|
onBeforeUnmount(() => {
|
|
159
159
|
removeChangeDateListener();
|
|
160
|
-
})
|
|
160
|
+
})
|
|
161
161
|
</script>
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<div class="mx-auto grid grid-cols-2 gap-4 mb-2" :class="{hidden: !showTimeInputs}">
|
|
27
27
|
<div>
|
|
28
28
|
<div class="relative">
|
|
29
|
-
<div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5
|
|
29
|
+
<div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5">
|
|
30
30
|
<IconTime class="w-4 h-4 text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-700"/>
|
|
31
31
|
</div>
|
|
32
32
|
|
|
@@ -132,11 +132,11 @@ const end = computed(() => {
|
|
|
132
132
|
})
|
|
133
133
|
|
|
134
134
|
function updateFromProps() {
|
|
135
|
-
if (
|
|
135
|
+
if (props.valueStart === undefined) {
|
|
136
136
|
datepickerStartEl.value.value = '';
|
|
137
137
|
startTime.value = '';
|
|
138
138
|
}
|
|
139
|
-
if (
|
|
139
|
+
if (props.valueEnd === undefined) {
|
|
140
140
|
datepickerEndEl.value.value = '';
|
|
141
141
|
endTime.value = '';
|
|
142
142
|
}
|
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
:placeholder="selectedItems.length ? '' : 'Select...'"
|
|
10
10
|
/>
|
|
11
11
|
<div class="absolute inset-y-0 left-2 flex items-center pr-2 flex-wrap">
|
|
12
|
-
|
|
13
|
-
<div v-for="item in selectedItems" :key="item?.name" class="bg-blue-100 text-blue-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-blue-900 dark:text-blue-300">
|
|
12
|
+
<div v-for="item in selectedItems" :key="item.name" class="bg-blue-100 text-blue-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-blue-900 dark:text-blue-300">
|
|
14
13
|
<span>{{ item.label }}</span>
|
|
15
14
|
<button
|
|
16
15
|
type="button"
|
|
@@ -35,7 +34,7 @@
|
|
|
35
34
|
<IconCaretUpSolid v-else class="h-5 w-5 text-gray-400" />
|
|
36
35
|
</div>
|
|
37
36
|
</div>
|
|
38
|
-
<div v-if="showDropdown" class="absolute z-10 mt-1 w-full bg-white shadow-lg
|
|
37
|
+
<div v-if="showDropdown" class="absolute z-10 mt-1 w-full bg-white shadow-lg rounded-md py-1 text-base ring-1 ring-black ring-opacity-5 overflow-auto focus:outline-none sm:text-sm">
|
|
39
38
|
<div
|
|
40
39
|
v-for="item in filteredItems"
|
|
41
40
|
:key="item.value"
|
|
@@ -77,14 +76,10 @@ const showDropdown = ref(false);
|
|
|
77
76
|
const selectedItems = ref([]);
|
|
78
77
|
|
|
79
78
|
function updateFromProps() {
|
|
79
|
+
console.log('⚡ updateFromProps', props.modelValue)
|
|
80
80
|
if (props.modelValue !== undefined) {
|
|
81
81
|
if (props.single) {
|
|
82
|
-
|
|
83
|
-
if (el) {
|
|
84
|
-
selectedItems.value = [el];
|
|
85
|
-
} else {
|
|
86
|
-
selectedItems.value = [];
|
|
87
|
-
}
|
|
82
|
+
selectedItems.value = [props.options.find(item => item.value === props.modelValue)];
|
|
88
83
|
} else {
|
|
89
84
|
selectedItems.value = props.options.filter(item => props.modelValue.includes(item.value));
|
|
90
85
|
}
|
|
@@ -98,10 +93,6 @@ onMounted(() => {
|
|
|
98
93
|
updateFromProps();
|
|
99
94
|
});
|
|
100
95
|
|
|
101
|
-
watch(() => props.options, () => {
|
|
102
|
-
updateFromProps();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
96
|
addClickListener();
|
|
106
97
|
|
|
107
98
|
});
|