adminforth 1.5.8-next.0 → 1.5.8-next.2

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.
Files changed (59) hide show
  1. package/commands/utils.js +17 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/modules/codeInjector.d.ts.map +1 -1
  6. package/dist/modules/codeInjector.js +4 -1
  7. package/dist/modules/codeInjector.js.map +1 -1
  8. package/dist/modules/configValidator.d.ts.map +1 -1
  9. package/dist/modules/configValidator.js +50 -28
  10. package/dist/modules/configValidator.js.map +1 -1
  11. package/dist/spa/package-lock.json +96 -0
  12. package/dist/spa/package.json +3 -1
  13. package/dist/spa/src/App.vue +4 -4
  14. package/dist/spa/src/afcl/Dropzone.vue +1 -1
  15. package/dist/spa/src/afcl/Select.vue +2 -2
  16. package/dist/spa/src/components/AcceptModal.vue +1 -1
  17. package/dist/spa/src/components/Breadcrumbs.vue +1 -1
  18. package/dist/spa/src/components/BreadcrumbsWithButtons.vue +1 -1
  19. package/dist/spa/src/components/Filters.vue +3 -3
  20. package/dist/spa/src/components/GroupsTable.vue +3 -3
  21. package/dist/spa/src/components/HelloWorld.vue +1 -1
  22. package/dist/spa/src/components/ResourceListTable.vue +14 -14
  23. package/dist/spa/src/components/ShowTable.vue +2 -2
  24. package/dist/spa/src/components/SingleSkeletLoader.vue +1 -1
  25. package/dist/spa/src/components/Toast.vue +4 -4
  26. package/dist/spa/src/components/ValueRenderer.vue +2 -2
  27. package/dist/spa/src/router/index.ts +4 -1
  28. package/dist/spa/src/types/Back.ts +12 -10
  29. package/dist/spa/src/types/Common.ts +4 -0
  30. package/dist/spa/src/utils.ts +4 -3
  31. package/dist/spa/src/views/CreateView.vue +2 -2
  32. package/dist/spa/src/views/EditView.vue +2 -2
  33. package/dist/spa/src/views/ListView.vue +3 -3
  34. package/dist/spa/src/views/LoginView.vue +1 -1
  35. package/dist/spa/src/views/PageNotFound.vue +3 -3
  36. package/dist/spa/src/views/ShowView.vue +5 -5
  37. package/dist/types/Back.d.ts +11 -10
  38. package/dist/types/Back.d.ts.map +1 -1
  39. package/dist/types/Back.js.map +1 -1
  40. package/dist/types/Common.d.ts +8 -0
  41. package/dist/types/Common.d.ts.map +1 -1
  42. package/dist/types/Common.js.map +1 -1
  43. package/package.json +4 -2
  44. package/dist/adapters/completion-adapter-open-ai-chat-gpt/index.d.ts +0 -11
  45. package/dist/adapters/completion-adapter-open-ai-chat-gpt/index.d.ts.map +0 -1
  46. package/dist/adapters/completion-adapter-open-ai-chat-gpt/index.js +0 -36
  47. package/dist/adapters/completion-adapter-open-ai-chat-gpt/index.js.map +0 -1
  48. package/dist/adapters/completion-adapter-open-ai-chat-gpt/types.d.ts +0 -23
  49. package/dist/adapters/completion-adapter-open-ai-chat-gpt/types.d.ts.map +0 -1
  50. package/dist/adapters/completion-adapter-open-ai-chat-gpt/types.js +0 -2
  51. package/dist/adapters/completion-adapter-open-ai-chat-gpt/types.js.map +0 -1
  52. package/dist/adapters/email-adapter-aws-ses/index.d.ts +0 -11
  53. package/dist/adapters/email-adapter-aws-ses/index.d.ts.map +0 -1
  54. package/dist/adapters/email-adapter-aws-ses/index.js +0 -64
  55. package/dist/adapters/email-adapter-aws-ses/index.js.map +0 -1
  56. package/dist/adapters/email-adapter-aws-ses/types.d.ts +0 -14
  57. package/dist/adapters/email-adapter-aws-ses/types.d.ts.map +0 -1
  58. package/dist/adapters/email-adapter-aws-ses/types.js +0 -2
  59. package/dist/adapters/email-adapter-aws-ses/types.js.map +0 -1
@@ -45,6 +45,7 @@
45
45
  "tailwindcss": "^3.4.3",
46
46
  "typescript": "~5.4.0",
47
47
  "vite": "^5.2.13",
48
+ "vue-i18n-extract": "^2.0.7",
48
49
  "vue-tsc": "^2.0.11",
49
50
  "vue3-json-viewer": "^2.2.2"
