adminforth 2.4.0-next.9 → 2.4.0-next.91

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 (129) hide show
  1. package/commands/callTsProxy.js +14 -4
  2. package/commands/cli.js +12 -4
  3. package/commands/createApp/templates/custom/tsconfig.json.hbs +2 -3
  4. package/commands/createApp/templates/index.ts.hbs +8 -1
  5. package/commands/createApp/templates/package.json.hbs +1 -1
  6. package/commands/createApp/utils.js +27 -2
  7. package/commands/createCustomComponent/configLoader.js +3 -0
  8. package/commands/createCustomComponent/configUpdater.js +25 -21
  9. package/commands/createCustomComponent/fileGenerator.js +1 -1
  10. package/commands/createCustomComponent/main.js +2 -1
  11. package/commands/createCustomComponent/templates/login/beforeLogin.vue.hbs +18 -0
  12. package/dist/dataConnectors/baseConnector.d.ts.map +1 -1
  13. package/dist/dataConnectors/baseConnector.js +16 -3
  14. package/dist/dataConnectors/baseConnector.js.map +1 -1
  15. package/dist/dataConnectors/mongo.d.ts.map +1 -1
  16. package/dist/dataConnectors/mongo.js +14 -14
  17. package/dist/dataConnectors/mongo.js.map +1 -1
  18. package/dist/index.d.ts +2 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +20 -9
  21. package/dist/index.js.map +1 -1
  22. package/dist/modules/codeInjector.d.ts.map +1 -1
  23. package/dist/modules/codeInjector.js +25 -9
  24. package/dist/modules/codeInjector.js.map +1 -1
  25. package/dist/modules/configValidator.d.ts.map +1 -1
  26. package/dist/modules/configValidator.js +50 -2
  27. package/dist/modules/configValidator.js.map +1 -1
  28. package/dist/modules/restApi.d.ts.map +1 -1
  29. package/dist/modules/restApi.js +144 -25
  30. package/dist/modules/restApi.js.map +1 -1
  31. package/dist/modules/styles.d.ts +450 -13
  32. package/dist/modules/styles.d.ts.map +1 -1
  33. package/dist/modules/styles.js +506 -31
  34. package/dist/modules/styles.js.map +1 -1
  35. package/dist/modules/utils.d.ts +1 -0
  36. package/dist/modules/utils.d.ts.map +1 -1
  37. package/dist/modules/utils.js +9 -0
  38. package/dist/modules/utils.js.map +1 -1
  39. package/dist/spa/index.html +1 -1
  40. package/dist/spa/src/App.vue +22 -12
  41. package/dist/spa/src/afcl/Button.vue +6 -6
  42. package/dist/spa/src/afcl/Checkbox.vue +21 -13
  43. package/dist/spa/src/afcl/CountryFlag.vue +4 -1
  44. package/dist/spa/src/{components/CustomDatePicker.vue → afcl/DatePicker.vue} +95 -9
  45. package/dist/spa/src/afcl/Dialog.vue +6 -6
  46. package/dist/spa/src/afcl/Dropzone.vue +13 -11
  47. package/dist/spa/src/afcl/Input.vue +8 -6
  48. package/dist/spa/src/afcl/JsonViewer.vue +25 -0
  49. package/dist/spa/src/afcl/Link.vue +1 -1
  50. package/dist/spa/src/afcl/LinkButton.vue +1 -1
  51. package/dist/spa/src/afcl/ProgressBar.vue +7 -7
  52. package/dist/spa/src/afcl/Select.vue +52 -23
  53. package/dist/spa/src/afcl/Skeleton.vue +6 -6
  54. package/dist/spa/src/afcl/Table.vue +13 -13
  55. package/dist/spa/src/afcl/Toggle.vue +32 -0
  56. package/dist/spa/src/afcl/Tooltip.vue +2 -2
  57. package/dist/spa/src/afcl/VerticalTabs.vue +3 -3
  58. package/dist/spa/src/afcl/index.ts +3 -2
  59. package/dist/spa/src/components/AcceptModal.vue +6 -6
  60. package/dist/spa/src/components/Breadcrumbs.vue +5 -5
  61. package/dist/spa/src/components/ColumnValueInput.vue +28 -9
  62. package/dist/spa/src/components/ColumnValueInputWrapper.vue +2 -1
  63. package/dist/spa/src/components/CustomDateRangePicker.vue +9 -8
  64. package/dist/spa/src/components/CustomRangePicker.vue +32 -3
  65. package/dist/spa/src/components/Filters.vue +76 -31
  66. package/dist/spa/src/components/GroupsTable.vue +7 -7
  67. package/dist/spa/src/components/ResourceForm.vue +61 -26
  68. package/dist/spa/src/components/ResourceListTable.vue +38 -40
  69. package/dist/spa/src/components/ResourceListTableVirtual.vue +31 -33
  70. package/dist/spa/src/components/ShowTable.vue +14 -9
  71. package/dist/spa/src/components/SingleSkeletLoader.vue +6 -6
  72. package/dist/spa/src/components/SkeleteLoader.vue +1 -1
  73. package/dist/spa/src/components/ThreeDotsMenu.vue +5 -5
  74. package/dist/spa/src/components/Toast.vue +2 -7
  75. package/dist/spa/src/components/ValueRenderer.vue +4 -4
  76. package/dist/spa/src/controls/BoolToggle.vue +34 -0
  77. package/dist/spa/src/spa_types/core.ts +7 -0
  78. package/dist/spa/src/stores/core.ts +1 -1
  79. package/dist/spa/src/types/Back.ts +79 -16
  80. package/dist/spa/src/types/Common.ts +13 -7
  81. package/dist/spa/src/types/adapters/CompletionAdapter.ts +25 -0
  82. package/dist/spa/src/types/adapters/EmailAdapter.ts +29 -0
  83. package/dist/spa/src/types/adapters/ImageGenerationAdapter.ts +50 -0
  84. package/dist/spa/src/types/adapters/OAuth2Adapter.ts +34 -0
  85. package/dist/spa/src/types/adapters/StorageAdapter.ts +73 -0
  86. package/dist/spa/src/types/adapters/index.ts +5 -0
  87. package/dist/spa/src/utils.ts +209 -0
  88. package/dist/spa/src/views/CreateView.vue +4 -4
  89. package/dist/spa/src/views/EditView.vue +3 -3
  90. package/dist/spa/src/views/ListView.vue +13 -18
  91. package/dist/spa/src/views/LoginView.vue +57 -45
  92. package/dist/spa/src/views/ResourceParent.vue +1 -1
  93. package/dist/spa/src/views/ShowView.vue +3 -3
  94. package/dist/types/Back.d.ts +62 -13
  95. package/dist/types/Back.d.ts.map +1 -1
  96. package/dist/types/Back.js.map +1 -1
  97. package/dist/types/Common.d.ts +12 -6
  98. package/dist/types/Common.d.ts.map +1 -1
  99. package/dist/types/Common.js.map +1 -1
  100. package/dist/types/adapters/CompletionAdapter.d.ts +20 -0
  101. package/dist/types/adapters/CompletionAdapter.d.ts.map +1 -0
  102. package/dist/types/adapters/CompletionAdapter.js +2 -0
  103. package/dist/types/adapters/CompletionAdapter.js.map +1 -0
  104. package/dist/types/adapters/EmailAdapter.d.ts +21 -0
  105. package/dist/types/adapters/EmailAdapter.d.ts.map +1 -0
  106. package/dist/types/adapters/EmailAdapter.js +2 -0
  107. package/dist/types/adapters/EmailAdapter.js.map +1 -0
  108. package/dist/types/adapters/ImageGenerationAdapter.d.ts +37 -0
  109. package/dist/types/adapters/ImageGenerationAdapter.d.ts.map +1 -0
  110. package/dist/types/adapters/ImageGenerationAdapter.js +2 -0
  111. package/dist/types/adapters/ImageGenerationAdapter.js.map +1 -0
  112. package/dist/types/adapters/OAuth2Adapter.d.ts +32 -0
  113. package/dist/types/adapters/OAuth2Adapter.d.ts.map +1 -0
  114. package/dist/types/adapters/OAuth2Adapter.js +2 -0
  115. package/dist/types/adapters/OAuth2Adapter.js.map +1 -0
  116. package/dist/types/adapters/StorageAdapter.d.ts +63 -0
  117. package/dist/types/adapters/StorageAdapter.d.ts.map +1 -0
  118. package/dist/types/adapters/StorageAdapter.js +2 -0
  119. package/dist/types/adapters/StorageAdapter.js.map +1 -0
  120. package/dist/types/adapters/index.d.ts +6 -0
  121. package/dist/types/adapters/index.d.ts.map +1 -0
  122. package/dist/types/adapters/index.js +2 -0
  123. package/dist/types/adapters/index.js.map +1 -0
  124. package/package.json +2 -2
  125. package/dist/spa/src/types/Adapters.ts +0 -213
  126. package/dist/types/Adapters.d.ts +0 -168
  127. package/dist/types/Adapters.d.ts.map +0 -1
  128. package/dist/types/Adapters.js +0 -2
  129. package/dist/types/Adapters.js.map +0 -1
