@simitgroup/simpleapp-generator 1.3.3-alpha → 1.3.5-alpha

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 (71) hide show
  1. package/dist/framework.js +2 -2
  2. package/dist/framework.js.map +1 -1
  3. package/dist/generate.d.ts.map +1 -1
  4. package/dist/generate.js +7 -11
  5. package/dist/generate.js.map +1 -1
  6. package/dist/processors/jsonschemabuilder.d.ts.map +1 -1
  7. package/dist/processors/jsonschemabuilder.js +8 -0
  8. package/dist/processors/jsonschemabuilder.js.map +1 -1
  9. package/package.json +1 -1
  10. package/src/framework.ts +2 -2
  11. package/src/generate.ts +15 -12
  12. package/src/processors/jsonschemabuilder.ts +12 -1
  13. package/templates/basic/nest/controller.ts.eta +17 -6
  14. package/templates/basic/nuxt/component.select.vue.eta +35 -0
  15. package/templates/basic/nuxt/pages.form.vue.eta +5 -8
  16. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +3 -1
  17. package/templates/nest/.gitignore.eta +6 -1
  18. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +10 -9
  19. package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +2 -2
  20. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +38 -38
  21. package/templates/nest/src/simpleapp/generate/types/simpleapp.type.ts.eta +14 -9
  22. package/templates/nuxt/assets/css/style.css._eta +43 -7
  23. package/templates/nuxt/assets/primevue/passthrough.ts._eta +26 -15
  24. package/templates/nuxt/components/button/ButtonAction.vue._eta +19 -0
  25. package/templates/nuxt/components/button/ButtonDanger.vue._eta +13 -6
  26. package/templates/nuxt/components/button/ButtonDefault.vue._eta +13 -6
  27. package/templates/nuxt/components/button/ButtonMultiple.vue._eta +9 -7
  28. package/templates/nuxt/components/button/ButtonPrimary.vue._eta +13 -6
  29. package/templates/nuxt/components/button/ButtonText.vue._eta +16 -7
  30. package/templates/nuxt/components/button/ButtonWarning.vue._eta +13 -6
  31. package/templates/nuxt/components/calendar/CalendarSmall.vue.eta +83 -69
  32. package/templates/nuxt/components/chart/card.vue._eta +32 -0
  33. package/templates/nuxt/components/event/EventDocumentViewer.vue._eta +44 -21
  34. package/templates/nuxt/components/event/EventNotification.vue._eta +119 -107
  35. package/templates/nuxt/components/header/button/HeaderButtonMenuPicker.vue._eta +46 -38
  36. package/templates/nuxt/components/header/button/HeaderButtonProfile.vue.eta +131 -75
  37. package/templates/nuxt/components/list/ListView.vue.eta +44 -13
  38. package/templates/nuxt/components/mobile/MobileToolbar.vue.eta +13 -8
  39. package/templates/nuxt/components/overlay/OverlayPanelWithToolBar.vue.eta +35 -37
  40. package/templates/nuxt/components/overlay/OverlaySideBarCrud.vue.eta +3 -4
  41. package/templates/nuxt/components/renderer/RendererDate.vue.eta +3 -2
  42. package/templates/nuxt/components/renderer/RendererForeignKey.vue.eta +38 -34
  43. package/templates/nuxt/components/select/SelectTemplate.vue.eta +79 -0
  44. package/templates/nuxt/components/select/readme.md +1 -0
  45. package/templates/nuxt/components/simpleApp/SimpleAppAutocomplete.vue.eta +181 -35
  46. package/templates/nuxt/components/simpleApp/SimpleAppChildrenList.vue.eta +70 -0
  47. package/templates/nuxt/components/simpleApp/SimpleAppDocumentNo.vue.eta +77 -73
  48. package/templates/nuxt/components/simpleApp/SimpleAppFieldContainer.vue.eta +20 -7
  49. package/templates/nuxt/components/simpleApp/SimpleAppForm.vue.eta +113 -111
  50. package/templates/nuxt/components/simpleApp/{SimpleAppFormToolBar.vue.eta → SimpleAppFormToolBar.vue._eta} +126 -65
  51. package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +117 -43
  52. package/templates/nuxt/components/text/TextPrimary.vue._eta +13 -0
  53. package/templates/nuxt/components/user/UserButtonCreateTenant.vue._eta +64 -0
  54. package/templates/nuxt/components/user/UserTenantPicker.vue.eta +81 -70
  55. package/templates/nuxt/composables/date.generate.ts.eta +2 -0
  56. package/templates/nuxt/composables/getDocument.generate.ts.eta +35 -2
  57. package/templates/nuxt/composables/getOpenApi.generate.ts.eta +5 -1
  58. package/templates/nuxt/composables/refreshDocumentList.generate.ts.eta +14 -2
  59. package/templates/nuxt/lang/en.ts.eta +3 -1
  60. package/templates/nuxt/nuxt.config.ts._eta +3 -0
  61. package/templates/nuxt/pages/[xorg]/organization.vue.eta +80 -61
  62. package/templates/nuxt/pages/index.vue._eta +10 -56
  63. package/templates/nuxt/pages/picktenant.vue._eta +19 -0
  64. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +10 -2
  65. package/templates/nuxt/server/api/[xorg]/[...].ts.eta +9 -10
  66. package/templates/nuxt/types/calendar.ts.eta +2 -0
  67. package/templates/nuxt/types/events.ts.eta +3 -1
  68. package/templates/nuxt/types/simpleappinput.ts.eta +1 -0
  69. package/templates/project/lang/default._json +150 -63
  70. package/tsconfig.tsbuildinfo +1 -1
  71. package/templates/nuxt/components/user/UserButtonCreateTenant.vue.eta +0 -103
