@simitgroup/simpleapp-generator 1.2.7 → 1.3.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.
- package/dist/buildinschemas/organization.d.ts.map +1 -1
- package/dist/buildinschemas/organization.js +3 -1
- package/dist/buildinschemas/organization.js.map +1 -1
- package/dist/framework.d.ts.map +1 -1
- package/dist/framework.js +4 -9
- package/dist/framework.js.map +1 -1
- package/dist/generate.js +14 -14
- package/dist/generate.js.map +1 -1
- package/package.json +1 -1
- package/src/buildinschemas/organization.ts +3 -1
- package/src/framework.ts +5 -9
- package/src/generate.ts +17 -16
- package/templates/basic/nest/controller.ts.eta +17 -0
- package/templates/basic/nest/default.ts.eta +6 -2
- package/templates/basic/nuxt/default.ts.eta +10 -6
- package/templates/basic/nuxt/pages.[id].vue.eta +9 -7
- package/templates/basic/nuxt/pages.form.vue.eta +16 -36
- package/templates/basic/nuxt/pages.landing.vue.eta +42 -35
- package/templates/basic/nuxt/pages.viewer.vue.eta +4 -6
- package/templates/nest/.env._eta +0 -1
- package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +14 -2
- package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +32 -18
- package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +76 -13
- package/templates/nuxt/app.vue.eta +7 -3
- package/templates/nuxt/assets/css/calendar.css._eta +21 -8
- package/templates/nuxt/assets/css/style.css._eta +17 -10
- package/templates/nuxt/assets/primevue/passthrough.ts._eta +44 -22
- package/templates/nuxt/components/button/ButtonDefault.vue._eta +1 -2
- package/templates/nuxt/components/button/ButtonMultiple.vue._eta +21 -0
- package/templates/nuxt/components/calendar/CalendarByResource.vue.eta +29 -8
- package/templates/nuxt/components/debug/DebugDocumentData.vue.eta +3 -4
- package/templates/nuxt/components/event/EventDocumentViewer.vue._eta +75 -65
- package/templates/nuxt/components/event/EventNotification.vue._eta +23 -2
- package/templates/nuxt/components/form/FormBranch.vue.eta +83 -0
- package/templates/nuxt/components/form/readme.md.eta +1 -0
- package/templates/nuxt/components/header/HeaderBar.vue._eta +9 -9
- package/templates/nuxt/components/header/HeaderBreadcrumb.vue.eta +2 -2
- package/templates/nuxt/components/header/button/HeaderButtonMenuPicker.vue._eta +16 -22
- package/templates/nuxt/components/header/button/HeaderButtonProfile.vue.eta +29 -46
- package/templates/nuxt/components/list/ListDocument.vue.eta +25 -0
- package/templates/nuxt/components/list/ListDocumentTable.vue.eta +77 -0
- package/templates/nuxt/components/list/ListView.vue.eta +129 -58
- package/templates/nuxt/components/mobile/MobileToolbar.vue.eta +10 -0
- package/templates/nuxt/components/overlay/OverlaySideBarCrud.vue.eta +21 -0
- package/templates/nuxt/components/overlay/OverlayViewer.vue.eta +20 -0
- package/templates/nuxt/components/page/PageDocList.vue.eta +170 -0
- package/templates/nuxt/components/renderer/RendererBoolean.vue.eta +8 -4
- package/templates/nuxt/components/renderer/RendererDate.vue.eta +4 -4
- package/templates/nuxt/components/renderer/RendererLink.vue.eta +12 -20
- package/templates/nuxt/components/renderer/RendererMoney.vue.eta +10 -2
- package/templates/nuxt/components/renderer/RendererViewer.vue.eta +27 -21
- package/templates/nuxt/components/simpleApp/SimpleAppAutocomplete.vue.eta +202 -150
- package/templates/nuxt/components/simpleApp/SimpleAppDocumentNo.vue.eta +7 -1
- package/templates/nuxt/components/simpleApp/SimpleAppFieldContainer.vue.eta +112 -101
- package/templates/nuxt/components/simpleApp/SimpleAppFormToolBar.vue.eta +183 -91
- package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +383 -246
- package/templates/nuxt/components/simpleApp/SimpleAppInputTable.vue.eta +4 -3
- package/templates/nuxt/components/table/TableDocuments.vue.eta +3 -3
- package/templates/nuxt/components/text/TextDanger.vue._eta +5 -0
- package/templates/nuxt/components/text/TextSubtitle.vue._eta +5 -0
- package/templates/nuxt/components/text/TextTitle.vue._eta +5 -0
- package/templates/nuxt/components/user/UserProfileListItem.vue.eta +2 -2
- package/templates/nuxt/composables/date.generate.ts.eta +21 -0
- package/templates/nuxt/composables/goTo.generate.ts.eta +1 -0
- package/templates/nuxt/composables/stringHelper.generate.ts.eta +0 -5
- package/templates/nuxt/error.vue._eta +3 -3
- package/templates/nuxt/i18n.config.ts.eta +1 -1
- package/templates/nuxt/lang/en.ts.eta +16 -0
- package/templates/nuxt/layouts/default.vue._eta +34 -34
- package/templates/nuxt/layouts/loginlayout.vue._eta +3 -0
- package/templates/nuxt/layouts/mobile.vue._eta +52 -0
- package/templates/nuxt/nuxt.config.ts._eta +28 -22
- package/templates/nuxt/pages/[xorg]/organization/[id].vue.eta +39 -0
- package/templates/nuxt/pages/[xorg]/organization/new.vue.eta +30 -143
- package/templates/nuxt/pages/[xorg]/organization/viewer.vue.eta +3 -0
- package/templates/nuxt/pages/[xorg]/organization.vue.eta +81 -127
- package/templates/nuxt/pages/[xorg]/user/[id].vue.eta +40 -0
- package/templates/nuxt/pages/[xorg]/user/form.vue.eta +329 -0
- package/templates/nuxt/pages/[xorg]/user/index.vue.eta +37 -0
- package/templates/nuxt/pages/[xorg]/{organization/[id]/branches/[bid].vue → user/new.vue.eta} +10 -4
- package/templates/nuxt/pages/[xorg]/user/viewer.vue.eta +30 -0
- package/templates/nuxt/pages/[xorg]/{user.vue._eta → user.vue.eta} +88 -78
- package/templates/nuxt/pages/login.vue._eta +34 -0
- package/templates/nuxt/pages/profile.vue.eta +12 -3
- package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +36 -35
- package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +6 -0
- package/templates/nuxt/server/api/[xorg]/[...].ts.eta +7 -40
- package/templates/nuxt/server/api/profile/[...].ts.eta +3 -32
- package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +42 -3
- package/templates/nuxt/types/calendar.ts.eta +8 -1
- package/templates/nuxt/types/documentlist.ts.eta +0 -9
- package/templates/nuxt/types/events.ts.eta +1 -0
- package/templates/nuxt/types/others.ts.eta +4 -1
- package/templates/nuxt/types/simpleappinput.ts.eta +12 -2
- package/templates/nuxt/types/user.ts.eta +2 -0
- package/templates/project/lang/default._json +9 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/templates/nuxt/components/docPage/DocPageList.vue.eta +0 -125
- package/templates/nuxt/lang/en.ts._eta +0 -6
- package/templates/nuxt/pages/[xorg]/organization/[bid].vue.eta +0 -14
- package/templates/nuxt/pages/[xorg]/organization/[id]/branches/new.vue +0 -149
- package/templates/nuxt/pages/[xorg]/organization/[id]/index.vue.eta +0 -1
- package/templates/nuxt/pages/[xorg]/user/[id].vue._eta +0 -6
- package/templates/nuxt/pages/[xorg]/user/index.vue._eta +0 -302
- package/templates/nuxt/pages/login.vue.eta +0 -30
- /package/templates/nuxt/lang/{df.ts.eta → df.ts.etaxxxx} +0 -0
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="grid grid-cols-2">
|
|
3
|
-
<Card>
|
|
4
|
-
<template #header>
|
|
5
|
-
<h1 class="font-bold">{{ usertitle }}</h1>
|
|
6
|
-
</template>
|
|
7
|
-
<template #content>
|
|
8
|
-
<SimpleAppForm :document="userdoc" #default="o">
|
|
9
|
-
<div class="flex flex-col gap-2">
|
|
10
|
-
<SimpleAppInput
|
|
11
|
-
:input-type="SimpleAppInputType.text"
|
|
12
|
-
autofocus
|
|
13
|
-
:setting="o.getField('#/properties/fullName')"
|
|
14
|
-
v-model="userdata.fullName"
|
|
15
|
-
/>
|
|
16
|
-
|
|
17
|
-
<SimpleAppInput
|
|
18
|
-
:input-type="SimpleAppInputType.text"
|
|
19
|
-
type="email"
|
|
20
|
-
:setting="o.getField('#/properties/email')"
|
|
21
|
-
v-model="userdata.email"
|
|
22
|
-
/>
|
|
23
|
-
|
|
24
|
-
<SimpleAppInput
|
|
25
|
-
:input-type="SimpleAppInputType.checkbox"
|
|
26
|
-
:setting="o.getField('#/properties/active')"
|
|
27
|
-
v-model="userdata.active"
|
|
28
|
-
/>
|
|
29
|
-
<SimpleAppInput
|
|
30
|
-
:input-type="SimpleAppInputType.textarea"
|
|
31
|
-
:setting="o.getField('#/properties/description')"
|
|
32
|
-
v-model="userdata.description"
|
|
33
|
-
/>
|
|
34
|
-
<div>
|
|
35
|
-
<Button
|
|
36
|
-
@click="saveUser"
|
|
37
|
-
class="btn btn-primary"
|
|
38
|
-
>Save</Button
|
|
39
|
-
>
|
|
40
|
-
<Button
|
|
41
|
-
v-if="canPerform('user', 'delete')"
|
|
42
|
-
@click="deleteUser"
|
|
43
|
-
class="btn btn-danger"
|
|
44
|
-
>Delete</Button
|
|
45
|
-
>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
</SimpleAppForm>
|
|
49
|
-
</template>
|
|
50
|
-
</Card>
|
|
51
|
-
|
|
52
|
-
<Card class="m-2">
|
|
53
|
-
<template #header>
|
|
54
|
-
<div class="relative w-full ...">
|
|
55
|
-
<h1 class="font-bold">{{ permissiontitle }}</h1>
|
|
56
|
-
<div class="absolute top-0 right-0 h-16 w-16 ...">
|
|
57
|
-
<UserButtonPermissionInfo></UserButtonPermissionInfo>
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
</template>
|
|
61
|
-
<template #content>
|
|
62
|
-
<BlockUI :blocked="blockscreen">
|
|
63
|
-
<!-- <div class="text-right m mr-2">
|
|
64
|
-
|
|
65
|
-
</div> -->
|
|
66
|
-
|
|
67
|
-
<div class="">
|
|
68
|
-
<Card
|
|
69
|
-
v-if="currentpermissions.length > 0"
|
|
70
|
-
v-for="o in orglist"
|
|
71
|
-
class="m-2"
|
|
72
|
-
>
|
|
73
|
-
<template #title>{{ o.orgName }}</template>
|
|
74
|
-
<template #content>
|
|
75
|
-
<table class="w w-full">
|
|
76
|
-
<tr v-for="(b, index) in branchlist">
|
|
77
|
-
<td v-if="checkBranchInOrg(o, b)" class="text-center">
|
|
78
|
-
{{ b.branchCode }}
|
|
79
|
-
</td>
|
|
80
|
-
<td
|
|
81
|
-
v-if="checkBranchInOrg(o, b)"
|
|
82
|
-
class="text-center flex flex-row"
|
|
83
|
-
>
|
|
84
|
-
<div>
|
|
85
|
-
<SelectButton
|
|
86
|
-
v-model="currentpermissions[index]['group']"
|
|
87
|
-
:options="grouplist"
|
|
88
|
-
option-label="label"
|
|
89
|
-
option-value="value"
|
|
90
|
-
@change="applyPermission(currentpermissions[index])"
|
|
91
|
-
></SelectButton>
|
|
92
|
-
</div>
|
|
93
|
-
</td>
|
|
94
|
-
</tr>
|
|
95
|
-
</table>
|
|
96
|
-
</template>
|
|
97
|
-
</Card>
|
|
98
|
-
</div>
|
|
99
|
-
</BlockUI>
|
|
100
|
-
</template>
|
|
101
|
-
</Card>
|
|
102
|
-
</div>
|
|
103
|
-
</template>
|
|
104
|
-
<script setup lang="ts">
|
|
105
|
-
// import Card from "primevue/card";
|
|
106
|
-
import {SimpleAppInputType} from "~/types"
|
|
107
|
-
import { Permission, User } from "../../../simpleapp/generate/openapi/api";
|
|
108
|
-
import _ from "lodash";
|
|
109
|
-
import SelectButton from "primevue/selectbutton";
|
|
110
|
-
import { SearchBody, EventType } from "~/types";
|
|
111
|
-
|
|
112
|
-
import {
|
|
113
|
-
UserListItem,
|
|
114
|
-
NotificationStatus,
|
|
115
|
-
Notification,
|
|
116
|
-
BranchListItem,
|
|
117
|
-
OrgListItem,
|
|
118
|
-
PermissionListItem,
|
|
119
|
-
} from "~/types";
|
|
120
|
-
const {
|
|
121
|
-
$event,
|
|
122
|
-
$PermissionDoc,
|
|
123
|
-
$OrganizationDoc,
|
|
124
|
-
$BranchDoc,
|
|
125
|
-
$UserDoc,
|
|
126
|
-
// $InvitationDoc,
|
|
127
|
-
} = useNuxtApp();
|
|
128
|
-
const userdoc = $UserDoc();
|
|
129
|
-
const userdata = userdoc.getReactiveData();
|
|
130
|
-
const currentpermissions = ref<Permission[]>([]);
|
|
131
|
-
currentpermissions.value = [];
|
|
132
|
-
const blockscreen = ref(false);
|
|
133
|
-
const permlist = ref<PermissionListItem[]>([]);
|
|
134
|
-
// const userlist = ref<UserListItem[]>([]);
|
|
135
|
-
const orglist = ref<OrgListItem[]>([]);
|
|
136
|
-
const branchlist = ref<BranchListItem[]>([]);
|
|
137
|
-
const permdoc = $PermissionDoc();
|
|
138
|
-
const orgdoc = $OrganizationDoc();
|
|
139
|
-
const branchdoc = $BranchDoc();
|
|
140
|
-
const permissiontitle = "Permission Information";
|
|
141
|
-
const usertitle = "User Information";
|
|
142
|
-
const grouplist = getAllGroups().map((item) => {
|
|
143
|
-
return { value: item, label: _.capitalize(item) };
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* delete user
|
|
148
|
-
* @param user:User object
|
|
149
|
-
*/
|
|
150
|
-
const deleteUser = async (user: any) => {
|
|
151
|
-
await userdoc.delete(String(userdata.value._id));
|
|
152
|
-
//NotificationEvent
|
|
153
|
-
$event("RefreshUser", "");
|
|
154
|
-
goTo("user");
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
/**********applPermission ******/
|
|
158
|
-
/**
|
|
159
|
-
* apply permission:
|
|
160
|
-
* _id:'', group:'' => skip
|
|
161
|
-
* _id: '', group:'something' => create
|
|
162
|
-
* _id:'something', 'group':'something' => update
|
|
163
|
-
* _id:'something', group:'' => remove
|
|
164
|
-
*/
|
|
165
|
-
const applyPermission = async (d: Permission) => {
|
|
166
|
-
let result;
|
|
167
|
-
// console.log("apply permission", d);
|
|
168
|
-
blockscreen.value = true;
|
|
169
|
-
d._id = String(d._id ?? "");
|
|
170
|
-
d.group = String(d.group ?? "");
|
|
171
|
-
permdoc.setNew();
|
|
172
|
-
const data = permdoc.getReactiveData();
|
|
173
|
-
data.value = {
|
|
174
|
-
orgId: d.orgId,
|
|
175
|
-
branchId: d.branchId,
|
|
176
|
-
group: d.group,
|
|
177
|
-
userId: d.userId,
|
|
178
|
-
};
|
|
179
|
-
// console.log("apply permission", data.value);
|
|
180
|
-
if (!d._id && !d.group) {
|
|
181
|
-
//no changes
|
|
182
|
-
} else if (!d._id && d.group) {
|
|
183
|
-
result = await permdoc.create();
|
|
184
|
-
} else if (d._id && d.group) {
|
|
185
|
-
data.value = d;
|
|
186
|
-
result = await permdoc.update();
|
|
187
|
-
} else if (d._id && !d.group) {
|
|
188
|
-
d.group = "";
|
|
189
|
-
data.value = d;
|
|
190
|
-
result = await permdoc.delete(d._id);
|
|
191
|
-
} else {
|
|
192
|
-
console.warn("unknown apply permission", result);
|
|
193
|
-
}
|
|
194
|
-
// refreshList(false);
|
|
195
|
-
onSelectUser(String(d.userId));
|
|
196
|
-
blockscreen.value = false;
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
const checkBranchInOrg = (org: OrgListItem, branch: BranchListItem) => {
|
|
200
|
-
return org.orgId === branch.orgId;
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
const saveUser = async () => {
|
|
204
|
-
await userdoc.update();
|
|
205
|
-
$event("RefreshUser", "");
|
|
206
|
-
onSelectUser(String(userdata.value._id));
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
const onSelectUser = async (userId: string) => {
|
|
210
|
-
console.log("onSelectUser", userId);
|
|
211
|
-
// .addRoute()
|
|
212
|
-
// const user: UserListItem = { ...menuitem };
|
|
213
|
-
const orgsearchbody: SearchBody = {
|
|
214
|
-
fields: ["orgId", "orgCode", "orgName", "active"],
|
|
215
|
-
};
|
|
216
|
-
const branchsearchbody: SearchBody = {
|
|
217
|
-
fields: ["orgId", "branchId", "branchCode", "branchName", "active"],
|
|
218
|
-
};
|
|
219
|
-
const permsearchbody: SearchBody = {
|
|
220
|
-
filter: { userId: userId },
|
|
221
|
-
fields: [
|
|
222
|
-
"uid",
|
|
223
|
-
"userId",
|
|
224
|
-
"branchId",
|
|
225
|
-
"tenantId",
|
|
226
|
-
"orgId",
|
|
227
|
-
"active",
|
|
228
|
-
"group",
|
|
229
|
-
"created",
|
|
230
|
-
],
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
orglist.value = await orgdoc.search(orgsearchbody);
|
|
234
|
-
branchlist.value = await branchdoc.search(branchsearchbody);
|
|
235
|
-
permlist.value = await permdoc.search(permsearchbody);
|
|
236
|
-
await userdoc.getById(userId);
|
|
237
|
-
// console.log("orglist.value", orglist.value);
|
|
238
|
-
// console.log("branchlist.value", branchlist.value);
|
|
239
|
-
// console.log("permlist.value", permlist.value);
|
|
240
|
-
// selected.value = String(user._id);
|
|
241
|
-
|
|
242
|
-
// activeuser.value = user.fullName;
|
|
243
|
-
//sso id from keycloak
|
|
244
|
-
// const uid = String(user.uid);
|
|
245
|
-
//_id from mongodb
|
|
246
|
-
|
|
247
|
-
currentpermissions.value = [];
|
|
248
|
-
|
|
249
|
-
for (let i = 0; i < branchlist.value.length; i++) {
|
|
250
|
-
const b = branchlist.value[i];
|
|
251
|
-
const permdata = getPermssionData(userId, b.branchId);
|
|
252
|
-
const tmp: Permission = {
|
|
253
|
-
_id: permdata?._id,
|
|
254
|
-
userId: userId,
|
|
255
|
-
tenantId: b.tenantId,
|
|
256
|
-
orgId: b.orgId,
|
|
257
|
-
branchId: b.branchId,
|
|
258
|
-
group: permdata.group,
|
|
259
|
-
};
|
|
260
|
-
currentpermissions.value.push(tmp);
|
|
261
|
-
}
|
|
262
|
-
// console.log("currentpermissions", currentpermissions);
|
|
263
|
-
blockscreen.value = false;
|
|
264
|
-
};
|
|
265
|
-
/**
|
|
266
|
-
* prepare dataobj (existing or empty dummy data) for each branch permission
|
|
267
|
-
* @param uid
|
|
268
|
-
* @param branchId
|
|
269
|
-
*/
|
|
270
|
-
const getPermssionData = (userId: string, branchId: number) => {
|
|
271
|
-
// console.log("getPermssionData", userId, branchId);
|
|
272
|
-
const result = permlist.value.find((item: any) => {
|
|
273
|
-
// console.log(
|
|
274
|
-
// item.userId,
|
|
275
|
-
// "== ",
|
|
276
|
-
// userId,
|
|
277
|
-
// " &&",
|
|
278
|
-
// item.branchId,
|
|
279
|
-
// "==",
|
|
280
|
-
// branchId,
|
|
281
|
-
// );
|
|
282
|
-
return item.userId == userId && item.branchId == branchId;
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
// console.log("permlist.value.",permlist.value,result)
|
|
286
|
-
let pm: Permission = {
|
|
287
|
-
_id: result?._id ?? "",
|
|
288
|
-
orgId: result?.orgId ?? 0,
|
|
289
|
-
tenantId: result?.tenantId ?? 0,
|
|
290
|
-
branchId: branchId,
|
|
291
|
-
userId: userId,
|
|
292
|
-
group: result?.group ?? "",
|
|
293
|
-
};
|
|
294
|
-
return pm;
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
onMounted(() => {
|
|
298
|
-
const id = String(useRoute().params.id);
|
|
299
|
-
console.log("id", id);
|
|
300
|
-
onSelectUser(id);
|
|
301
|
-
});
|
|
302
|
-
</script>
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<NuxtPage />
|
|
3
|
-
</template>
|
|
4
|
-
<script setup lang="ts">
|
|
5
|
-
/**
|
|
6
|
-
* This file was automatically generated by simpleapp generator. Every
|
|
7
|
-
* MODIFICATION OVERRIDE BY GENERATEOR
|
|
8
|
-
* last change 2024-01-22
|
|
9
|
-
* Author: Ks Tan
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
definePageMeta({
|
|
13
|
-
name: 'Login',
|
|
14
|
-
auth: false,
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
const route = useRoute();
|
|
18
|
-
const { signIn } = useAuth()
|
|
19
|
-
const callbackUrl = ref('')
|
|
20
|
-
onMounted(async () => {
|
|
21
|
-
if(route.query.callbackUrl) {
|
|
22
|
-
callbackUrl.value = <string>route.query.callbackUrl;
|
|
23
|
-
}else{
|
|
24
|
-
callbackUrl.value = '/'
|
|
25
|
-
}
|
|
26
|
-
callbackUrl.value = decodeURIComponent(callbackUrl.value)
|
|
27
|
-
console.log("callbackUrlcallbackUrlcallbackUrl",callbackUrl.value)
|
|
28
|
-
await signIn('keycloak', { callbackUrl: callbackUrl.value })
|
|
29
|
-
})
|
|
30
|
-
</script>
|
|
File without changes
|