50
51
  }
@@ -1799,6 +1800,16 @@
1799
1800
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1800
1801
  }
1801
1802
  },
1803
+ "node_modules/cac": {
1804
+ "version": "6.7.14",
1805
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
1806
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
1807
+ "dev": true,
1808
+ "license": "MIT",
1809
+ "engines": {
1810
+ "node": ">=8"
1811
+ }
1812
+ },
1802
1813
  "node_modules/callsites": {
1803
1814
  "version": "3.1.0",
1804
1815
  "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2132,6 +2143,30 @@
2132
2143
  "url": "https://github.com/fb55/domutils?sponsor=1"
2133
2144
  }
2134
2145
  },
2146
+ "node_modules/dot-object": {
2147
+ "version": "2.1.5",
2148
+ "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.5.tgz",
2149
+ "integrity": "sha512-xHF8EP4XH/Ba9fvAF2LDd5O3IITVolerVV6xvkxoM8zlGEiCUrggpAnHyOoKJKCrhvPcGATFAUwIujj7bRG5UA==",
2150
+ "dev": true,
2151
+ "license": "MIT",
2152
+ "dependencies": {
2153
+ "commander": "^6.1.0",
2154
+ "glob": "^7.1.6"
2155
+ },
2156
+ "bin": {
2157
+ "dot-object": "bin/dot-object"
2158
+ }
2159
+ },
2160
+ "node_modules/dot-object/node_modules/commander": {
2161
+ "version": "6.2.1",
2162
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
2163
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
2164
+ "dev": true,
2165
+ "license": "MIT",
2166
+ "engines": {
2167
+ "node": ">= 6"
2168
+ }
2169
+ },
2135
2170
  "node_modules/eastasianwidth": {
2136
2171
  "version": "0.2.0",
2137
2172
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -2923,6 +2958,16 @@
2923
2958
  "node": ">=0.10.0"
2924
2959
  }
2925
2960
  },
2961
+ "node_modules/is-valid-glob": {
2962
+ "version": "1.0.0",
2963
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
2964
+ "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==",
2965
+ "dev": true,
2966
+ "license": "MIT",
2967
+ "engines": {
2968
+ "node": ">=0.10.0"
2969
+ }
2970
+ },
2926
2971
  "node_modules/isexe": {
2927
2972
  "version": "2.0.0",
2928
2973
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -4625,6 +4670,57 @@
4625
4670
  "vue": "^3.0.0"
4626
4671
  }
4627
4672
  },
4673
+ "node_modules/vue-i18n-extract": {
4674
+ "version": "2.0.7",
4675
+ "resolved": "https://registry.npmjs.org/vue-i18n-extract/-/vue-i18n-extract-2.0.7.tgz",
4676
+ "integrity": "sha512-i1NW5R58S720iQ1BEk+6ILo3hT6UA8mtYNNolSH4rt9345qvXdvA6GHy2+jHozdDAKHwlu9VvS/+vIMKs1UYQw==",
4677
+ "dev": true,
4678
+ "license": "MIT",
4679
+ "dependencies": {
4680
+ "cac": "^6.7.12",
4681
+ "dot-object": "^2.1.4",
4682
+ "glob": "^8.0.1",
4683
+ "is-valid-glob": "^1.0.0",
4684
+ "js-yaml": "^4.1.0"
4685
+ },
4686
+ "bin": {
4687
+ "vue-i18n-extract": "bin/vue-i18n-extract.js"
4688
+ }
4689
+ },
4690
+ "node_modules/vue-i18n-extract/node_modules/glob": {
4691
+ "version": "8.1.0",
4692
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
4693
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
4694
+ "deprecated": "Glob versions prior to v9 are no longer supported",
4695
+ "dev": true,
4696
+ "license": "ISC",
4697
+ "dependencies": {
4698
+ "fs.realpath": "^1.0.0",
4699
+ "inflight": "^1.0.4",
4700
+ "inherits": "2",
4701
+ "minimatch": "^5.0.1",
4702
+ "once": "^1.3.0"
4703
+ },
4704
+ "engines": {
4705
+ "node": ">=12"
4706
+ },
4707
+ "funding": {
4708
+ "url": "https://github.com/sponsors/isaacs"
4709
+ }
4710
+ },
4711
+ "node_modules/vue-i18n-extract/node_modules/minimatch": {
4712
+ "version": "5.1.6",
4713
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
4714
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
4715
+ "dev": true,
4716
+ "license": "ISC",
4717
+ "dependencies": {
4718
+ "brace-expansion": "^2.0.1"
4719
+ },
4720
+ "engines": {
4721
+ "node": ">=10"
4722
+ }
4723
+ },
4628
4724
  "node_modules/vue-router": {
4629
4725
  "version": "4.3.2",
4630
4726
  "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz",
@@ -9,7 +9,8 @@
9
9
  "preview": "vite preview",
10
10
  "build-only": "vite build",
11
11
  "type-check": "vue-tsc --build --force",
12
- "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
12
+ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
13
+ "i18n:extract": "echo '{}' > i18n-empty.json && vue-i18n-extract report --vueFiles './src/**/*.?(js|vue)' --output ./i18n-messages.json --languageFiles 'i18n-empty.json' --add"
13
14
  },