@@ -5,52 +5,60 @@
5
5
  * last change 2024-02-22
6
6
  * author: Ks Tan
7
7
  */
8
-
9
- import Dialog from 'primevue/dialog';
10
- // import {ref} from 'vue'
11
- import {MenuData} from '~/types'
12
- const visible = defineModel<boolean>({default:true,required:true})
13
8
 
14
- // const emit = defineEmits(['select'])
15
- const selectMenu = (menuname:{name:string,children:any}) =>{
16
- goTo(menuname.name)
17
- visible.value=false
18
- }
9
+ import { MenuData } from "~/types";
10
+ const visible = defineModel<boolean>({ default: true, required: true });
19
11
 
12
+ // const emit = defineEmits(['select'])
13
+ const selectMenu = (menuname: { name: string; children: any }) => {
14
+ goTo(menuname.name);
15
+ visible.value = false;
16
+ };
20
17
 
21
- const m = getMenustFromPageMeta()
22
- let treemenu:any[] = []
18
+ const m = getMenustFromPageMeta();
19
+ let treemenu: any[] = [];
23
20
 
24
- getMenustFromPageMeta().reduce((r, item) => {
25
- item.split('/').
26
- reduce((o, name) => {
27
- var temp = (o.children = o.children || []).find(q => q.name === name);
28
- if (!temp) o.children.push(temp = { name });
29
- return temp;
21
+ getMenustFromPageMeta().reduce(
22
+ (r, item) => {
23
+ item.split("/").reduce((o, name) => {
24
+ var temp = (o.children = o.children || []).find((q) => q.name === name);
25
+ if (!temp) o.children.push((temp = { name }));
26
+ return temp;
30
27
  }, r);
31
28
  return r;
32
- }, { children: treemenu })
29
+ },
30
+ { children: treemenu },
31
+ );
33
32
 
34
- treemenu = treemenu.sort((a,b)=>a.name<b.name ?-1:1)
33
+ treemenu = treemenu.sort((a, b) => (a.name < b.name ? -1 : 1));
35
34
  </script>
36
35
  <template>
37
-
38
- <!-- <button class="text-center border-none cursor-pointer pi pi-bars dark:text-white" v-if="getCurrentXorg()" @click="visible=true"> -->
39
- <Dialog v-model:visible="visible" modal :header="t('pickDocument')" :pt="{dialog:{ class:' bg-primary-800 ' }}">
40
- <div class="">
41
-
42
- <div v-for="m in treemenu.sort()" class="m-4">
43
-
44
- <h3>{{ t(m.name) }}</h3>
45
- <div class="grid md:grid-cols-2 lg:grid-cols-6 gap-4">
46
- <ButtonPrimary v-for="submenu in m.children.sort((a:any,b:any)=>a.name<b.name ?-1:1)" class="border rounded-lg p-2" @click="selectMenu(submenu)">
47
- {{ t(submenu.name) }}
48
- </ButtonPrimary>
49
- </div>
50
-
51
- </div>
52
-
36
+ <!-- <button class="text-center border-none cursor-pointer pi pi-bars dark:text-white" v-if="getCurrentXorg()" @click="visible=true"> -->
37
+ <Dialog
38
+ v-model:visible="visible"
39
+ modal
40
+ dismissableMask
41
+ position="top"
42
+ :header="t('pickDocument')"
43
+ :pt="{root:{class:'h-6/7',},}"
44
+ :pt-options="{mergeProps:true,mergeSections:true}"
45
+ >
46
+ <div class="">
47
+ <div v-for="(m,index) in treemenu.sort()" class="m-4" :key="index">
48
+ <h3>{{ t(m.name) }}</h3>
49
+ <div class="grid md:grid-cols-2 lg:grid-cols-6 gap-4">
50
+ <ButtonPrimary
51
+ v-for="(submenu,menuindex) in m.children.sort((a: any, b: any) =>
52
+ a.name < b.name ? -1 : 1,
53
+ )"
54
+ class="border rounded-lg p-2"
55
+ :key="menuindex"
56
+ @click="selectMenu(submenu)"
57
+ >
58
+ {{ t(submenu.name) }}
59
+ </ButtonPrimary>
53
60
  </div>
54
- </Dialog>
55
-
61
+ </div>
62
+ </div>
63
+ </Dialog>
56
64
  </template>
@@ -5,85 +5,141 @@
5
5
  * last change 2023-10-28
6
6
  * Author: Ks Tan
7
7
  */
8
- import Avatar from 'primevue/avatar';
9
- import Dropdown from 'primevue/dropdown';
10
- import OverlayPanel from 'primevue/overlaypanel';
11
- import {ref} from 'vue'
12
-
13
-
14
- const { locale,setLocale,locales } = useI18n()
15
- const colorMode = useColorMode()
16
- const modelValue = defineModel<boolean>()
17
- const mylocale = ref(locale)
18
- const colors = [{value:'light', name:t('light')},{value:'dark', name:t('dark')}]
19
-
20
- const toProfile = ()=>{
21
- modelValue.value=false
22
-
23
- if(getCurrentXorg()){
24
- navigateTo(`/${getCurrentXorg()}/profile`)
25
- }else{
26
- navigateTo(`/profile`)
27
- }
28
-
29
- }
30
- const saveLocale=async (v:string)=>{
31
- await setLocale(v)
32
- }
33
-
8
+ import Avatar from "primevue/avatar";
9
+ import Dropdown from "primevue/dropdown";
10
+ import OverlayPanel from "primevue/overlaypanel";
11
+ import { ref } from "vue";
34
12
 
13
+ const { locale, setLocale, locales } = useI18n();
14
+ const colorMode = useColorMode();
15
+ const modelValue = defineModel<boolean>();
16
+ const mylocale = ref(locale);
17
+ const colors = [
18
+ { value: "light", name: t("light") },
19
+ { value: "dark", name: t("dark") },
20
+ ];
21
+ const goTenantPicker = () => {
22
+ modelValue.value = false;
23
+ navigateTo("/picktenant");
24
+ };
25
+ const toProfile = () => {
26
+ modelValue.value = false;
35
27
 
28
+ if (getCurrentXorg()) {
29
+ navigateTo(`/${getCurrentXorg()}/profile`);
30
+ } else {
31
+ navigateTo(`/profile`);
32
+ }
33
+ };
34
+ const saveLocale = async (v: string) => {
35
+ await setLocale(v);
36
+ };
36
37
  </script>
37
38
 
38
- <template>
39
- <!-- <div class="bg-cover bg-center rounded-md p-3 cursor-pointer profile-button" @click="toggle">
39
+ <template>
40
+ <!-- <div class="bg-cover bg-center rounded-md p-3 cursor-pointer profile-button" @click="toggle">
40
41
  <i class="pi pi-user dark:text-white"></i> -->
41
- <!-- <img :src="getAvatarLink(<string>getProfileEmail(),32)" alt="" class="h-full w-full overflow-hidden object-cover rounded-full border-2 border-white dark:border-gray-700 shadow" /> -->
42
- <!-- </div> -->
43
-
44
- <Dialog appendTo="body" ref="userprofileoverlay" v-model:visible="modelValue" close-on-escape :header="t('profile')">
45
- <!-- <div> -->
46
- <!-- <div class="py-2 transition duration-150 ease-in-out z-10 absolute top-0 right-0 bottom-0 left-0" id="modal"> -->
47
- <div class="p-4">
48
- <!-- <div class="relative p-4 md:p-8 bg-white dark:bg-gray-800 shadow-md rounded border border-gray-400"> -->
49
- <div class="w-full flex items-center justify-start text-gray-600 dark:text-gray-400 mb-5" >
50
- <div class="w-12 h-12 bg-cover bg-center rounded-md">
51
- <img :src="getAvatarLink(<string>getProfileEmail(),32)" alt="" class="h-full w-full overflow-hidden object-cover rounded-full border-2 border-white dark:border-gray-700 shadow" />
52
- </div>
53
- <div class="flex flex-col" >
54
- <h1 class="text-left text-gray-800 dark:text-gray-100 font-lg font-bold tracking-normal leading-tight ml-2">{{ getUserProfile()?.fullName }}</h1>
55
- <p class="text-gray-400 dark:text-gray-100 font-normal text-base tracking-normal ml-2 mr-4">{{getUserProfile()?.group }}</p>
56
- </div>
57
-
58
- </div>
59
- <div class="col-span-full">
60
- <label for="pick-lang" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-300">{{ t('language') }}</label>
61
- <div class="mt-2">
62
- <Dropdown inputId="pick-lang" @update:model-value="saveLocale" v-model="mylocale" option-value="code" option-label="name" :options="locales" >
63
- </Dropdown>
64
- </div>
65
- </div>
66
- <div class="mt-3 col-span-full">
67
- <label for="pick-theme" class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-300">{{ t('theme') }}</label>
68
- <div class="mt-2">
69
- <h1>Color mode: {{ $colorMode.value }}</h1>
42
+ <!-- <img :src="getAvatarLink(<string>getProfileEmail(),32)" alt="" class="h-full w-full overflow-hidden object-cover rounded-full border-2 border-white dark:border-gray-700 shadow" /> -->
43
+ <!-- </div> -->
44
+
45
+ <Dialog
46
+ modal
47
+ dismissableMask
48
+ appendTo="body"
49
+ ref="userprofileoverlay"
50
+ v-model:visible="modelValue"
51
+ close-on-escape
52
+ :header="t('profile')"
53
+ >
54
+ <!-- <div> -->
55
+ <!-- <div class="py-2 transition duration-150 ease-in-out z-10 absolute top-0 right-0 bottom-0 left-0" id="modal"> -->
56
+ <div class="p-4">
57
+ <!-- <div class="relative p-4 md:p-8 bg-white dark:bg-gray-800 shadow-md rounded border border-gray-400"> -->
58
+ <div
59
+ class="w-full flex items-center justify-start text-gray-600 dark:text-gray-400 mb-5"
60
+ >
61
+ <div class="w-12 h-12 bg-cover bg-center rounded-md">
62
+ <img
63
+ :src="getAvatarLink(<string>getProfileEmail(), 32)"
64
+ alt=""
65
+ class="h-full w-full overflow-hidden object-cover rounded-full border-2 border-white dark:border-gray-700 shadow"
66
+ />
67
+ </div>
68
+ <div class="flex flex-col">
69
+ <h1
70
+ class="text-left text-gray-800 dark:text-gray-100 font-lg font-bold tracking-normal leading-tight ml-2"
71
+ >
72
+ {{ getUserProfile()?.fullName }}
73
+ </h1>
74
+ <p
75
+ class="text-gray-400 dark:text-gray-100 font-normal text-base tracking-normal ml-2 mr-4"
76
+ >
77
+ {{ getUserProfile()?.group }}
78
+ </p>
79
+ </div>
80
+ </div>
81
+ <div class="pt-2 pb-2">
82
+ <TextTitle>{{ getUserProfile()?.branchName }}</TextTitle>
83
+ <TextPrimary @click="goTenantPicker">{{
84
+ t("switchDatabase")
85
+ }} </TextPrimary>
86
+ </div>
87
+ <div class="col-span-full">
88
+ <label
89
+ for="pick-lang"
90
+ class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-300"
91
+ >{{ t("language") }}</label
92
+ >
93
+ <div class="mt-2">
94
+ <Dropdown
95
+ inputId="pick-lang"
96
+ @update:model-value="saveLocale"
97
+ v-model="mylocale"
98
+ option-value="code"
99
+ option-label="name"
100
+ :options="locales"
101
+ >
102
+ </Dropdown>
103
+ </div>
104
+ </div>
105
+ <div class="mt-3 col-span-full">
106
+ <label
107
+ for="pick-theme"
108
+ class="block text-sm font-medium leading-6 text-gray-900 dark:text-gray-300"
109
+ >{{ t("theme") }}</label
110
+ >
111
+ <div class="mt-2">
112
+ <h1>Color mode: {{ $colorMode.value }}</h1>
113
+
114
+ <Dropdown
115
+ inputId="pick-theme"
116
+ v-model="colorMode.preference"
117
+ option-value="value"
118
+ option-label="name"
119
+ :options="colors"
120
+ >
121
+ </Dropdown>
122
+ </div>
123
+ </div>
70
124
 
71
- <Dropdown inputId="pick-theme" v-model="colorMode.preference" option-value="value" option-label="name" :options="colors" >
72
- </Dropdown>
73
-
74
- </div>
75
- </div>
125
+ <div class="mt-3 flex items-center justify-start w-full">
126
+ <button
127
+ class="focus:outline-none transition duration-150 ease-in-out hover:bg-gray-600 bg-gray-700 rounded text-white px-8 py-2 text-sm"
128
+ @click="toProfile"
129
+ >
130
+ {{ t("profile") }}
131
+ </button>
132
+ <button
133
+ class="focus:outline-none ml-3 bg-warning-100 dark:bg-warning-700 dark:border-warning-700 dark:hover:bg-warning-600 transition duration-150 text-gray-600 dark:text-white ease-in-out hover:border-gray-400 hover:bg-gray-300 border rounded px-8 py-2 text-sm"
134
+ @click="logout()"
135
+ >
136
+ {{ t("logout") }}
137
+ </button>
138
+ </div>
139
+ <!-- </div> -->
140
+ </div>
141
+ <!-- </div> -->
76
142
 
77
-
78
- <div class="mt-3 flex items-center justify-start w-full">
79
- <button class="focus:outline-none transition duration-150 ease-in-out hover:bg-gray-600 bg-gray-700 rounded text-white px-8 py-2 text-sm" @click="toProfile">{{ t('profile') }}</button>
80
- <button class="focus:outline-none ml-3 bg-warning-100 dark:bg-warning-700 dark:border-warning-700 dark:hover:bg-warning-600 transition duration-150 text-gray-600 dark:text-white ease-in-out hover:border-gray-400 hover:bg-gray-300 border rounded px-8 py-2 text-sm" @click="logout()">{{ t('logout') }}</button>
81
- </div>
82
- <!-- </div> -->
83
- </div>
84
- <!-- </div> -->
85
-
86
- <!-- </div> -->
87
- </Dialog>
88
-
89
- </template>
143
+ <!-- </div> -->
144
+ </Dialog>
145
+ </template>
@@ -2,19 +2,25 @@
2
2
  <div class="relative">
3
3
  <div v-if="withFilter" class="flex flex-row">
4
4
  <InputText
5
- placeholder="search"
5
+ :placeholder="t('searchKeyword')"
6
6
  v-model="searchvalue"
7
7
  class="w-full dark:text-white"
8
8
  type="search"
9
+ ref="listviewfilter"
9
10
  />
10
- <ButtonPrimary v-if="withAddNew" @click="emits('add')"
11
- ><i class="pi pi-plus"></i
12
- ></ButtonPrimary>
11
+ <template v-if="withAddNew">
12
+ <ButtonText v-if="isMobile()" @click="emits('add')"
13
+ ><i class="pi pi-plus"></i
14
+ ></ButtonText>
15
+ <ButtonPrimary v-else @click="emits('add')"
16
+ ><i class="pi pi-plus"></i
17
+ ></ButtonPrimary>
18
+ </template>
13
19
  </div>
14
20
 
15
21
  <div
16
22
  v-if="showIndex"
17
- class="flex flex-col fixed left-1 top-1/5 gap-2 z-10 rounded border bg-white dark:bg-black opacity-90"
23
+ class="flex flex-col fixed left-1 top-1/5 gap-2 z-10 rounded border bg-white dark:bg-black opacity-90"
18
24
  >
19
25
  <NuxtLink
20
26
  class="text-primary-600 dark:text-primary-400 text-lg p-2"
@@ -28,7 +34,9 @@
28
34
  <div>
29
35
  <div v-for="(item, index) in filterlist">
30
36
  <!-- :class="isMobile() ? '' : 'overflow overflow-y-scroll overflow-auto '" -->
31
- <div :id="titleField && item[titleField][0]"></div>
37
+ <div
38
+ :id="titleField && item[titleField] && item[titleField][0]"
39
+ ></div>
32
40
  <div
33
41
  class="w-full bg-gray-400 dark:bg-gray-500 p-1 pl-2 top-0 sticky opacity-90"
34
42
  v-if="
@@ -37,8 +45,16 @@
37
45
  >
38
46
  <span>{{ item[titleField][0] }}</span>
39
47
  </div>
40
- <div class=" border-l-none border-r-none listview-item border-t-2 dark:border-t-gray-700 hover:" >
41
- <NuxtLink :to="url ? `${url}/${item[idField]}` : undefined" class="p-2">
48
+ <div
49
+ @click="onClick(index, item)"
50
+ :class="`border-l-none border-r-none listview-item dark:border-t-gray-700 ${
51
+ index > 0 ? 'border-t-2' : ''
52
+ }`"
53
+ >
54
+ <NuxtLink :to="getUrl(item)"
55
+
56
+ class="p-2"
57
+ >
42
58
  <slot name="default" :item="item" :index="index">
43
59
  <div class="flex flex-row">
44
60
  <div class="flex-1 mr-2 dark:text-white">
@@ -55,9 +71,7 @@
55
71
  </div>
56
72
  </div>
57
73
  <div v-else>
58
- <div
59
- class="w-full h-20 p-2 border-l-none border-r-none "
60
- >
74
+ <div class="w-full h-20 p-2 border-l-none border-r-none">
61
75
  <slot name="nodata">
62
76
  <div class="border-round border-1 surface-border p-4 surface-card">
63
77
  {{ t("noDataFound") }}
@@ -76,6 +90,8 @@
76
90
  */
77
91
  import { ref } from "vue";
78
92
  import { ListItem } from "~/types/listview";
93
+ import _ from 'lodash'
94
+ const listviewfilter = ref();
79
95
  const props = withDefaults(
80
96
  defineProps<{
81
97
  list: T[];
@@ -94,13 +110,21 @@ const props = withDefaults(
94
110
  const letters = ref<string[]>([]);
95
111
  let lastchar = "";
96
112
 
97
- const emits = defineEmits(["add"]);
113
+ const emits = defineEmits(["add", "click"]);
98
114
  const searchvalue = ref("");
99
115
  const selecteditem = ref("");
100
116
  const clickRow = (item: ListItem) => {
101
117
  // emit('clickitem',item)
102
118
  // selecteditem.value = item.code
103
119
  };
120
+ const getUrl = (item:any)=>{
121
+ if(props.url && props.idField) {
122
+ if(_.last(props.url)=='/') return `${props.url}${item[props.idField]}`
123
+ else return `${props.url}/${item[props.idField]}`
124
+ }
125
+ else return undefined
126
+ // :to="url ? `${url}/${item[idField]}` : undefined"
127
+ }
104
128
  const filterlist = computed(() => {
105
129
  let newlist: T[] = [];
106
130
  if (!Array.isArray(props.list)) {
@@ -122,7 +146,6 @@ const filterlist = computed(() => {
122
146
  return newlist;
123
147
  });
124
148
 
125
-
126
149
  const allLetters = computed(() => {
127
150
  if (props.titleField && props.list) {
128
151
  return props.list
@@ -147,4 +170,12 @@ const showCategoryBar = (letter: string) => {
147
170
  return false;
148
171
  }
149
172
  };
173
+
174
+ const onClick = (index: number, data: T) => {
175
+ emits("click", index, data);
176
+ };
177
+
178
+ onMounted(() => {
179
+ // if(props.withFilter) listviewfilter.value.$el.focus()
180
+ });
150
181
  </script>
@@ -1,10 +1,15 @@
1
- <template>
2
- <div class="w-full dark:bg-gray-800 z-20 justify justify-between absolute h h-14 flex flex-row place-items-center opacity-90 dark:text-white"
3
- >
4
- <div class="w-full text-left"><slot name="start"></slot></div>
5
- <div class="w-full text-center"><slot name="center"></slot></div>
6
- <div class="w-full text-right"><slot name="end"></slot></div>
7
- </div>
1
+ <template>
2
+ <div v-bind="$attrs"
3
+ class="w-full dark:bg-gray-800 z-20 justify justify-between absolute h h-14 flex flex-row place-items-center opacity-90 dark:text-white"
4
+ >
5
+ <div class="text-left"><slot name="start"></slot></div>
6
+ <div class="flex-1 text-center line-clamp-2">
7
+ <slot name="center"></slot>
8
+ </div>
9
+ <div class="text-right"><slot name="end"></slot></div>
10
+ </div>
11
+ <div class="h-14"></div>
12
+
8
13
  </template>
9
14
  <script setup lang="ts">
10
15
  /**
@@ -13,4 +18,4 @@
13
18
  * last change 2023-10-28
14
19
  * Author: Ks Tan
15
20
  */
16
- </script>
21
+ </script>
@@ -1,44 +1,42 @@
1
1
  <template>
2
- <Sidebar
3
- position="right"
4
- v-if="showDialog"
5
- v-model:visible="showDialog"
6
- modal
7
- :show-close-icon="false"
8
- #container
9
- >
10
- <div class="overflow-y-scroll">
11
- <MobileToolbar class="bg-gray-800 text-white">
12
- <template #start>
13
- <slot name="headerLeft"></slot>
14
- </template>
15
- <template #center>
16
- <slot name="headerCenter"></slot>
17
- </template>
18
- <template #end>
19
- <slot name="headerRight"></slot>
20
- </template>
21
- </MobileToolbar>
22
- <div class="mt-14">
23
- <slot name="default"></slot>
24
- </div>
2
+ <Sidebar
3
+ position="right"
4
+ v-if="showDialog"
5
+ v-model:visible="showDialog"
6
+ modal
7
+ :show-close-icon="false"
8
+ #container
9
+ >
10
+ <div class="overflow-y-scroll">
11
+ <MobileToolbar class="bg-gray-800 text-white">
12
+ <template #start>
13
+ <slot name="headerLeft"></slot>
14
+ </template>
15
+ <template #center>
16
+ <slot name="headerCenter"></slot>
17
+ </template>
18
+ <template #end>
19
+ <slot name="headerRight"></slot>
20
+ </template>
21
+ </MobileToolbar>
22
+ <div >
23
+ <slot name="default"></slot>
25
24
  </div>
26
- </Sidebar>
27
- </template>
28
- <script lang="ts" setup>
29
- /**
25
+ </div>
26
+ </Sidebar>
27
+ </template>
28
+ <script lang="ts" setup>
29
+ /**
30
30
  * This file was automatically generated by simpleapp generator. Every
31
31
  * MODIFICATION OVERRIDE BY GENERATEOR
32
32
  * last change 2023-10-28
33
33
  * Author: Ks Tan
34
34
  */
35
- const showDialog = defineModel<boolean>({ required: true });
36
- const props = defineProps<{ closeEventName: string }>();
37
- useNuxtApp().$listen("CloseDialog", (closeEventName: string) => {
38
- if (props.closeEventName == closeEventName){
39
- showDialog.value = false;
40
- }
41
- });
42
-
43
- </script>
44
-
35
+ const showDialog = defineModel<boolean>({ required: true });
36
+ const props = defineProps<{ closeEventName: string }>();
37
+ useNuxtApp().$listen("CloseDialog", (closeEventName: string) => {
38
+ if (props.closeEventName == closeEventName) {
39
+ showDialog.value = false;
40
+ }
41
+ });
42
+ </script>
@@ -22,9 +22,8 @@
22
22
  const showDialog = defineModel<boolean>({ required: true });
23
23
  const props = defineProps<{ closeEventName: string }>();
24
24
  useNuxtApp().$listen("CloseDialog", (closeEventName: string) => {
25
- if (props.closeEventName == closeEventName){
26
- showDialog.value = false;
27
- }
25
+ if (props.closeEventName == closeEventName) {
26
+ showDialog.value = false;
27
+ }
28
28
  });
29
-
30
29
  </script>
@@ -1,5 +1,6 @@
1
1
  <template>
2
- <span>{{ toLocalDate(value ?? "") }}</span>
2
+ <span v-if="modelValue">{{ toLocalDate(modelValue) }}</span>
3
+ <span v-else>-</span>
3
4
  </template>
4
5
  <script lang="ts" setup>
5
6
  /**
@@ -8,5 +9,5 @@
8
9
  * last change 2024-02-04
9
10
  * author: Ks Tan
10
11
  */
11
- const props = defineProps<{ value?: string }>();
12
+ const modelValue = defineModel<Date|string>()
12
13
  </script>