@@ -6,24 +6,23 @@
6
6
  <!-- skelet loader -->
7
7
  <div role="status" v-if="!resource || !resource.columns"
8
8
  class="max-w p-4 space-y-4 divide-y divide-gray-200 rounded shadow animate-pulse dark:divide-gray-700 md:p-6 dark:border-gray-700">
9
-
10
9
  <div role="status" class="max-w-sm animate-pulse">
11
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
10
+ <div class="h-2 bg-lightListSkeletLoader rounded-full dark:bg-darkListSkeletLoader max-w-[360px]"></div>
12
11
  </div>
13
12
  </div>
14
- <table v-else class=" w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400 rounded-default">
13
+ <table v-else class=" w-full text-sm text-left rtl:text-right text-lightListTableText dark:text-darkListTableText rounded-default">
15
14
 
16
15
  <tbody>
17
16
  <!-- table header -->
18
- <tr class="t-header sticky z-10 top-0 text-xs bg-lightListTableHeading dark:bg-darkListTableHeading dark:text-gray-400">
17
+ <tr class="t-header sticky z-10 top-0 text-xs text-lightListTableHeadingText bg-lightListTableHeading dark:bg-darkListTableHeading dark:text-darkListTableHeadingText">
19
18
  <td scope="col" class="p-4">
20
- <div class="flex items-center">
21
- <input id="checkbox-all-search" type="checkbox" :checked="allFromThisPageChecked" @change="selectAll()"
22
- :disabled="!rows || !rows.length"
23
- class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded
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">{{ $t('checkbox') }}</label>
26
- </div>
19
+ <Checkbox
20
+ :modelValue="allFromThisPageChecked"
21
+ :disabled="!rows || !rows.length"
22
+ @update:modelValue="selectAll"
23
+ >
24
+ <span class="sr-only">{{ $t('checkbox') }}</span>
25
+ </Checkbox>
27
26
  </td>
