@simitgroup/simpleapp-generator 1.3.4-alpha → 1.4.0-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 (85) hide show
  1. package/dist/buildinschemas/permission.d.ts.map +1 -1
  2. package/dist/buildinschemas/permission.js +10 -6
  3. package/dist/buildinschemas/permission.js.map +1 -1
  4. package/dist/buildinschemas/user.d.ts.map +1 -1
  5. package/dist/buildinschemas/user.js +22 -2
  6. package/dist/buildinschemas/user.js.map +1 -1
  7. package/dist/generate.js +20 -6
  8. package/dist/generate.js.map +1 -1
  9. package/dist/type.d.ts +2 -0
  10. package/dist/type.d.ts.map +1 -1
  11. package/dist/type.js.map +1 -1
  12. package/package.json +1 -1
  13. package/src/buildinschemas/permission.ts +10 -6
  14. package/src/buildinschemas/user.ts +23 -3
  15. package/src/generate.ts +19 -6
  16. package/src/type.ts +3 -1
  17. package/templates/basic/nest/controller.ts.eta +1 -1
  18. package/templates/basic/nest/service.ts.eta +7 -3
  19. package/templates/basic/nuxt/pages.[id].vue.eta +4 -4
  20. package/templates/basic/nuxt/pages.mobile.[id].vue.eta +39 -0
  21. package/templates/basic/nuxt/pages.mobile.landing.vue.eta +69 -0
  22. package/templates/nest/.gitignore.eta +6 -1
  23. package/templates/nest/src/simpleapp/apischemas/index.ts._eta +29 -0
  24. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +22 -12
  25. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +26 -1
  26. package/templates/nest/src/simpleapp/generate/workflow/workflow.service.ts.eta +1 -1
  27. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +1 -1
  28. package/templates/nest/src/simpleapp/profile/profile.types.ts.eta +1 -1
  29. package/templates/nest/src/simpleapp/services/perm.service.ts.eta +5 -7
  30. package/templates/nest/src/simpleapp/services/user.service.ts.eta.old +118 -0
  31. package/templates/nest/src/simpleapp/types/index.ts._eta +8 -0
  32. package/templates/nuxt/app.vue._eta +31 -17
  33. package/templates/nuxt/assets/css/style.css._eta +4 -4
  34. package/templates/nuxt/assets/primevue/passthrough.ts._eta +10 -4
  35. package/templates/nuxt/components/calendar/CalendarByResource.vue.eta +181 -163
  36. package/templates/nuxt/components/calendar/CalendarSmall.vue.eta +8 -6
  37. package/templates/nuxt/components/form/FormDocnoformat.vue.eta +174 -0
  38. package/templates/nuxt/components/form/FormUser.vue._eta +91 -0
  39. package/templates/nuxt/components/form/user/FormUserPermission.vue.eta +83 -0
  40. package/templates/nuxt/components/header/HeaderBar.vue._eta +43 -39
  41. package/templates/nuxt/components/header/button/HeaderButtonMenuPicker.vue._eta +46 -38
  42. package/templates/nuxt/components/header/button/HeaderButtonProfile.vue.eta +9 -9
  43. package/templates/nuxt/components/mobile/MobileToolbar.vue.eta +12 -8
  44. package/templates/nuxt/components/overlay/OverlayPanelWithToolBar.vue.eta +1 -1
  45. package/templates/nuxt/components/page/PageDocList.vue.eta +6 -4
  46. package/templates/nuxt/components/renderer/RendererDateTime.vue.eta +13 -0
  47. package/templates/nuxt/components/renderer/RendererForeignKey.vue.eta +6 -3
  48. package/templates/nuxt/components/simpleApp/SimpleAppAutocomplete.vue.eta +3 -4
  49. package/templates/nuxt/components/simpleApp/SimpleAppFieldContainer.vue.eta +20 -7
  50. package/templates/nuxt/components/simpleApp/SimpleAppFormToolBar.vue._eta +2 -5
  51. package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +56 -12
  52. package/templates/nuxt/components/user/UserButtonCreateTenant.vue._eta +2 -6
  53. package/templates/nuxt/composables/date.generate.ts.eta +3 -1
  54. package/templates/nuxt/composables/goTo.generate.ts.eta +4 -1
  55. package/templates/nuxt/composables/refreshDocumentList.generate.ts.eta +13 -2
  56. package/templates/nuxt/layouts/mobile.vue._eta +26 -12
  57. package/templates/nuxt/nuxt.config.ts._eta +27 -20
  58. package/templates/nuxt/pages/[xorg]/{user/index.vue.eta → docnoformat/[id].vue.eta} +11 -9
  59. package/templates/nuxt/pages/[xorg]/docnoformat.vue.eta +51 -20
  60. package/templates/nuxt/pages/[xorg]/mobile/docnoformat/index.vue.eta +59 -0
  61. package/templates/nuxt/pages/[xorg]/mobile/index.vue._eta +19 -0
  62. package/templates/nuxt/pages/[xorg]/mobile/organization/index.vue.eta +138 -0
  63. package/templates/nuxt/pages/[xorg]/mobile/pickgroup.vue._eta +35 -0
  64. package/templates/nuxt/pages/[xorg]/mobile/user/index.vue.eta +231 -0
  65. package/templates/nuxt/pages/[xorg]/organization.vue.eta +80 -61
  66. package/templates/nuxt/pages/[xorg]/pickgroup.vue._eta +35 -0
  67. package/templates/nuxt/pages/[xorg]/user.vue.eta +91 -74
  68. package/templates/nuxt/pages/profile.vue.eta +7 -7
  69. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +14 -3
  70. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +18 -16
  71. package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +1 -1
  72. package/templates/nuxt/types/events.ts.eta +1 -0
  73. package/templates/nuxt/types/simpleappinput.ts.eta +3 -2
  74. package/templates/nuxt/types/user.ts.eta +2 -1
  75. package/templates/project/lang/default._json +150 -67
  76. package/tsconfig.tsbuildinfo +1 -1
  77. package/templates/nest/src/simpleapp/services/user.service.ts.etax +0 -66
  78. package/templates/nuxt/pages/[xorg]/docnoformat/[doctype]/[id].vue.eta +0 -13
  79. package/templates/nuxt/pages/[xorg]/docnoformat/[doctype]/new.vue.eta +0 -229
  80. package/templates/nuxt/pages/[xorg]/docnoformat/[doctype].vue.eta +0 -38
  81. package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +0 -11
  82. package/templates/nuxt/pages/[xorg]/user/[id].vue.eta +0 -39
  83. package/templates/nuxt/pages/[xorg]/user/form.vue.eta +0 -334
  84. package/templates/nuxt/pages/[xorg]/user/new.vue.eta +0 -18
  85. package/templates/nuxt/pages/[xorg]/user/viewer.vue.eta +0 -29