14
15
  "dependencies": {
15
16
  "@iconify-prerendered/vue-flowbite": "^0.23.1714023977",
@@ -49,6 +50,7 @@
49
50
  "tailwindcss": "^3.4.3",
50
51
  "typescript": "~5.4.0",
51
52
  "vite": "^5.2.13",
53
+ "vue-i18n-extract": "^2.0.7",
52
54
  "vue-tsc": "^2.0.11",
53
55
  "vue3-json-viewer": "^2.2.2"
54
56
  }
@@ -8,7 +8,7 @@
8
8
  <div class="flex items-center justify-start rtl:justify-end">
9
9
  <button @click="sideBarOpen = !sideBarOpen"
10
10
  type="button" class="inline-flex items-center p-2 text-sm rounded-lg sm:hidden hover:bg-lightSidebarItemHover focus:outline-none focus:ring-2 focus:ring-lightSidebarDevider dark:text-darkSidebarIcons dark:hover:bg-darkSidebarHover dark:focus:ring-lightSidebarDevider">
11
- <span class="sr-only">Open sidebar</span>
11
+ <span class="sr-only">{{ $t('Open sidebar') }}</span>
12
12
  <svg class="w-6 h-6" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
13
13
  <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>
14
14
  </svg>
@@ -33,7 +33,7 @@
33
33
  <button
34
34
  ref="dropdownUserButton"
35
35
  type="button" class="flex text-sm bg- rounded-full focus:ring-4 focus:ring-lightSidebarDevider dark:focus:ring-darkSidebarDevider dark:bg-" aria-expanded="false" data-dropdown-toggle="dropdown-user">
36
- <span class="sr-only">Open user menu</span>
36
+ <span class="sr-only">{{ $t('Open user menu') }}</span>
37
37
  <svg class="w-8 h-8 text-lightNavbarIcons dark:text-darkNavbarIcons" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
38
38
  <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"/>
39
39
  </svg>
@@ -59,7 +59,7 @@
59
59
  />
60
60
  </li>
61
61
  <li>
62
- <button @click="logout" class="cursor-pointer flex items-center gap-1 block px-4 py-2 text-sm text-black hover:bg-html dark:text-darkSidebarTextHover dark:hover:bg-darkSidebarItemHover dark:hover:text-darkSidebarTextActive w-full" role="menuitem">Sign out</button>
62
+ <button @click="logout" class="cursor-pointer flex items-center gap-1 block px-4 py-2 text-sm text-black hover:bg-html dark:text-darkSidebarTextHover dark:hover:bg-darkSidebarItemHover dark:hover:text-darkSidebarTextActive w-full" role="menuitem">{{ $t('Sign out') }}</button>
63
63
  </li>
64
64
  </ul>
65
65
  </div>
@@ -179,7 +179,7 @@
179
179
  <div v-else class="flex items-center justify-center h-screen">
180
180
  <div class="text-3xl text-gray-400 animate-bounce">
181
181
  <svg aria-hidden="true" class="w-8 h-8 text-gray-200 animate-spin dark:text-gray-600 fill-blue-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"/><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"/></svg>
182
- <span class="sr-only">Loading...</span>
182
+ <span class="sr-only">{{ $t('Loading...') }}</span>
183
183
  </div>
184
184
  </div>
185
185
  <AcceptModal />
@@ -29,7 +29,7 @@
29
29
 
30
30
  </div>
31
31
 
32
- <p v-if="!selectedFiles.length" class="mb-2 text-sm text-gray-500 dark:text-gray-400"><span class="font-semibold">Click to upload</span> or drag and drop</p>
32
+ <p v-if="!selectedFiles.length" class="mb-2 text-sm text-gray-500 dark:text-gray-400"><span class="font-semibold">{{ $t('Click to upload') }}</span> {{ $t('or drag and drop') }}</p>
33
33
  <p class="text-xs text-gray-500 dark:text-gray-400">
34
34
  {{ props.extensions.join(', ').toUpperCase().replace(/\./g, '') }}
35
35
  <template v-if="props.maxSizeBytes">