28
27
 
29
28
  <td v-for="c in columnsListed" ref="headerRefs" scope="col" class="px-2 md:px-3 lg:px-6 py-3">
@@ -91,18 +90,16 @@
91
90
 
92
91
  :class="{'border-b': rowI !== rows.length - 1, 'cursor-pointer': row._clickUrl !== null}"
93
92
  >
94
- <td class="w-4 p-4 cursor-default" @click="(e)=>{e.stopPropagation()}">
95
- <div class="flex items center ">
96
- <input
97
- @click="(e)=>{e.stopPropagation()}"
98
- id="checkbox-table-search-1"
99
- type="checkbox"
100
- :checked="checkboxesInternal.includes(row._primaryKeyValue)"
101
- @change="(e)=>{addToCheckedValues(row._primaryKeyValue)}"
102
- 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">
103
- <label for="checkbox-table-search-1" class="sr-only">{{ $t('checkbox') }}</label>
104
- </div>
105
- </td>
93
+ <td class="w-4 p-4 cursor-default" @click="(e)=>e.stopPropagation()">
94
+ <Checkbox
95
+ :model-value="checkboxesInternal.includes(row._primaryKeyValue)"
96
+ @change="(e)=>{addToCheckedValues(row._primaryKeyValue)}"
97
+ @click="(e)=>e.stopPropagation()"
98
+ >
99
+ <span class="sr-only">{{ $t('checkbox') }}</span>
100
+ </Checkbox>
101
+ </td>
102
+
106
103
  <td v-for="c in columnsListed" class="px-2 md:px-3 lg:px-6 py-4">
107
104
  <!-- if c.name in listComponentsPerColumn, render it. If not, render ValueRenderer -->
108
105
  <component
@@ -128,7 +125,7 @@
128
125
  }"
129
126
 
130
127
  >
131
- <IconEyeSolid class="w-5 h-5 me-2"/>
128
+ <IconEyeSolid class="af-show-icon w-5 h-5 me-2"/>
132
129
  </RouterLink>
133
130
 
134
131
  <template v-slot:tooltip>
@@ -147,7 +144,7 @@
147
144
  }
148
145
  }"
149
146
  >
150
- <IconPenSolid class="w-5 h-5 me-2"/>
147
+ <IconPenSolid class="af-edit-icon w-5 h-5 me-2"/>
151
148
  </RouterLink>
152
149
  <template v-slot:tooltip>
153
150
  {{ $t('Edit item') }}
@@ -159,7 +156,7 @@
159
156
  v-if="resource.options?.allowedActions.delete"
160
157
  @click="deleteRecord(row)"
161
158
  >
162
- <IconTrashBinSolid class="w-5 h-5 me-2"/>
159
+ <IconTrashBinSolid class="af-delete-icon w-5 h-5 me-2"/>
163
160
  </button>
164
161
 
165
162
  <template v-slot:tooltip>
@@ -199,14 +196,14 @@
199
196
  <!-- pagination
200
197
  totalRows in v-if is used to not hide page input during loading when user puts cursor into it and edit directly (rows gets null there during edit)
201
198
  -->
202
- <div class="flex flex-row items-center mt-4 xs:flex-row xs:justify-between xs:items-center gap-3"
203
- v-if="(rows || totalRows) && totalRows >= pageSize && totalRows > 0"
204
- >
199
+ <div class="af-pagination-container flex flex-row items-center mt-4 xs:flex-row xs:justify-between xs:items-center gap-3">
205
200
 
206
- <div class="inline-flex ">
201
+ <div class="af-pagination-buttons-container inline-flex "
202
+ v-if="(rows || totalRows) && totalRows >= pageSize && totalRows > 0"
203
+ >
207
204
  <!-- Buttons -->
208
205
  <button
209
- class="flex items-center py-1 px-3 gap-1 text-sm font-medium text-gray-900 focus:outline-none bg-white border-r-0 rounded-s 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"
206
+ class="af-pagination-prev-button flex items-center py-1 px-3 gap-1 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-r-0 rounded-s border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-darkListTablePaginationTextHover dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
210
207
  @click="page--; pageInput = page.toString();" :disabled="page <= 1">
211
208
  <svg class="w-3.5 h-3.5 rtl:rotate-180" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
212
209
  viewBox="0 0 14 10">
@@ -218,14 +215,14 @@
218
215
  </span>
219
216
  </button>
220
217
  <button
221
- class="flex items-center py-1 px-3 text-sm font-medium text-gray-900 focus:outline-none bg-white border-r-0 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"
218
+ class="af-pagination-first-page-button flex items-center py-1 px-3 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-r-0 border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-darkListTablePaginationTextHover dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
222
219
  @click="page = 1; pageInput = page.toString();" :disabled="page <= 1">
223
220
  <!-- <IconChevronDoubleLeftOutline class="w-4 h-4" /> -->
224
221
  1
225
222
  </button>
226
223
  <div
227
224
  contenteditable="true"
228
- class="min-w-10 outline-none inline-block w-auto min-w-10 py-1.5 px-3 text-sm text-center text-gray-700 border border-gray-300 dark:border-gray-700 dark:text-gray-400 dark:bg-gray-800 z-10"
225
+ class="af-pagination-input min-w-10 outline-none inline-block w-auto py-1.5 px-3 text-sm text-center text-lightListTablePaginationCurrentPageText border border-lightListTablePaginationBorder dark:border-darkListTablePaginationBorder dark:text-darkListTablePaginationCurrentPageText dark:bg-darkListTablePaginationBackgoround z-10"
229
226
  @keydown="onPageKeydown($event)"