@@ -1,38 +1,36 @@
1
- <template>
2
- <VueCal
3
- :id="id"
4
- ref="vueresourcecal"
5
- :disable-views="['years', 'year', 'month', 'week']"
6
- :time-from="8 * 60"
7
- :time-to="22 * 60"
8
- :time-step="60"
9
- active-view="day"
10
- :snap-to-time="15"
11
- hide-view-selector
12
- :events="allevents"
13
- :editable-events="calendarMode"
14
- :split-days="allresources"
15
- :min-split-width="100"
16
-
17
- :sticky-split-labels="true"
18
- sticky-split-labels
19
-
20
- :selected-date="selectedDate"
21
- :drag-to-create-threshold="15"
22
- @event-drag-create="onDragNew"
23
- @event-drop="onEventDrop"
24
- @view-change="viewChange"
25
- @cell-click="onCellClick"
26
- @cell-contextmenu="eventHappend"
27
-
28
- >
29
- <!-- header template -->
30
- <template #split-label="{ split, view }">
31
- <div
32
- @click="clickResource(split._id, split.label)"
33
- class="cursor-pointer"
34
- >
35
- <!-- <div
1
+ <template>
2
+ <VueCal
3
+ :id="id"
4
+ ref="vueresourcecal"
5
+ :disable-views="['years', 'year', 'month', 'week']"
6
+ :time-from="8 * 60"
7
+ :time-to="22 * 60"
8
+ :time-step="60"
9
+ active-view="day"
10
+ :snap-to-time="15"
11
+ hide-view-selector
12
+ :events="allEvents"
13
+ :editable-events="calendarMode"
14
+ :split-days="allresources"
15
+ :min-split-width="100"
16
+ sticky-split-labels
17
+ :selected-date="selectedDate"
18
+ :drag-to-create-threshold="15"
19
+ :on-event-click="onEventClick"
20
+
21
+ @event-drag-create="onDragNew"
22
+ @event-drop="onEventDrop"
23
+ @view-change="viewChange"
24
+ @cell-click="onCellClick"
25
+ @cell-contextmenu="eventHappend"
26
+ >
27
+ <!-- header template -->
28
+ <template #split-label="{ split }">
29
+ <div
30
+ @click="clickResource(split._id, split.label)"
31
+ class="cursor-pointer"
32
+ >
33
+ <!-- <div
36
34
  v-if="resourceType == CalResourceType.teacher && split.email"