@@ -44,7 +44,7 @@
44
44
  <label v-if="!$slots.item" :for="item.value">{{ item.label }}</label>
45
45
  </div>
46
46
  <div v-if="!filteredItems.length" class="px-4 py-2 cursor-pointer text-gray-400 dark:text-gray-300">
47
- No results found
47
+ {{ $t('No results found') }}
48
48
  </div>
49
49
 
50
50
  <div v-if="$slots['extra-item']" class="px-4 py-2 dark:text-gray-400">
@@ -66,7 +66,7 @@
66
66
  @click="toogleItem(item)"
67
67
  class="z-index-100 flex-shrink-0 ml-1 h-4 w-4 -mr-1 rounded-full inline-flex items-center justify-center text-gray-400 hover:text-gray-500 focus:outline-none focus:text-gray-500 focus:bg-gray-100"
68
68
  >
69
- <span class="sr-only">Remove item</span>
69
+ <span class="sr-only">{{ $t('Remove item') }}</span>
70
70
  <svg class="h-2 w-2" stroke="currentColor" fill="none" viewBox="0 0 8 8">
71
71
  <path
72
72
  stroke-linecap="round"
@@ -13,7 +13,7 @@ const modalStore = useModalStore();
13
13
  <svg class="w-3 h-3" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
14
14
  <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"/>
15
15
  </svg>
16
- <span class="sr-only">Close modal</span>
16
+ <span class="sr-only">{{ $t('Close modal') }}</span>
17
17
  </button>
18
18
  <div class="p-4 md:p-5 text-center">
19
19
  <svg class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
@@ -6,7 +6,7 @@
6
6
  <svg class="w-3 h-3 me-2.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20">
7
7
  <path d="m19.707 9.293-2-2-7-7a1 1 0 0 0-1.414 0l-7 7-2 2a1 1 0 0 0 1.414 1.414L2 10.414V18a2 2 0 0 0 2 2h3a1 1 0 0 0 1-1v-4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v4a1 1 0 0 0 1 1h3a2 2 0 0 0 2-2v-7.586l.293.293a1 1 0 0 0 1.414-1.414Z"/>
8
8
  </svg>
9
- Home
9
+ {{ $t('Home') }}
10
10
  </RouterLink>
11
11
  </li>
12
12
  <li>
@@ -8,7 +8,7 @@
8
8
  </div>
9
9
  <div class="flex items-center justify-between mb-3 flex-wrap gap-y-2 gap-2" v-if="coreStore.resourceColumnsError">
10
10
  <div class="p-4 mb-4 text-sm text-red-800 rounded-lg bg-red-50 dark:bg-gray-800 dark:text-red-400" role="alert">
11
- <span class="font-medium">Error!</span> {{ coreStore.resourceColumnsError }}
11
+ <span class="font-medium">{{ $t('Error!')}}</span> {{ coreStore.resourceColumnsError }}
12
12
  </div>
13
13
  </div>
14
14
  </div>
@@ -9,11 +9,11 @@
9
9
  :style="{ height: `calc(100vh ` }"
10
10
  >
11
11
  <h5 id="drawer-navigation-label" class="text-base font-semibold text-gray-500 uppercase dark:text-gray-400">
12
- Filters
12
+ {{ $t('Filters') }}
13
13
 
14
14
  <button type="button" @click="$emit('hide')" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 absolute end-2.5 inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" >
15
15
  <svg aria-hidden="true" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path></svg>
16
- <span class="sr-only">Close menu</span>
16
+ <span class="sr-only">{{ $t('Close menu') }}</span>
17
17
  </button>
18
18
  </h5>
19
19
 
@@ -109,7 +109,7 @@
109
109
  :disabled="!filtersStore.filters.length"
110
110
  type="button"
111
111
  class="flex items-center py-1 px-3 text-sm font-medium text-gray-900 focus:outline-none bg-white rounded border border-gray-300 hover:bg-gray-100 hover:text-lightPrimary focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed"
112
- @click="clear">Clear all</button>
112
+ @click="clear">{{ $t('Clear all') }}</button>
113
113
 
114
114
  </div>
115
115
  </div>
@@ -7,10 +7,10 @@
7
7
  <thead class="text-xs text-gray-700 uppercase dark:text-gray-400 bg-lightFormHeading dark:bg-gray-700 block md:table-row-group ">
8
8
  <tr>
9
9
  <th scope="col" :class="{'rounded-tl-lg': !group.groupName}" class="px-6 py-3 hidden md:w-52 md:table-cell">
10
- Field
10
+ {{ $t('Field') }}
11
11
  </th>