230
227
  @input="onPageInput($event)"
231
228
  @blur="validatePageInput()"
@@ -234,14 +231,14 @@
234
231
  </div>
235
232
 
236
233
  <button
237
- class="flex items-center py-1 px-3 text-sm font-medium text-gray-900 focus:outline-none bg-white border-l-0 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"
234
+ class="af-pagination-last-page-button flex items-center py-1 px-3 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-l-0 border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-white dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
238
235
  @click="page = totalPages; pageInput = page.toString();" :disabled="page >= totalPages">
239
236
  {{ totalPages }}
240
237
 
241
238
  <!-- <IconChevronDoubleRightOutline class="w-4 h-4" /> -->
242
239
  </button>
243
240
  <button
244
- 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"
241
+ class="af-pagination-next-button flex items-center py-1 px-3 gap-1 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-l-0 rounded-e border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-white dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
245
242
  @click="page++; pageInput = page.toString();" :disabled="page >= totalPages">
246
243
  <span class="hidden sm:inline">{{ $t('Next') }}</span>
247
244
  <svg class="w-3.5 h-3.5 rtl:rotate-180" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
@@ -253,11 +250,11 @@
253
250
  </div>
254
251
 
255
252
  <!-- Help text -->
256
- <span class="text-sm text-gray-700 dark:text-gray-400">
257
- <span v-if="((page || 1) - 1) * pageSize + 1 > totalRows">{{ $t('Wrong Page') }} </span>
258
- <template v-else>
253
+ <span class="text-sm text-lightListTablePaginationHelpText dark:text-darkListTablePaginationHelpText">
254
+ <span v-if="((((page || 1) - 1) * pageSize + 1 > totalRows) && totalRows > 0)">{{ $t('Wrong Page') }} </span>
255
+ <template v-else-if="resource && totalRows > 0">
259
256
 
260
- <span class="hidden sm:inline">
257
+ <span class="af-pagination-info hidden sm:inline">
261
258
  <i18n-t keypath="Showing {from} to {to} of {total} Entries" tag="p" >
262
259
  <template v-slot:from>
263
260
  <strong>{{ from }}</strong>