37
35
  class="w-full text-center"
38
36
  >
@@ -40,153 +38,173 @@
40
38
  :src="getAvatarLink(split.email, 48)"
41
39
  class="overflow-hidden object-cover rounded-full border-2 border-white dark:border-gray-700 shadow"
42
40
  /> -->
43
- <div>{{ split.displayName }} <span v-if="split._id == '?'" class="pi pi-plus"></span></div>
44
- <!-- </div>
45
- <div v-else>{{ split.displayName }}</div> -->
46
-
41
+ <div>
42
+ {{ split.displayName }}
43
+ <span v-if="split._id == '?'" class="pi pi-plus"></span>
47
44
  </div>
48
- </template>
45
+ <!-- </div>
46
+ <div v-else>{{ split.displayName }}</div> -->
47
+ </div>
48
+ </template>
49
49
 
50
- <!-- event template -->
51
- <!-- @contextmenu="onRightClick($event, event)" -->
52
- <template #event="{ event, view }">
53
- <div
54
- @click="onRightClick($event,event)"
55
- class="cursor-pointer"
56
- >
57
- <slot name="default" :event="<CalEventType<T>>event">
58
- <div>{{ event.title }}</div>
59
- <div>{{ event.start }}</div>
60
- <div>{{ event.end }}</div>
61
- </slot>
62
- </div>
63
- </template>
64
- </VueCal>
50
+ <!-- event template -->
51
+ <!-- @contextmenu="onRightClick($event, event)" -->
52
+ <template #event="{ event }">
53
+ <div class="cursor-pointer h-full">
54
+ <slot name="default" :event="<CalEventType<T>>event">
55
+ <div>{{ event.title }}</div>
56
+ <div>{{ event.start }}</div>
57
+ <div>{{ event.end }}</div>
58
+ </slot>
59
+ </div>
60
+ </template>
61
+ </VueCal>
65
62
  </template>
66
63
  <script setup lang="ts" generic="T">
67
64
  /**
68
- * This file was automatically generated by simpleapp generator during initialization.
65
+ * This file was automatically generated by simpleapp generator during initialization.
69
66
  * IT IS NOT CHANGABLE
70
67
  * last change 2024-02-22
71
68
  * author: Ks Tan
72
69
  */
73
70
 
74
- import "vue-cal/dist/vuecal.css";
71
+
75
72
  import VueCal, { Event, SplitDaysAttributes } from "vue-cal";
76
- import { CalEventType,CalViewClickSlotEvent,CalResource,CalResourceType,RelocateEvent } from '~/types'
73
+ import {
74
+ CalEventType,
75
+ CalViewClickSlotEvent,
76
+ CalResource,
77
+ CalResourceType,
78
+ RelocateEvent,
79
+ } from "~/types";
77
80
  import { emit } from "process";