12
12
  <th scope="col" :class="{'rounded-tr-lg': !group.groupName}" class="px-6 py-3 hidden md:table-cell">
13
- Value
13
+ {{ $t('Value') }}
14
14
  </th>
15
15
  </tr>
16
16
  </thead>
@@ -33,7 +33,7 @@
33
33
  />
34
34
 
35
35
  <template #tooltip>
36
- Required field
36
+ {{ $t('Required field') }}
37
37
  </template>
38
38
  </Tooltip>
39
39
  </span>
@@ -8,7 +8,7 @@ defineProps<{
8
8
  <div class="greetings">
9
9
  <h1 class="green">{{ msg }}</h1>
10
10
  <h3>
11
- You’ve successfully created a project with
11
+ {{ $t('You’ve successfully created a project with') }}
12
12
  </h3>
13
13
  </div>
14
14
  </template>
@@ -22,7 +22,7 @@
22
22
  <input id="checkbox-all-search" type="checkbox" :checked="allFromThisPageChecked" @change="selectAll()"
23
23
  class="w-4 h-4 cursor-pointer text-blue-600 bg-gray-100 border-gray-300 rounded
24
24
  focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 dark:focus:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600">
25
- <label for="checkbox-all-search" class="sr-only">checkbox</label>
25
+ <label for="checkbox-all-search" class="sr-only">{{ $t('checkbox') }}</label>
26
26
  </div>
27
27
  </td>
28
28
 
@@ -56,7 +56,7 @@
56
56
  </td>
57
57
 
58
58
  <td scope="col" class="px-6 py-3">
59
- Actions
59
+ {{ $t('Actions') }}
60
60
  </td>
61
61
  </tr>
62
62
  <!-- table header end -->
@@ -72,7 +72,7 @@
72
72
  class=" mx-auto my-5 flex items-center w-full max-w-xs p-4 space-x-4 rtl:space-x-reverse text-gray-500 divide-x rtl:divide-x-reverse divide-gray-200 dark:text-gray-400 dark:divide-gray-700 space-x dark:bg-gray-800"
73
73
  role="alert">
74
74
  <IconInboxOutline class="w-6 h-6 text-gray-500 dark:text-gray-400"/>
75
- <div class="ps-4 text-sm font-normal">No items here yet</div>
75
+ <div class="ps-4 text-sm font-normal">{{ $t('No items here yet') }}</div>
76
76
  </div>
77
77
 
78
78
  </td>
@@ -93,7 +93,7 @@
93
93
  :checked="checkboxesInternal.includes(row._primaryKeyValue)"
94
94
  @change="(e)=>{addToCheckedValues(row._primaryKeyValue)}"
95
95
  class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 dark:focus:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600 cursor-pointer">
96
- <label for="checkbox-table-search-1" class="sr-only">checkbox</label>
96
+ <label for="checkbox-table-search-1" class="sr-only">{{ $t('checkbox') }}</label>
97
97
  </div>
98
98
  </td>
99
99
  <td v-for="c in columnsListed" class="px-2 md:px-3 lg:px-6 py-4">
@@ -125,7 +125,7 @@
125
125
  </RouterLink>
126
126
 
127
127
  <template v-slot:tooltip>
128
- Show item
128
+ {{ $t('Show item') }}
129
129
  </template>
130
130
  </Tooltip>
131
131
 
@@ -143,7 +143,7 @@
143
143
  <IconPenSolid class="w-5 h-5 me-2"/>
144
144
  </RouterLink>
145
145
  <template v-slot:tooltip>
146
- Edit item
146
+ {{ $t('Edit item') }}
147
147
  </template>
148
148
  </Tooltip>
149
149
 
@@ -156,7 +156,7 @@
156
156
  </button>
157
157
 
158
158
  <template v-slot:tooltip>
159
- Delete item
159
+ {{ $t('Delete item') }}
160
160
  </template>
161
161
  </Tooltip>
162
162
 
@@ -194,7 +194,7 @@
194
194
  d="M13 5H1m0 0 4 4M1 5l4-4"/>
195
195
  </svg>
196
196
  <span class="hidden sm:inline">
197
- Prev
197
+ {{ $t('Prev') }}
198
198
  </span>
199
199
  </button>
200
200
  <button
@@ -221,7 +221,7 @@
221
221
  <button
222
222
  class="flex items-center py-1 px-3 gap-1 text-sm font-medium text-gray-900 focus:outline-none bg-white border-l-0 rounded-e border border-gray-300 hover:bg-gray-100 hover:text-lightPrimary focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700 disabled:opacity-50"
223
223
  @click="page++" :disabled="page >= totalPages">
224
- <span class="hidden sm:inline">Next</span>
224
+ <span class="hidden sm:inline">{{ $t('Next') }}</span>
225
225
  <svg class="w-3.5 h-3.5 rtl:rotate-180" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
226
226
  viewBox="0 0 14 10">
227
227
  <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
@@ -232,14 +232,14 @@
232
232
 
233
233
  <!-- Help text -->
234
234
  <span class="text-sm text-gray-700 dark:text-gray-400">
235
- <span v-if="((page || 1) - 1) * pageSize + 1 > totalRows">Wrong Page </span>
236
- <span v-else>Showing </span>
235
+ <span v-if="((page || 1) - 1) * pageSize + 1 > totalRows">{{ $t('Wrong Page') }} </span>
236
+ <span v-else>{{ $t('Showing') }} </span>
237
237
  <span class="font-semibold text-gray-900 dark:text-white">
238
238
  {{ ((page || 1) - 1) * pageSize + 1 }}
239
- </span> to <span class="font-semibold text-gray-900 dark:text-white">
239
+ </span> {{ $t('to') }} <span class="font-semibold text-gray-900 dark:text-white">
240
240
  {{ Math.min((page || 1) * pageSize, totalRows) }}
241
- </span> of <span class="font-semibold text-gray-900 dark:text-white">{{
242
- totalRows }}</span> <span class="hidden sm:inline">Entries</span>
241
+ </span> {{ $t('of') }} <span class="font-semibold text-gray-900 dark:text-white">{{
242
+ totalRows }}</span> <span class="hidden sm:inline">{{ $t('Entries') }}</span>
243
243
  </span>
244
244
  </div>
245
245
  </template>
@@ -7,10 +7,10 @@
7
7
  <thead class="text-gray-700 dark:text-gray-400 bg-lightFormHeading dark:bg-gray-700 block md:table-row-group">
8
8
  <tr>
9
9
  <th scope="col" class="px-6 py-3 text-xs uppercase hidden md:w-52 md:table-cell">
10
- Field
10
+ {{ $t('Field') }}
11
11
  </th>
12
12
  <th scope="col" class="px-6 py-3 text-xs uppercase hidden md:table-cell">
13
- Value
13
+ {{ $t('Value') }}
14
14
  </th>
15
15
  </tr>
16
16
  </thead>
@@ -8,6 +8,6 @@
8
8
  <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[330px] mb-2.5"></div>
9
9
  <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[300px] mb-2.5"></div>
10
10
  <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
11
- <span class="sr-only">Loading...</span>
11
+ <span class="sr-only">{{ $t('Loading...') }}</span>
12
12
  </div>
13
13
  </template>
@@ -13,25 +13,25 @@
13
13
  <svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 20">
14
14
  <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.147 15.085a7.159 7.159 0 0 1-6.189 3.307A6.713 6.713 0 0 1 3.1 15.444c-2.679-4.513.287-8.737.888-9.548A4.373 4.373 0 0 0 5 1.608c1.287.953 6.445 3.218 5.537 10.5 1.5-1.122 2.706-3.01 2.853-6.14 1.433 1.049 3.993 5.395 1.757 9.117Z"/>
15
15
  </svg>
16
- <span class="sr-only">Fire icon</span>
16
+ <span class="sr-only">{{ $t('Fire icon') }}</span>
17
17
  </div>
18
18
  <div v-else-if="toast.variant == 'danger'" class="inline-flex items-center justify-center flex-shrink-0 w-8 h-8 text-red-500 bg-red-100 rounded-lg dark:bg-red-800 dark:text-red-200">
19
19
  <svg class="w-5 h-5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20">
20
20
  <path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5Zm3.707 11.793a1 1 0 1 1-1.414 1.414L10 11.414l-2.293 2.293a1 1 0 0 1-1.414-1.414L8.586 10 6.293 7.707a1 1 0 0 1 1.414-1.414L10 8.586l2.293-2.293a1 1 0 0 1 1.414 1.414L11.414 10l2.293 2.293Z"/>
21
21
  </svg>
22
- <span class="sr-only">Error icon</span>
22
+ <span class="sr-only">{{ $t('Error icon') }}</span>
23
23
  </div>
24
24
  <div v-else-if="toast.variant == 'warning'"class="inline-flex items-center justify-center flex-shrink-0 w-8 h-8 text-orange-500 bg-orange-100 rounded-lg dark:bg-orange-700 dark:text-orange-200">
25
25
  <svg class="w-5 h-5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20">
26
26
  <path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5ZM10 15a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-4a1 1 0 0 1-2 0V6a1 1 0 0 1 2 0v5Z"/>
27
27
  </svg>
28
- <span class="sr-only">Warning icon</span>
28
+ <span class="sr-only">{{ $t('Warning icon') }}</span>
29
29
  </div>
30
30
  <div v-else class="inline-flex items-center justify-center flex-shrink-0 w-8 h-8 text-green-500 bg-green-100 rounded-lg dark:bg-green-800 dark:text-green-200">
31
31
  <svg class="w-5 h-5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20">
32
32
  <path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5Zm3.707 8.207-4 4a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L9 10.586l3.293-3.293a1 1 0 0 1 1.414 1.414Z"/>
33
33
  </svg>
34
- <span class="sr-only">Check icon</span>
34
+ <span class="sr-only">{{ $t('Check icon') }}</span>
35
35
  </div>
36
36
 
37
37
  <div class="ms-3 text-sm font-normal max-w-xs pr-2" v-if="toast.messageHtml" v-html="toast.messageHtml"></div>
@@ -11,8 +11,8 @@
11
11
  </span>
12
12
 
13
13
  <span v-else-if="column.type === 'boolean'">
14
- <span v-if="record[column.name]" class="bg-green-100 text-green-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-gray-700 dark:text-green-400 border border-green-400">Yes</span>
15
- <span v-else class="bg-red-100 text-red-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-gray-700 dark:text-red-400 border border-red-400">No</span>
14
+ <span v-if="record[column.name]" class="bg-green-100 text-green-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-gray-700 dark:text-green-400 border border-green-400">{{ $t('Yes') }}</span>
15
+ <span v-else class="bg-red-100 text-red-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-gray-700 dark:text-red-400 border border-red-400">{{ $t('No') }}</span>
16
16
  </span>
17
17
  <span v-else-if="column.enum">
18
18
  {{ checkEmptyValues(column.enum.find(e => e.value === record[column.name])?.label || record[column.name], route.meta.type) }}
@@ -11,7 +11,10 @@ const router = createRouter({
11
11
  path: '/login',
12
12
  name: 'login',
13
13
  component: () => import('@/views/LoginView.vue'),
14
- meta: { title: 'login', customLayout: true },
14
+ meta: {
15
+ title: 'Login',
16
+ customLayout: true
17
+ },
15
18
  beforeEnter: async (to, from, next) => {
16
19
  if(localStorage.getItem('isAuthorized') === 'true'){
17
20
  next({name: 'home'})
@@ -20,6 +20,8 @@ export interface ICodeInjector {
20
20
  devServerPort: number;
21
21
 
22
22
  getServeDir(): string;
23
+
24
+ spaTmpPath(): string;
23
25
  }
24
26
 
25
27
  export interface IConfigValidator {
@@ -1103,7 +1105,7 @@ export interface AdminForthResource extends Omit<AdminForthResourceInput, 'optio
1103
1105
  * Typical use-cases:
1104
1106
  * - request additional data from database before returning to frontend for soft-join
1105
1107
  */
1106
- beforeDatasourceRequest?: BeforeDataSourceRequestFunction | Array<BeforeDataSourceRequestFunction>,
1108
+ beforeDatasourceRequest?: Array<BeforeDataSourceRequestFunction>,
1107
1109
 
1108
1110
  /**
1109
1111
  * Typical use-cases:
@@ -1111,7 +1113,7 @@ export interface AdminForthResource extends Omit<AdminForthResourceInput, 'optio
1111
1113
  * - If some-why you can't use `backendOnly` you can cleanup sensitive fields here
1112
1114
  * - Attach additional data to record before returning to frontend
1113
1115
  */
1114
- afterDatasourceResponse?: AfterDataSourceResponseFunction | Array<AfterDataSourceResponseFunction>,
1116
+ afterDatasourceResponse?: Array<AfterDataSourceResponseFunction>,
1115
1117
  },
1116
1118
  list?: {
1117
1119
  /**
@@ -1119,14 +1121,14 @@ export interface AdminForthResource extends Omit<AdminForthResourceInput, 'optio
1119
1121
  * - add additional filters in addition to what user selected before fetching data from database.
1120
1122
  * - same as hooks.show.beforeDatasourceRequest
1121
1123
  */
1122
- beforeDatasourceRequest?: BeforeDataSourceRequestFunction | Array<BeforeDataSourceRequestFunction>,
1124
+ beforeDatasourceRequest?: Array<BeforeDataSourceRequestFunction>,
1123
1125
 
1124
1126
  /**
1125
1127
  * Typical use-cases:
1126
1128
  * - Same as hooks.show.afterDatasourceResponse but applied for all records returned from database for
1127
1129
  * showing in list view, e.g. add new field to each record in list view
1128
1130
  */
1129
- afterDatasourceResponse?: AfterDataSourceResponseFunction | Array<AfterDataSourceResponseFunction>,
1131
+ afterDatasourceResponse?: Array<AfterDataSourceResponseFunction>,
1130
1132
  },
1131
1133
  create?: {
1132
1134
  /**
@@ -1135,38 +1137,38 @@ export interface AdminForthResource extends Omit<AdminForthResourceInput, 'optio
1135
1137
  * - fill-in adminUser as creator of record
1136
1138
  * - Attach additional data to record before saving to database (mostly fillOnCreate should be used instead)
1137
1139
  */
1138
- beforeSave?: BeforeSaveFunction | Array<BeforeSaveFunction>,
1140
+ beforeSave?: Array<BeforeSaveFunction>,
1139
1141
 
1140
1142
  /**
1141
1143
  * Typical use-cases:
1142
1144
  * - Initiate some trigger after record saved to database (e.g sync to another datasource)
1143
1145
  */
1144
- afterSave?: AfterSaveFunction | Array<AfterSaveFunction>,
1146
+ afterSave?: Array<AfterSaveFunction>,
1145
1147
  },
1146
1148
  edit?: {
1147
1149
  /**
1148
1150
  * Typical use-cases:
1149
1151
  * - Same as hooks.create.beforeSave but for edit page
1150
1152
  */
1151
- beforeSave?: BeforeSaveFunction | Array<BeforeSaveFunction>,
1153
+ beforeSave?: Array<BeforeSaveFunction>,
1152
1154
 
1153
1155
  /**
1154
1156
  * Typical use-cases:
1155
1157
  * - Same as hooks.create.afterSave but for edit page
1156
1158
  */
1157
- afterSave?: AfterSaveFunction | Array<AfterSaveFunction>,
1159
+ afterSave?: Array<AfterSaveFunction>,
1158
1160
  },
1159
1161
  delete?: {
1160
1162
  /**
1161
1163
  * Typical use-cases:
1162
1164
  * - Validate that record can be deleted and interrupt execution if validation failed (`allowedActions.delete` should be preferred in most cases)
1163
1165
  */
1164
- beforeSave?: BeforeSaveFunction | Array<BeforeSaveFunction>,
1166
+ beforeSave?: Array<BeforeSaveFunction>,
1165
1167
  /**
1166
1168
  * Typical use-cases:
1167
1169
  * - Initiate some trigger after record deleted from database (e.g sync to another datasource)
1168
1170
  */
1169
- afterSave?: BeforeSaveFunction | Array<BeforeSaveFunction>,
1171
+ afterSave?: Array<BeforeSaveFunction>,
1170
1172
  },
1171
1173
  },
1172
1174
 
@@ -723,6 +723,10 @@ export interface AdminForthResourceColumnCommon extends AdminForthResourceColumn
723
723
  */
724
724
  _underlineType?: string,
725
725
 
726
+ required?: { create?: boolean, edit?: boolean },
727
+
728
+ editingNote?: { create?: string, edit?: string },
729
+
726
730
  }
727
731
 
728
732
  export enum AdminForthMenuTypes {
@@ -30,11 +30,12 @@ export async function callApi({path, method, body=undefined}: {
30
30
  return await r.json();
31
31
  }
32
32
 
33
- export async function callAdminForthApi({ path, method, body=undefined }: {
33
+ export async function callAdminForthApi({ path, method, body=undefined, headers=undefined }: {
34
34
  path: string,
35
35
  method: 'GET' | 'POST' | 'PUT' | 'DELETE',
36
- body?: any
37
- }) {
36
+ body?: any,
37
+ headers?: Record<string, string>
38
+ }): Promise<any> {
38
39
  try {
39
40
  return callApi({path: `/adminapi/v1${path}`, method, body} );
40
41
  } catch (e) {
@@ -15,7 +15,7 @@
15
15
  <button @click="$router.back()"
16
16
  class="flex items-center py-1 px-3 me-2 text-sm font-medium rounded-default text-gray-900 focus:outline-none bg-white rounded border border-gray-300 hover:bg-gray-100 hover:text-lightPrimary focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700"
17
17
  >
18
- Cancel
18
+ {{ $t('Cancel') }}
19
19
  </button>
20
20
 
21
21
  <button
@@ -27,7 +27,7 @@
27
27
  aria-hidden="true" class="w-4 h-4 mr-1 text-gray-200 animate-spin dark:text-gray-600 fill-red-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"/><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"/></svg>
28
28
 
29
29
  <IconFloppyDiskSolid v-else class="w-4 h-4 mr-1" />
30
- Save
30
+ {{ $t('Save') }}
31
31
  </button>
32
32
 
33
33
  <ThreeDotsMenu