@@ -307,12 +304,13 @@ import {
307
304
  import {
308
305
  IconEyeSolid,
309
306
  IconPenSolid,
310
- IconTrashBinSolid
307
+ IconTrashBinSolid,
311
308
  } from '@iconify-prerendered/vue-flowbite';
312
309
  import router from '@/router';
313
310
  import { Tooltip } from '@/afcl';
314
311
  import type { AdminForthResourceCommon } from '@/types/Common';
315
312
  import adminforth from '@/adminforth';
313
+ import Checkbox from '@/afcl/Checkbox.vue';
316
314
 
317
315
  const coreStore = useCoreStore();
318
316
  const { t } = useI18n();
@@ -5,28 +5,28 @@
5
5
  :style="`height: ${containerHeight}px; will-change: transform;`"
6
6
  @scroll="handleScroll"
7
7
  ref="containerRef"
8
- >
8
+ >
9
9
  <!-- skelet loader -->
10
10
  <div role="status" v-if="!resource || !resource.columns"
11
11
  class="max-w p-4 space-y-4 divide-y divide-gray-200 rounded shadow animate-pulse dark:divide-gray-700 md:p-6 dark:border-gray-700">
12
12
 
13
13
  <div role="status" class="max-w-sm animate-pulse">
14
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
14
+ <div class="h-2 bg-lightListSkeletLoader rounded-full dark:bg-darkListSkeletLoader max-w-[360px]"></div>
15
15
  </div>
16
16
  </div>
17
- <table v-else class=" w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400 rounded-default">
17
+ <table v-else class=" w-full text-sm text-left rtl:text-right text-lightListTableText dark:text-darkListTableText rounded-default">
18
18
 
19
19
  <tbody>
20
20
  <!-- table header -->
21
21
  <tr class="t-header sticky z-10 top-0 text-xs bg-lightListTableHeading dark:bg-darkListTableHeading dark:text-gray-400">
22
22
  <td scope="col" class="p-4">
23
- <div class="flex items-center">
24
- <input id="checkbox-all-search" type="checkbox" :checked="allFromThisPageChecked" @change="selectAll()"
25
- :disabled="!rows || !rows.length"
26
- class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded
27
- 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">
28
- <label for="checkbox-all-search" class="sr-only">{{ $t('checkbox') }}</label>
29
- </div>
23
+ <Checkbox
24
+ :modelValue="allFromThisPageChecked"
25
+ :disabled="!rows || !rows.length"
26
+ @update:modelValue="selectAll"
27
+ >
28
+ <span class="sr-only">{{ $t('checkbox') }}</span>
29
+ </Checkbox>
30
30
  </td>
31
31
 
32
32
  <td v-for="c in columnsListed" ref="headerRefs" scope="col" class="px-2 md:px-3 lg:px-6 py-3">
@@ -101,17 +101,14 @@
101
101
  :class="{'border-b': rowI !== visibleRows.length - 1, 'cursor-pointer': row._clickUrl !== null}"
102
102
  @mounted="(el) => updateRowHeight(`row_${row._primaryKeyValue}`, el.offsetHeight)"
103
103
  >
104
- <td class="w-4 p-4 cursor-default" @click="(e)=>{e.stopPropagation()}">
105
- <div class="flex items center ">
106
- <input
107
- @click="(e)=>{e.stopPropagation()}"
108
- id="checkbox-table-search-1"
109
- type="checkbox"
110
- :checked="checkboxesInternal.includes(row._primaryKeyValue)"
111
- @change="(e)=>{addToCheckedValues(row._primaryKeyValue)}"
112
- 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">
113
- <label for="checkbox-table-search-1" class="sr-only">{{ $t('checkbox') }}</label>
114
- </div>
104
+ <td class="w-4 p-4 cursor-default" @click="(e)=>e.stopPropagation()">
105
+ <Checkbox
106
+ :model-value="checkboxesInternal.includes(row._primaryKeyValue)"
107
+ @change="(e)=>{addToCheckedValues(row._primaryKeyValue)}"
108
+ @click="(e)=>e.stopPropagation()"
109
+ >
110
+ <span class="sr-only">{{ $t('checkbox') }}</span>
111
+ </Checkbox>
115
112
  </td>
116
113
  <td v-for="c in columnsListed" class="px-2 md:px-3 lg:px-6 py-4">
117
114
  <!-- if c.name in listComponentsPerColumn, render it. If not, render ValueRenderer -->
@@ -216,14 +213,14 @@
216
213
  <!-- pagination
217
214
  totalRows in v-if is used to not hide page input during loading when user puts cursor into it and edit directly (rows gets null there during edit)
218
215
  -->
219
- <div class="flex flex-row items-center mt-4 xs:flex-row xs:justify-between xs:items-center gap-3"
220
- v-if="(rows || totalRows) && totalRows >= pageSize && totalRows > 0"
221
- >
216
+ <div class="flex flex-row items-center mt-4 xs:flex-row xs:justify-between xs:items-center gap-3">
222
217
 
223
- <div class="inline-flex ">
218
+ <div class="inline-flex "
219
+ v-if="(rows || totalRows) && totalRows >= pageSize && totalRows > 0"
220
+ >
224
221
  <!-- Buttons -->
225
222
  <button
226
- class="flex items-center py-1 px-3 gap-1 text-sm font-medium text-gray-900 focus:outline-none bg-white border-r-0 rounded-s 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
+ class="af-pagination-prev-button flex items-center py-1 px-3 gap-1 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-r-0 rounded-s border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-darkListTablePaginationTextHover dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
227
224
  @click="page--; pageInput = page.toString();" :disabled="page <= 1">
228
225
  <svg class="w-3.5 h-3.5 rtl:rotate-180" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
229
226
  viewBox="0 0 14 10">
@@ -235,14 +232,14 @@
235
232
  </span>
236
233
  </button>
237
234
  <button
238
- class="flex items-center py-1 px-3 text-sm font-medium text-gray-900 focus:outline-none bg-white border-r-0 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"
235
+ class="af-pagination-first-page-button flex items-center py-1 px-3 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-r-0 border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-darkListTablePaginationTextHover dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
239
236
  @click="page = 1; pageInput = page.toString();" :disabled="page <= 1">
240
237
  <!-- <IconChevronDoubleLeftOutline class="w-4 h-4" /> -->
241
238
  1
242
239
  </button>
243
240
  <div
244
241
  contenteditable="true"
245
- class="min-w-10 outline-none inline-block w-auto min-w-10 py-1.5 px-3 text-sm text-center text-gray-700 border border-gray-300 dark:border-gray-700 dark:text-gray-400 dark:bg-gray-800 z-10"
242
+ class="af-pagination-input min-w-10 outline-none inline-block w-auto py-1.5 px-3 text-sm text-center text-lightListTablePaginationCurrentPageText border border-lightListTablePaginationBorder dark:border-darkListTablePaginationBorder dark:text-darkListTablePaginationCurrentPageText dark:bg-darkListTablePaginationBackgoround z-10"
246
243
  @keydown="onPageKeydown($event)"
247
244
  @input="onPageInput($event)"
248
245
  @blur="validatePageInput()"
@@ -251,14 +248,14 @@
251
248
  </div>
252
249
 
253
250
  <button
254
- class="flex items-center py-1 px-3 text-sm font-medium text-gray-900 focus:outline-none bg-white border-l-0 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"
251
+ class="af-pagination-last-page-button flex items-center py-1 px-3 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-l-0 border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-white dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
255
252
  @click="page = totalPages; pageInput = page.toString();" :disabled="page >= totalPages">
256
253
  {{ totalPages }}
257
254
 
258
255
  <!-- <IconChevronDoubleRightOutline class="w-4 h-4" /> -->
259
256
  </button>
260
257
  <button
261
- 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"
258
+ class="af-pagination-next-button flex items-center py-1 px-3 gap-1 text-sm font-medium text-lightListTablePaginationText focus:outline-none bg-lightListTablePaginationBackgoround border-l-0 rounded-e border border-lightListTablePaginationBorder hover:bg-lightListTablePaginationBackgoroundHover hover:text-lightListTablePaginationTextHover focus:z-10 focus:ring-4 focus:ring-lightListTablePaginationFocusRing dark:focus:ring-darkListTablePaginationFocusRing dark:bg-darkListTablePaginationBackgoround dark:text-darkListTablePaginationText dark:border-darkListTablePaginationBorder dark:hover:text-white dark:hover:bg-darkListTablePaginationBackgoroundHover disabled:opacity-50"
262
259
  @click="page++; pageInput = page.toString();" :disabled="page >= totalPages">
263
260
  <span class="hidden sm:inline">{{ $t('Next') }}</span>
264
261
  <svg class="w-3.5 h-3.5 rtl:rotate-180" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
@@ -270,9 +267,9 @@
270
267
  </div>
271
268
 
272
269
  <!-- Help text -->
273
- <span class="text-sm text-gray-700 dark:text-gray-400">
274
- <span v-if="((page || 1) - 1) * pageSize + 1 > totalRows">{{ $t('Wrong Page') }} </span>
275
- <template v-else>
270
+ <span class="text-sm text-lightListTablePaginationHelpText dark:text-darkListTablePaginationHelpText">
271
+ <span v-if="((((page || 1) - 1) * pageSize + 1 > totalRows) && totalRows > 0)">{{ $t('Wrong Page') }} </span>
272
+ <template v-else-if="resource && totalRows > 0">
276
273
 
277
274
  <span class="hidden sm:inline">
278
275
  <i18n-t keypath="Showing {from} to {to} of {total} Entries" tag="p" >
@@ -330,6 +327,7 @@ import router from '@/router';
330
327
  import { Tooltip } from '@/afcl';
331
328
  import type { AdminForthResourceCommon } from '@/types/Common';
332
329
  import adminforth from '@/adminforth';
330
+ import Checkbox from '@/afcl/Checkbox.vue';
333
331
 
334
332
  const coreStore = useCoreStore();
335
333
  const { t } = useI18n();
@@ -1,10 +1,12 @@
1
1
  <template>
2
- <div class="overflow-x-auto rounded-default shadow-resourseFormShadow dark:shadow-darkResourseFormShadow">
3
- <div v-if="groupName && !noTitle" class="text-md font-semibold px-6 py-3 flex flex-1 items-center dark:border-gray-600 text-gray-700 bg-lightFormHeading dark:bg-gray-700 dark:text-gray-400 rounded-t-lg">
2
+ <div class="overflow-x-auto shadow-resourseFormShadow dark:shadow-darkResourseFormShadow"
3
+ :class="{'rounded-default' : isRounded}"
4
+ >
5
+ <div v-if="groupName && !noTitle" class="text-md font-semibold px-6 py-3 flex flex-1 items-center text-lightShowTableHeadingText bg-lightShowTableHeadingBackground dark:bg-darkShowTableHeadingBackground dark:text-darkShowTableHeadingText rounded-t-lg">
4
6
  {{ groupName }}
5
7
  </div>
6
- <table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400 table-fixed">
7
- <thead v-if="!allColumnsHaveCustomComponent" class="text-gray-700 dark:text-gray-400 bg-lightFormHeading dark:bg-gray-700 block md:table-row-group">
8
+ <table class="w-full text-sm text-left rtl:text-right text-lightShowTableBodyText dark:text-darkShowTableBodyText table-fixed">
9
+ <thead v-if="!allColumnsHaveCustomComponent" class="text-lightShowTableUnderHeadingText dark:text-darkShowTableUnderHeadingText bg-lightShowTableUnderHeadingBackground dark:bg-darkShowTableUnderHeadingBackground dark:border-darkFormBorder block md:table-row-group">
8
10
  <tr>
9
11
  <th scope="col" class="px-6 py-3 text-xs uppercase hidden md:w-52 md:table-cell">
10
12
  {{ $t('Field') }}
@@ -18,8 +20,8 @@
18
20
  <tr
19
21
  v-for="column in columns"
20
22
  :key="column.name"
21
- class="bg-lightForm border-t border-gray-100
22
- dark:bg-gray-800 dark:border-gray-700 block md:table-row"
23
+ class="bg-lightShowTablesBodyBackground border-t border-lightShowTableBodyBorder
24
+ dark:bg-darkShowTablesBodyBackground dark:border-darkShowTableBodyBorder block md:table-row"
23
25
  >
24
26
  <component
25
27
  v-if="column.components?.showRow"
@@ -60,7 +62,7 @@
60
62
  import { getCustomComponent } from '@/utils';
61
63
  import { useCoreStore } from '@/stores/core';
62
64
  import { computed } from 'vue';
63
- const props = defineProps<{
65
+ const props = withDefaults(defineProps<{
64
66
  columns: Array<{
65
67
  name: string;
66
68
  label: string;
@@ -80,8 +82,11 @@
80
82
  noTitle?: boolean;
81
83
  resource: Record<string, any>;
82
84
  record: Record<string, any>;
83
- }>();
84
-
85
+ isRounded?: boolean;
86
+ }>(), {
87
+ isRounded: true
88
+ });
89
+
85
90
  const coreStore = useCoreStore();
86
91
  const allColumnsHaveCustomComponent = computed(() => {
87
92
  return props.columns.every(column => {
@@ -2,12 +2,12 @@
2
2
  <div
3
3
  role="status" class="max-w-sm animate-pulse"
4
4
  >
5
- <div class="h-2.5 bg-gray-200 rounded-full dark:bg-gray-700 w-48 mb-4"></div>
6
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px] mb-2.5"></div>
7
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 mb-2.5"></div>
8
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[330px] mb-2.5"></div>
9
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[300px] mb-2.5"></div>
10
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
5
+ <div class="h-2.5 bg-lightSkeletonBackgroundColor rounded-full dark:bg-darkSkeletonBackgroundColor w-48 mb-4"></div>
6
+ <div class="h-2 bg-lightSkeletonBackgroundColor rounded-full dark:bg-darkSkeletonBackgroundColor max-w-[360px] mb-2.5"></div>
7
+ <div class="h-2 bg-lightSkeletonBackgroundColor rounded-full dark:bg-darkSkeletonBackgroundColor mb-2.5"></div>
8
+ <div class="h-2 bg-lightSkeletonBackgroundColor rounded-full dark:bg-darkSkeletonBackgroundColor max-w-[330px] mb-2.5"></div>
9
+ <div class="h-2 bg-lightSkeletonBackgroundColor rounded-full dark:bg-darkSkeletonBackgroundColor max-w-[300px] mb-2.5"></div>
10
+ <div class="h-2 bg-lightSkeletonBackgroundColor rounded-full dark:bg-darkSkeletonBackgroundColor max-w-[360px]"></div>
11
11
  <span class="sr-only">{{ $t('Loading...') }}</span>
12
12
  </div>
13
13
  </template>
@@ -12,7 +12,7 @@
12
12
  : '']"
13
13
  >
14
14
  <div role="status" class="max-w-sm animate-pulse">
15
- <div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
15
+ <div class="h-2 bg-lightSkeletonBackgroundColor rounded-full dark:bg-darkSkeletonBackgroundColor max-w-[360px]"></div>
16
16
  </div>
17
17
  </td>
18
18
  </tr>
@@ -2,7 +2,7 @@
2
2
  <template v-if="threeDotsDropdownItems?.length || customActions?.length">
3
3
  <button
4
4
  data-dropdown-toggle="listThreeDotsDropdown"
5
- class="flex items-center py-2 px-2 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 rounded-default"
5
+ class="flex items-center py-2 px-2 text-sm font-medium text-lightThreeDotsMenuIconDots focus:outline-none bg-lightThreeDotsMenuIconBackground rounded border border-lightThreeDotsMenuIconBackgroundBorder hover:bg-lightThreeDotsMenuIconBackgroundHover hover:text-lightThreeDotsMenuIconDotsHover focus:z-10 focus:ring-4 focus:ring-lightThreeDotsMenuIconFocus dark:focus:ring-darkThreeDotsMenuIconFocus dark:bg-darkThreeDotsMenuIconBackground dark:text-darkThreeDotsMenuIconDots dark:border-darkThreeDotsMenuIconBackgroundBorder dark:hover:text-darkThreeDotsMenuIconDotsHover dark:hover:bg-darkThreeDotsMenuIconBackgroundHover rounded-default"
6
6
  >
7
7
  <svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 4 15">
8
8
  <path d="M3.5 1.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Zm0 6.041a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Zm0 5.959a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Z"/>
@@ -12,10 +12,10 @@
12
12
  <!-- Dropdown menu -->
13
13
  <div
14
14
  id="listThreeDotsDropdown"
15
- class="z-20 hidden bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-gray-700 dark:divide-gray-600">
16
- <ul class="py-2 text-sm text-gray-700 dark:text-gray-200" aria-labelledby="dropdownMenuIconButton">
15
+ class="z-20 hidden bg-lightThreeDotsMenuBodyBackground divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-darkThreeDotsMenuBodyBackground dark:divide-gray-600">
16
+ <ul class="py-2 text-sm text-lightThreeDotsMenuBodyText dark:text-darkThreeDotsMenuBodyText" aria-labelledby="dropdownMenuIconButton">
17
17
  <li v-for="item in threeDotsDropdownItems" :key="`dropdown-item-${item.label}`">
18
- <a href="#" class="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">
18
+ <a href="#" class="block px-4 py-2 hover:bg-lightThreeDotsMenuBodyBackgroundHover hover:text-lightThreeDotsMenuBodyTextHover dark:hover:bg-darkThreeDotsMenuBodyBackgroundHover dark:hover:text-darkThreeDotsMenuBodyTextHover">
19
19
  <component :is="getCustomComponent(item)"
20
20
  :meta="item.meta"
21
21
  :resource="coreStore.resource"
@@ -24,7 +24,7 @@
24
24
  </a>
25
25
  </li>
26
26
  <li v-for="action in customActions" :key="action.id">
27
- <a href="#" @click.prevent="handleActionClick(action)" class="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white">
27
+ <a href="#" @click.prevent="handleActionClick(action)" class="block px-4 py-2 hover:text-lightThreeDotsMenuBodyTextHover hover:bg-lightThreeDotsMenuBodyBackgroundHover dark:hover:bg-darkThreeDotsMenuBodyBackgroundHover dark:hover:text-darkThreeDotsMenuBodyTextHover">
28
28
  <div class="flex items-center gap-2">
29
29
  <component
30
30
  v-if="action.icon"
@@ -1,13 +1,8 @@
1
1
  <template>
2
2
 
3
3
 
4
- <div class="flex items-center w-full p-4 text-gray-500 rounded-lg shadow-lg dark:text-gray-400 dark:bg-gray-800 bg-white"
4
+ <div class="flex items-center w-full p-4 rounded-lg shadow-lg dark:text-darkToastText dark:bg-darkToastBackground bg-lightToastBackground text-lightToastText"
5
5
  role="alert"
6
- :class="
7
- {
8
- 'danger': 'bg-red-100',
9
- }[toast.variant]
10
- "
11
6
  >
12
7
  <div v-if="toast.variant == 'info'" class="inline-flex items-center justify-center flex-shrink-0 w-8 h-8 text-lightPrimary dark:text-darkPrimary bg-lightPrimaryOpacity rounded-lg dark:bg-blue-800 dark:text-blue-200">
13
8
  <svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 20">
@@ -36,7 +31,7 @@
36
31
 
37
32
  <div class="ms-3 text-sm font-normal max-w-xs pr-2" v-if="toast.messageHtml" v-html="toast.messageHtml"></div>
38
33
  <div class="ms-3 text-sm font-normal max-w-xs pr-2" v-else>{{toast.message}}</div>
39
- <button @click="closeToast" type="button" class="ms-auto -mx-1.5 -my-1.5 bg-white text-gray-400 hover:text-gray-900 rounded-lg focus:ring-2 focus:ring-gray-300 p-1.5 hover:bg-gray-100 inline-flex items-center justify-center h-8 w-8 dark:text-gray-500 dark:hover:text-white dark:bg-gray-800 dark:hover:bg-gray-700" >
34
+ <button @click="closeToast" type="button" class="ms-auto -mx-1.5 -my-1.5 bg-lightToastCloseIconBackground text-lightToastCloseIcon hover:text-lightToastCloseIconHover rounded-lg focus:ring-2 focus:ring-lightToastCloseIconFocusRing p-1.5 hover:bg-lightToastCloseIconBackgroundHover inline-flex items-center justify-center h-8 w-8 dark:text-darkToastCloseIcon dark:hover:text-darkToastCloseIconHover dark:bg-darkToastCloseIconBackground dark:hover:bg-darkToastCloseIconBackgroundHover dark:focus:ring-darkToastCloseIconFocusRing" >
40
35
  <svg class="w-3 h-3" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
41
36
  <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"/>
42
37
  </svg>
@@ -27,8 +27,8 @@
27
27
  </span>
28
28
 
29
29
  <span v-else-if="column.type === 'boolean'">
30
- <span v-if="record[column.name] === true" class="bg-green-100 whitespace-nowrap 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>
31
- <span v-else-if="record[column.name] === false" class="bg-red-100 whitespace-nowrap text-red-800gg 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>
30
+ <span v-if="record[column.name] === true" class="af-true-value-icon bg-green-100 whitespace-nowrap 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>
31
+ <span v-else-if="record[column.name] === false" class="af-false-value-icon bg-red-100 whitespace-nowrap 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>
32
32
  <span v-else class="bg-gray-100 whitespace-nowrap text-gray-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-gray-700 dark:text-gray-400 border border-gray-400">{{ $t('Unset') }}</span>
33
33
  </span>
34
34
  <span
@@ -39,13 +39,13 @@
39
39
  <span
40
40
  v-if="column.isArray.itemType === 'boolean' && arrayItem"
41
41
  :key="`${column.name}-${arrayItemIndex}`"
42
- class="bg-green-100 whitespace-nowrap 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">
42
+ class="af-true-value-icon bg-green-100 whitespace-nowrap 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">
43
43
  {{ $t('Yes') }}
44
44
  </span>
45
45
  <span
46
46
  v-else-if="column.isArray.itemType === 'boolean'"
47
47
  :key="`${column.name}-${arrayItemIndex}`"
48
- class="bg-red-100 whitespace-nowrap 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">
48
+ class="af-false-value-icon bg-red-100 whitespace-nowrap 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">
49
49
  {{ $t('No') }}
50
50
  </span>
51
51
  <span
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <Toggle
3
+ :disabled="readonly"
4
+ @update:modelValue="$emit('update:value', $event)"
5
+ :modelValue="valueFromRecord"
6
+ >
7
+ <p>{{text}}</p>
8
+ </Toggle>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ import Toggle from '@/afcl/Toggle.vue';
13
+ import type {
14
+ AdminForthResourceColumnCommon,
15
+ AdminForthResourceCommon,
16
+ AdminUser,
17
+ } from "@/types/Common";
18
+
19
+ const props = defineProps<{
20
+ value: boolean,
21
+ text: string,
22
+ column: AdminForthResourceColumnCommon,
23
+ record: any,
24
+ meta: any,
25
+ resource: AdminForthResourceCommon,
26
+ adminUser: AdminUser,
27
+ readonly: boolean
28
+ }>();
29
+ console.log(JSON.stringify(props));
30
+ console.log("Current mode:", props.meta?.mode)
31
+ defineEmits(['update:value']);
32
+ const valueFromRecord = props.record[props.column.name]
33
+ const editReadOnly = props.column.editReadonly;
34
+ </script>
@@ -21,6 +21,7 @@ export type ResourceColumns = {
21
21
 
22
22
  export type CoreConfig = {
23
23
  brandName: string,
24
+ singleTheme?: 'light' | 'dark',
24
25
  brandLogo: string,
25
26
  title: string,
26
27
  datesFormat: string,
@@ -33,12 +34,18 @@ export type CoreConfig = {
33
34
  passwordHashField: string,
34
35
  loginBackgroundImage: string,
35
36
  loginBackgroundPosition: string,
37
+ removeBackgroundBlendMode: boolean,
36
38
  userFullnameField: string,
37
39
  },
38
40
  emptyFieldPlaceholder?: {
39
41
  show?: string,
40
42
  list?: string,
41
43
  } | string,
44
+
45
+ customHeadItems?: {
46
+ tagName: string;
47
+ attributes: { [key: string]: string | boolean };
48
+ }[],
42
49
  }
43
50
 
44
51
 
@@ -118,7 +118,7 @@ export const useCoreStore = defineStore('core', () => {
118
118
  item.badge = badge;
119
119
  }
120
120
  });
121
-
121
+ websocket.unsubscribeAll();
122
122
  subscribeToMenuBadges();
123
123
 
124
124
  }