78
- import moment from 'moment'
79
- const timezoneoffset = new Date().getTimezoneOffset()
80
- const eventsdata = ref<CalEventType<T>[]>()
81
- const vueresourcecal = ref()
82
- const emits = defineEmits(['eventRghtClick','eventClick','eventDrop','eventDragNew','viewChange','resourceClick','slotClick'])
81
+ import moment from "moment";
82
+ const timezoneoffset = new Date().getTimezoneOffset();
83
+ const eventsdata = ref<CalEventType<T>[]>();
84
+ const vueresourcecal = ref();
85
+ const emits = defineEmits([
86
+ "eventRightClick",
87
+ "eventClick",
88
+ "eventDrop",
89
+ "eventDragNew",
90
+ "viewChange",
91
+ "resourceClick",
92
+ "slotClick",
93
+ ]);
83
94
  const props = defineProps<{
84
- id:string
85
- items:CalEventType<T>[]
86
- resources:CalResource[]
87
- resourceType:CalResourceType
88
- }>()
89
- const selectedDate = defineModel<Date>()
90
- const selectedSchedule = ref<CalResource>();
91
-
95
+ id: string;
96
+ items: CalEventType<T>[];
97
+ resources: CalResource[];
98
+ resourceType: CalResourceType;
99
+ }>();
100
+ const selectedDate = defineModel<Date>();
101
+ const selectedSchedule = ref<CalEventType<T>>();
102
+ const allEvents = ref<CalEventType[]>([]);
92
103
 
104
+ const mapEvents = () => {
105
+ allEvents.value = props.items.map((item) => {
106
+ if (item.start instanceof Date)
107
+ item.start = item.start
108
+ .addMinutes(timezoneoffset)
109
+ .format("YYYY-MM-DD HH:mm");
110
+ if (item.end instanceof Date)
111
+ item.end = item.end.addMinutes(timezoneoffset).format("YYYY-MM-DD HH:mm");
112
+ if (!item.split) item.split = "?";
113
+ return item;
114
+ });
115
+ };
93
116
 
94
- const allevents = computed(()=>{
117
+ const eventHappend = (e: any) => {
118
+ console.log("eventHappend", e);
119
+ // alert("event happend")
120
+ };
121
+ const viewChange = (e: any) => {
122
+ selectedDate.value = e.startDate;
123
+ emits("viewChange", e);
124
+ };
125
+ const allresources = computed(() => {
126
+ const tmplist = props.resources.map((r) => {
127
+ if (!r.id) r.id = r._id;
128
+ if (r.hide === undefined) r.hide = false;
129
+ if (!r.displayName) r.displayName = r.label;
130
+ return r;
131
+ });
132
+ tmplist.push({
133
+ _id: "?",
134
+ id: "?",
135
+ hide: false,
136
+ label: t("unknown"),
137
+ displayName: t("unknown"),
138
+ code: "",
139
+ email: "",
140
+ });
141
+ return tmplist;
142
+ });
143
+ const onCellClick = async (e: CalViewClickSlotEvent) => {
144
+ const date = e.date;
145
+ date.setHours(date.getHours() + Math.floor(date.getMinutes() / 60));
146
+ date.setMinutes(0, 0, 0); // Resets also seconds and milliseconds
95
147
 
96
- const list = props.items.map(item=>{
97
- if(item.start instanceof Date) item.start =item.start.addMinutes(timezoneoffset).format('YYYY-MM-DD HH:mm')
98
- if(item.end instanceof Date) item.end = item.end.addMinutes(timezoneoffset).format('YYYY-MM-DD HH:mm')
99
- if(!item.split) item.split='?'
100
- return item
101
- })
102
- return list
103
- })
104
- const eventHappend = (e:any)=>{
105
- console.log("event happen eee",e)
106
- // alert("event happend")
107
- }
108
- const viewChange = (e:any)=>{
109
- console.log("calendar view change",e)
110
- selectedDate.value=e.startDate
111
- // endDate : Sat Feb 17 2024 23:59:59 GMT+0800 (Malaysia Time) {}
112
- // events : []
113
- // startDate : Sat Feb 17 2024 00:00:00 GMT+0800 (Malaysia Time) {}
114
- // view : "day"
115
- emits('viewChange',e)
116
- }
117
- const allresources = computed(()=>{
118
- const tmplist = props.resources.map(r=>{
119
- if(!r.id) r.id =r._id
120
- if(r.hide===undefined) r.hide=false
121
- if(!r.displayName) r.displayName=r.label
122
- return r
123
- })
124
- tmplist.push({
125
- _id:'?',
126
- id:'?',
127
- hide:false,
128
- label:t('unknown'),
129
- displayName:t('unknown'),
130
- code:'',
131
- email:'',
132
- })
133
- return tmplist
134
- })
135
- const onCellClick = async(e:CalViewClickSlotEvent)=>{
136
- const date =e.date
137
- date.setHours(date.getHours() + Math.floor(date.getMinutes()/60));
138
- date.setMinutes(0, 0, 0); // Resets also seconds and milliseconds
139
-
140
-
141
- const newevent:CalEventType<T> = {
142
- id: 'new',
143
- start: date,
144
- end: date.addHours(1),
145
- class: 'nostudent',
146
- title: t('new'),
147
- // content?: string | undefined;
148
- split: e.split,
149
- data: {} as T
150
- }
151
- // emits('slotClick',e)
152
- emits('eventDragNew',newevent)
153
- }
154
- const onEventDrop = async (relocateData: RelocateEvent<T>)=>{
155
- emits('eventDrop', relocateData)
156
- }
157
- const clickResource = async (splitid:string, splitlabel:string)=> emits('resourceClick', splitid,splitlabel)
158
- const onDragNew = (e: CalEventType<T>)=> emits('eventDragNew', e)
148
+ const newevent: CalEventType<T> = {
149
+ id: randomUUID(),
150
+ start: date.format("YYYY-MM-DD HH:mm"),
151
+ end: date.addHours(1).format("YYYY-MM-DD HH:mm"),
152
+ class: "nostudent",
153
+ title: t("new"),
154
+ // content?: string | undefined;
155
+ split: e.split,
156
+ data: { _id: randomUUID(), day: "tue" } as T,
157
+ };
158
+ // emits('slotClick',e)
159
+ // console.log("Before add ",allEvents.value)
160
+ allEvents.value.push(newevent);
161
+ setTimeout(() => {
162
+ mapEvents();
163
+ }, 300);
164
+ // console.log("after add ",allEvents.value)
165
+ emits("eventDragNew", newevent);
166
+ };
167
+ const onEventDrop = async (relocateData: RelocateEvent<T>) => {
168
+ emits("eventDrop", relocateData);
169
+ };
170
+ const clickResource = async (splitid: string, splitlabel: string) =>
171
+ emits("resourceClick", splitid, splitlabel);
172
+ const onDragNew = (e: CalEventType<T>) => emits("eventDragNew", e);
159
173
 
160
- const onRightClick = (clickevent: any, scheduledata: any) => {
174
+ const onRightClick = (clickevent: any, scheduledata: CalEventType<T>) => {
161
175
  selectedSchedule.value = scheduledata;
162
- emits('eventRghtClick', clickevent,scheduledata)
176
+ emits("eventRightClick", clickevent, scheduledata);
163
177
  };
164
- const onEventClick = (eventdata: CalResource) => {
178
+ const onEventClick = (eventdata: CalEventType<T>, e:MouseEvent) => {
165
179
  selectedSchedule.value = eventdata;
166
- emits('eventClick',eventdata)
180
+ emits("eventClick", eventdata,e);
181
+ // e.stopPropagation();
167
182
  };
168
183
 
169
- const calendarMode = computed(()=>{
170
-
171
- if(useDevice().isMobile){
172
- return {
173
- title: false,
174
- drag: true,
175
- resize: false,
176
- delete: false,
177
- // create: true,
178
- }
179
- }else{
180
- return {
181
- title: false,
182
- drag: true,
183
- resize: false,
184
- delete: false,
185
- create: true,
186
- }
187
- }
188
-
189
- })
190
-
191
-
192
- </script>
184
+ const calendarMode = computed(() => {
185
+ if (useDevice().isMobile) {
186
+ return {
187
+ title: false,
188
+ drag: true,
189
+ resize: false,
190
+ delete: false,
191
+ // create: true,
192
+ };
193
+ } else {
194
+ return {
195
+ title: false,
196
+ drag: true,
197
+ resize: false,
198
+ delete: false,
199
+ create: true,
200
+ };
201
+ }
202
+ });
203
+ onMounted(() => {
204
+ mapEvents();
205
+ watch(
206
+ () => props.items,
207
+ () => mapEvents(),
208
+ );
209
+ });
210
+ </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <vue-cal
2
+ <VueCal
3
3
  :id="id"
4
4
  class="w-full"
5
5
  hide-view-selector
@@ -20,7 +20,7 @@
20
20
  <div @click="chooseDate(new Date(), true)">{{ t("today") }}</div>
21
21
  </template>
22
22
  <template #cell-content="{ cell, events }">
23
- <div @contextmenu="(mouseevent) => onRightclickDate(mouseevent, cell)">
23
+ <div>
24
24
  <div>
25
25
  <s
26
26
  v-if="dateExists(new Date(cell.formattedDate), alloffdays)"
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
  </div>
44
44
  </template>
45
- </vue-cal>
45
+ </VueCal>
46
46
  </template>
47
47
  <script lang="ts" setup generic="T">
48
48
  /**
@@ -51,7 +51,9 @@
51
51
  * last change 2024-02-22
52
52
  * author: Ks Tan
53
53
  */
54
- import VueCal, { Event, SplitDaysAttributes } from "vue-cal";
54
+ //, { Event, SplitDaysAttributes }
55
+ import VueCal from "vue-cal";
56
+ import "vue-cal/dist/vuecal.css";
55
57
  import {
56
58
  CalEventType,
57
59
  CalRightClickEvent,
@@ -82,9 +84,9 @@ const allevents = computed(() => {
82
84
  const viewChange = (event: CalViewChange) => {
83
85
  viewStatus.value = event;
84
86
  };
85
- const chooseDate = (date1: Date, force?: boolean) => {
87
+ const chooseDate = (date1: Date, force?: boolean) => {
86
88
  if (force || !viewStatus.value || viewStatus.value.view == "month") {
87
- selectedDate.value = date1;
89
+ selectedDate.value = date1;
88
90
  emits("chooseDate", date1);
89
91
  }
90
92
  };
@@ -0,0 +1,174 @@
1
+ <template>
2
+ <div>
3
+ <title v-if="id">{{ data.docNoFormatName ?? data.docNoFormatNo }}</title>
4
+
5
+ <SimpleAppForm #default="o" :document="doc">
6
+ <SimpleAppFormToolBar
7
+ :document="doc"
8
+ @on="actionListener"
9
+ ></SimpleAppFormToolBar>
10
+ <div
11
+ class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 p-2"
12
+ >
13
+ <SimpleAppInput
14
+ :input-type="SimpleAppInputType.autocomplete"
15
+ :setting="o.getField('#/properties/branch')"
16
+ v-model="data.branch"
17
+ />
18
+
19
+ <SimpleAppInput
20
+ :input-type="SimpleAppInputType.text"
21
+ :setting="o.getField('#/properties/docNoFormatNo')"
22
+ v-model="data.docNoFormatNo"
23
+ />
24
+
25
+ <SimpleAppInput
26
+ :input-type="SimpleAppInputType.text"
27
+ :setting="o.getField('#/properties/docNoFormatName')"
28
+ v-model="data.docNoFormatName"
29
+ />
30
+
31
+ <SimpleAppInput
32
+ :input-type="SimpleAppInputType.checkbox"
33
+ :setting="o.getField('#/properties/active')"
34
+ v-model="data.active"
35
+ />
36
+ <SimpleAppInput
37
+ :input-type="SimpleAppInputType.checkbox"
38
+ :setting="o.getField('#/properties/default')"
39
+ v-model="data.default"
40
+ />
41
+
42
+ <SimpleAppInput
43
+ :readonly="!doc.isNew()"
44
+ :input-type="SimpleAppInputType.select"
45
+ :setting="o.getField('#/properties/docNoType')"
46
+ :options="getAllDocFormats().map((item) => item.docType)"
47
+ v-model="data.docNoType"
48
+ />
49
+
50
+ <SimpleAppInput
51
+ :input-type="SimpleAppInputType.text"
52
+ :setting="o.getField('#/properties/docNoPattern')"
53
+ v-model="data.docNoPattern"
54
+ @keyup="updateSample"
55
+ :description="sample"
56
+ v-tooltip="'Examples: PO-[00000], SI{YY}/[000], SI{YYMM}/[000]'"
57
+ />
58
+
59
+ <SimpleAppInput
60
+ :input-type="SimpleAppInputType.number"
61
+ :setting="o.getField('#/properties/nextNumber')"
62
+ v-model="data.nextNumber"
63
+ />
64
+ </div>
65
+ </SimpleAppForm>
66
+ <DebugDocumentData v-model="data" :label="doc.getDocName()" />
67
+ </div>
68
+ </template>
69
+
70
+ <script setup lang="ts">
71
+ /**
72
+ * This file was automatically generated by simpleapp generator.
73
+ * last change 2024-02-16
74
+ * Author: Ks Tan
75
+ */
76
+ import { SimpleAppInputType, FormCrudEvent } from "~/types";
77
+ import { Docnoformat } from "~/simpleapp/generate/types";
78
+ import { DocnoformatDoc } from "~/simpleapp/docs/DocnoformatDoc";
79
+
80
+ const props = defineProps<{
81
+ _id?: string;
82
+ doc?: DocnoformatDoc;
83
+ paras?: Docnoformat;
84
+ }>();
85
+
86
+ const doc = props.doc ?? useNuxtApp().$DocnoformatDoc();
87
+ const data = doc.getReactiveData();
88
+ const sample = ref("");
89
+ const emits = defineEmits(["after"]);
90
+ const id = computed(() => props._id ?? "");
91
+
92
+ /************ start default methods ****************/
93
+
94
+ const newData = () => doc.setNew();
95
+
96
+ const getRecord = async () => {
97
+ if (id.value && id.value != "new") {
98
+ await doc.getById(id.value);
99
+ } else {
100
+ newData();
101
+ }
102
+ };
103
+
104
+ getRecord();
105
+ watch(id, async () => await getRecord());
106
+ /************ end default methods ****************/
107
+
108
+ const actionListener = async (actionName: string) => {
109
+ emits("after", actionName, data.value);
110
+ };
111
+
112
+ onMounted(async () => {
113
+ await actionListener(FormCrudEvent.mount);
114
+ setTimeout(() => {
115
+ updateSample();
116
+ }, 300);
117
+ });
118
+ /************ start api methods ****************/
119
+
120
+ // const runListDocFormats = async () => {
121
+ // const data = {
122
+ // id: id.value,
123
+ // };
124
+ // const result = await doc.runListDocFormats(
125
+ // doctype,
126
+
127
+ // data,
128
+ // );
129
+ // };
130
+ /************ end api methods ****************/
131
+ const updateSample = () => {
132
+ sample.value = "Example: " + previewDocNo();
133
+ };
134
+
135
+ const previewDocNo = (): string => {
136
+ const pattern = data.value.docNoPattern;
137
+ if (pattern) {
138
+ const numberReg: RegExp = /\[(.*?)\]/g;
139
+ const dateReg: RegExp = /\{(.*?)\}/g;
140
+ let newvalue = pattern;
141
+ const numberpattern = pattern.match(numberReg);
142
+ const datepattern = pattern.match(dateReg);
143
+
144
+ if (numberpattern && numberpattern.length > 0) {
145
+ const numberlength = numberpattern[0]
146
+ .replace("[", "")
147
+ .replace("]", "").length;
148
+
149
+ let nextnumber = (data.value.nextNumber ?? 0).toString();
150
+
151
+ const numberdiff = numberlength - nextnumber.length;
152
+
153
+ for (let n = 0; n < numberdiff; n++) {
154
+ nextnumber = "0" + nextnumber;
155
+ }
156
+ newvalue = newvalue.replace(numberpattern[0], nextnumber);
157
+ }
158
+
159
+ if (datepattern && datepattern.length > 0) {
160
+ for (let d = 0; d < datepattern.length; d++) {
161
+ const dpattern = datepattern[d];
162
+ const date = new Date();
163
+ const formatteddate = getDayJs()().format(
164
+ dpattern.replace("{", "").replace("}", ""),
165
+ );
166
+ newvalue = newvalue.replace(dpattern, formatteddate);
167
+ }
168
+ }
169
+ return newvalue;
170
+ } else {
171
+ return "";
172
+ }
173
+ };
174
+ </script>