@neutron.co.id/operasional-interfaces 1.17.19 → 1.17.24

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.
@@ -4,7 +4,7 @@ export function apiUrl() {
4
4
  const parts = cleanUrl.split(".");
5
5
  if (parts.length < 3) {
6
6
  return {
7
- action: "http://localhost:7021"
7
+ action: "http://localhost:7020"
8
8
  };
9
9
  }
10
10
  const isDev = parts[0] === "dev";
@@ -99,6 +99,7 @@ export const config = OfficeInterfaces.define({
99
99
  "SubmissionStaff",
100
100
  "SubmissionSupervisor",
101
101
  "SubmissionWaitingDecision",
102
+ "SubmissionForDecision",
102
103
  // Submission Type
103
104
  "SubmissionTypeCollection",
104
105
  "SubmissionTypeSingle",
@@ -190,6 +190,7 @@ async function generateAttendance() {
190
190
  startedAt: values.value.startedAt,
191
191
  endedAt: values.value.endedAt,
192
192
  delegateNotes: values.value.delegateNotes,
193
+ image: values.value.image,
193
194
  },
194
195
  })
195
196
  .toPromise()
@@ -289,7 +290,7 @@ watch(
289
290
 
290
291
  async function generate() {
291
292
  await generateAttendance()
292
- await getNotified()
293
+ getNotified()
293
294
  await syncOne()
294
295
  }
295
296
 
@@ -151,6 +151,7 @@ async function generateAttendance() {
151
151
  startedAt: values.value.startedAt,
152
152
  endedAt: values.value.endedAt,
153
153
  delegateNotes: values.value.delegateNotes,
154
+ image: values.value.image,
154
155
  },
155
156
  })
156
157
  .toPromise()
@@ -251,7 +252,7 @@ watch(
251
252
 
252
253
  async function generate() {
253
254
  await generateAttendance()
254
- await getNotified()
255
+ getNotified()
255
256
  await syncOne()
256
257
  }
257
258
 
@@ -158,7 +158,7 @@
158
158
  "
159
159
  />
160
160
 
161
- <NeonFields md="grid-cols-2">
161
+ <NeonFields md="grid-cols-3">
162
162
  <OfficeRelation
163
163
  v-model="values"
164
164
  :field="fields.branches"
@@ -188,6 +188,19 @@
188
188
  values.status === 'resolved'
189
189
  "
190
190
  />
191
+ <OfficeRelation
192
+ v-model="values"
193
+ :field="fields.department"
194
+ :is-disabled="
195
+ values.status === 'raised' ||
196
+ values.status === 'processed' ||
197
+ values.status === 'delay' ||
198
+ values.status === 'approved' ||
199
+ values.status === 'monitored' ||
200
+ values.status === 'discontinued' ||
201
+ values.status === 'resolved'
202
+ "
203
+ />
191
204
  </NeonFields>
192
205
 
193
206
  <div class="flex items-right">
@@ -87,7 +87,7 @@
87
87
  "
88
88
  />
89
89
 
90
- <NeonFields md="grid-cols-2">
90
+ <NeonFields md="grid-cols-3">
91
91
  <OfficeRelation
92
92
  v-model="values"
93
93
  :field="fields.branches"
@@ -116,6 +116,19 @@
116
116
  values.status === 'resolved'
117
117
  "
118
118
  />
119
+ <OfficeRelation
120
+ v-model="values"
121
+ :field="fields.department"
122
+ :is-disabled="
123
+ values.status === 'raised' ||
124
+ values.status === 'processed' ||
125
+ values.status === 'delay' ||
126
+ values.status === 'approved' ||
127
+ values.status === 'monitored' ||
128
+ values.status === 'discontinued' ||
129
+ values.status === 'resolved'
130
+ "
131
+ />
119
132
  </NeonFields>
120
133
 
121
134
  <div class="flex items-right">
@@ -52,13 +52,26 @@ const copy = ref({
52
52
  is-disabled
53
53
  />
54
54
 
55
- <NeonFields md="grid-cols-2">
55
+ <NeonFields md="grid-cols-3">
56
56
  <OfficeRelation
57
57
  v-model="values"
58
58
  :field="fields.branches"
59
59
  is-disabled
60
60
  />
61
61
  <OfficeRelation v-model="values" :field="fields.type" is-disabled />
62
+ <OfficeRelation
63
+ v-model="values"
64
+ :field="fields.department"
65
+ :is-disabled="
66
+ values.status === 'raised' ||
67
+ values.status === 'processed' ||
68
+ values.status === 'delay' ||
69
+ values.status === 'approved' ||
70
+ values.status === 'monitored' ||
71
+ values.status === 'discontinued' ||
72
+ values.status === 'resolved'
73
+ "
74
+ />
62
75
  </NeonFields>
63
76
 
64
77
  <div class="flex items-right">
@@ -0,0 +1,384 @@
1
+ <script setup lang="ts">
2
+ import { NeonSingle, useSingle } from '@neon.id/context'
3
+ import { NeonField, NeonFields, NeonForm } from '@neon.id/form'
4
+ import { NeonButton, NeonDivider } from '@neon.id/interfaces'
5
+ import { OfficeRelation, OfficeTab, OfficeTabs } from '@neon.id/office'
6
+ import { Query } from '@neon.id/query'
7
+ import { useOperasional } from '../../../common/providers/operasional'
8
+ import { computed, watch, ref } from 'vue'
9
+ import { PromiseUtil } from '@neon.id/utils/promise'
10
+ import type {
11
+ TPersonaliaSubmissionModel,
12
+ Schema,
13
+ } from '@neutron.co.id/personalia-models'
14
+ import { SubmissionDetailTab, SubmissionDocumentTab } from './sections'
15
+
16
+ const {
17
+ fields,
18
+ id,
19
+ initialValues,
20
+ values,
21
+ isLoading,
22
+ isChanged,
23
+ isReady,
24
+ isMain,
25
+ isNew,
26
+ syncOne,
27
+ saveOne,
28
+ discardChanges,
29
+ executeOne,
30
+ } = useSingle<Schema.Submission, TPersonaliaSubmissionModel>()
31
+
32
+ const { staff } = useOperasional()
33
+
34
+ const branchOptions = computed(() => {
35
+ return {
36
+ filter: [
37
+ {
38
+ handle: '_id',
39
+ operator: 'in',
40
+ value: staff.value?.branchIds,
41
+ },
42
+ ],
43
+ }
44
+ })
45
+
46
+ const typeOptions = computed(() => {
47
+ return {
48
+ filter: [
49
+ {
50
+ handle: 'branchIds',
51
+ operator: 'in',
52
+ value: values.value.branchIds,
53
+ },
54
+ ],
55
+ }
56
+ })
57
+
58
+ const submissionStaffOptions = computed(() => {
59
+ return {
60
+ filter: [
61
+ {
62
+ handle: 'branchIds',
63
+ operator: 'in',
64
+ value: values.value.branchIds,
65
+ },
66
+ ],
67
+ }
68
+ })
69
+
70
+ const roleRaiseStaffOptions = computed(() => {
71
+ return {
72
+ filter: [
73
+ {
74
+ handle: 'virtualRoleIds',
75
+ operator: 'eq',
76
+ value: '646a42976af710fe3618af9a',
77
+ },
78
+ ],
79
+ }
80
+ })
81
+
82
+ const roleDecideStaffOptions = computed(() => {
83
+ return {
84
+ filter: [
85
+ {
86
+ handle: 'virtualRoleIds',
87
+ operator: 'eq',
88
+ value: '646a43106af710fe3618afca',
89
+ },
90
+ ],
91
+ }
92
+ })
93
+
94
+ const staffId = staff.value?.id || ''
95
+ const branchIds = staff.value?.branchIds || []
96
+ const branchDisplay = staff.value?.branches || []
97
+
98
+ watch(isNew, setDefaultValues, { immediate: true })
99
+
100
+ async function setDefaultValues() {
101
+ if (!isNew.value) return
102
+ await PromiseUtil.wait(500)
103
+
104
+ const defaultValues = {
105
+ submissionStaffIds: [staffId],
106
+ submissionStaffs: [{ id: staffId, flag: staff.value?.flag }],
107
+ branchIds: [branchIds[0]],
108
+ branches: [branchDisplay[0]],
109
+ preparedAt: new Date().toISOString(),
110
+ } satisfies Schema.Submission
111
+
112
+ values.value.preparedAt = defaultValues.preparedAt
113
+
114
+ if (staff?.value?.id) {
115
+ values.value.submissionStaffIds = defaultValues.submissionStaffIds
116
+ values.value.submissionStaffs = defaultValues.submissionStaffs
117
+ }
118
+
119
+ if (staff?.value?.branchIds) {
120
+ values.value.branchIds = defaultValues.branchIds
121
+ values.value.branches = defaultValues.branches
122
+ }
123
+ }
124
+
125
+ const goBack = () => {
126
+ const referrer = document.referrer || ''
127
+ if (referrer.includes('/neu-pengajuan')) {
128
+ window.history.back()
129
+ } else {
130
+ window.location.href = '/pengajuan/waiting-decision-submission'
131
+ }
132
+ }
133
+
134
+ const syncDelay = async () => {
135
+ await executeOne('delaySubmission', {
136
+ submissionId: id.value,
137
+ staffId: staff.value?.id,
138
+ })
139
+ await syncOne()
140
+ goBack()
141
+ }
142
+
143
+ const syncApproved = async () => {
144
+ await executeOne('approvedSubmission', {
145
+ submissionId: id.value,
146
+ staffId: staff.value?.id,
147
+ })
148
+ await syncOne()
149
+ goBack()
150
+ }
151
+
152
+ const copy = ref({
153
+ staff: `${window.location.origin}/pengajuan/staff-submission/${id.value}`,
154
+ decision: `${window.location.origin}/pengajuan/decision-submission/${id.value}`,
155
+ raise: `${window.location.origin}/pengajuan/audit-submission/${id.value}`,
156
+ followUp: `${window.location.origin}/pengajuan/follow-up-submission/${id.value}`,
157
+ })
158
+ </script>
159
+
160
+ <template>
161
+ <NeonSingle class="neu-submission-single">
162
+ <OfficeTabs :use-url="isMain">
163
+ <!-- DOKUMEN -->
164
+ <SubmissionDocumentTab
165
+ toolbar="side"
166
+ :is-readonly="
167
+ values.status === 'raised' ||
168
+ values.status === 'delay' ||
169
+ values.status === 'approved' ||
170
+ values.status === 'monitored' ||
171
+ values.status === 'discontinued' ||
172
+ values.status === 'resolved'
173
+ "
174
+ />
175
+ <OfficeTab handle="info" icon="circle-info" title="Info">
176
+ <NeonForm
177
+ handle="info"
178
+ :initial-values="initialValues"
179
+ :is-loading="isLoading"
180
+ :is-changed="isChanged"
181
+ use-unsaved
182
+ @cancel="discardChanges"
183
+ @submit="saveOne"
184
+ >
185
+ <NeonField
186
+ v-model="values.title"
187
+ v-bind="fields.title"
188
+ :is-disabled="
189
+ values.status === 'raised' ||
190
+ values.status === 'processed' ||
191
+ values.status === 'delay' ||
192
+ values.status === 'approved' ||
193
+ values.status === 'monitored' ||
194
+ values.status === 'discontinued' ||
195
+ values.status === 'resolved'
196
+ "
197
+ />
198
+
199
+ <NeonField
200
+ v-model="values.nominal"
201
+ v-bind="fields.nominal"
202
+ :is-disabled="
203
+ values.status === 'raised' ||
204
+ values.status === 'processed' ||
205
+ values.status === 'delay' ||
206
+ values.status === 'approved' ||
207
+ values.status === 'monitored' ||
208
+ values.status === 'discontinued' ||
209
+ values.status === 'resolved'
210
+ "
211
+ />
212
+
213
+ <NeonFields md="grid-cols-2">
214
+ <OfficeRelation
215
+ v-model="values"
216
+ :field="fields.branches"
217
+ :query="Query.define(branchOptions)"
218
+ :is-disabled="
219
+ values.status === 'raised' ||
220
+ values.status === 'processed' ||
221
+ values.status === 'delay' ||
222
+ values.status === 'approved' ||
223
+ values.status === 'monitored' ||
224
+ values.status === 'discontinued' ||
225
+ values.status === 'resolved'
226
+ "
227
+ />
228
+ <OfficeRelation
229
+ v-model="values"
230
+ :field="fields.department"
231
+ :is-disabled="
232
+ values.status === 'raised' ||
233
+ values.status === 'processed' ||
234
+ values.status === 'delay' ||
235
+ values.status === 'approved' ||
236
+ values.status === 'monitored' ||
237
+ values.status === 'discontinued' ||
238
+ values.status === 'resolved'
239
+ "
240
+ />
241
+ </NeonFields>
242
+ <OfficeRelation
243
+ v-model="values"
244
+ :field="fields.type"
245
+ :query="Query.define(typeOptions)"
246
+ :is-disabled="
247
+ values.status === 'raised' ||
248
+ values.status === 'processed' ||
249
+ values.status === 'delay' ||
250
+ values.status === 'approved' ||
251
+ values.status === 'monitored' ||
252
+ values.status === 'discontinued' ||
253
+ values.status === 'resolved'
254
+ "
255
+ />
256
+
257
+ <div class="flex items-right">
258
+ <div class="flex-grow">
259
+ <NeonFields class="flex-1">
260
+ <OfficeRelation
261
+ v-model="values"
262
+ :field="fields.submissionStaffs"
263
+ :query="Query.define(submissionStaffOptions)"
264
+ :is-disabled="
265
+ values.status === 'raised' ||
266
+ values.status === 'processed' ||
267
+ values.status === 'delay' ||
268
+ values.status === 'approved' ||
269
+ values.status === 'monitored' ||
270
+ values.status === 'discontinued' ||
271
+ values.status === 'resolved'
272
+ "
273
+ />
274
+ </NeonFields>
275
+ </div>
276
+ <div class="ml-2 flex items-end pb-1">
277
+ <NeonCopy :size="'sm'" :value="copy.staff" />
278
+ </div>
279
+ </div>
280
+
281
+ <div class="flex items-right">
282
+ <div class="flex-grow">
283
+ <NeonFields class="flex-1">
284
+ <OfficeRelation
285
+ v-model="values"
286
+ :field="fields.raiseStaffs"
287
+ :query="Query.define(roleRaiseStaffOptions)"
288
+ :is-disabled="
289
+ values.status === 'raised' ||
290
+ values.status === 'processed' ||
291
+ values.status === 'delay' ||
292
+ values.status === 'approved' ||
293
+ values.status === 'monitored' ||
294
+ values.status === 'discontinued' ||
295
+ values.status === 'resolved'
296
+ "
297
+ />
298
+ </NeonFields>
299
+ </div>
300
+ <div class="ml-2 flex items-end pb-1">
301
+ <NeonCopy :size="'sm'" :value="copy.raise" />
302
+ </div>
303
+ </div>
304
+
305
+ <div class="flex items-right">
306
+ <div class="flex-grow">
307
+ <NeonFields class="flex-1">
308
+ <OfficeRelation
309
+ v-model="values"
310
+ :field="fields.decideStaffs"
311
+ :query="Query.define(roleDecideStaffOptions)"
312
+ :is-disabled="
313
+ values.status === 'raised' ||
314
+ values.status === 'processed' ||
315
+ values.status === 'delay' ||
316
+ values.status === 'approved' ||
317
+ values.status === 'monitored' ||
318
+ values.status === 'discontinued' ||
319
+ values.status === 'resolved'
320
+ "
321
+ />
322
+ </NeonFields>
323
+ </div>
324
+ <div class="ml-2 flex items-end pb-1">
325
+ <NeonCopy :size="'sm'" :value="copy.decision" />
326
+ </div>
327
+ </div>
328
+
329
+ <div class="flex items-right">
330
+ <div class="flex-grow">
331
+ <NeonFields class="flex-1">
332
+ <OfficeRelation
333
+ v-model="values"
334
+ :field="fields.followUpStaffs"
335
+ />
336
+ </NeonFields>
337
+ </div>
338
+ <div class="ml-2 flex items-end pb-1">
339
+ <NeonCopy :size="'sm'" :value="copy.followUp" />
340
+ </div>
341
+ </div>
342
+
343
+ <!-- <NeonField
344
+ v-model="values.specifications"
345
+ v-bind="fields.specifications"
346
+ :is-disabled="
347
+ values.status === 'raised' ||
348
+ values.status === 'processed' ||
349
+ values.status === 'delay' ||
350
+ values.status === 'approved' ||
351
+ values.status === 'monitored' ||
352
+ values.status === 'discontinued' ||
353
+ values.status === 'resolved'
354
+ "
355
+ /> -->
356
+
357
+ <NeonField
358
+ v-model="values.preparedAt"
359
+ v-bind="fields.preparedAt"
360
+ is-disabled
361
+ />
362
+
363
+ <NeonField
364
+ v-model="values.raisedAt"
365
+ v-bind="fields.raisedAt"
366
+ is-disabled
367
+ />
368
+
369
+ <NeonField
370
+ v-model="values.processedAt"
371
+ v-bind="fields.processedAt"
372
+ is-disabled
373
+ />
374
+ </NeonForm>
375
+ </OfficeTab>
376
+ </OfficeTabs>
377
+ </NeonSingle>
378
+ </template>
379
+
380
+ <style scoped>
381
+ .neu-submission-single {
382
+ @apply block;
383
+ }
384
+ </style>
@@ -47,9 +47,10 @@ const copy = ref({
47
47
  <NeonField v-model="values.nominal" v-bind="fields.nominal" />
48
48
  <NeonField v-model="values.status" v-bind="fields.status" />
49
49
 
50
- <NeonFields md="grid-cols-2">
50
+ <NeonFields md="grid-cols-3">
51
51
  <OfficeRelation v-model="values" :field="fields.branches" />
52
52
  <OfficeRelation v-model="values" :field="fields.type" />
53
+ <OfficeRelation v-model="values" :field="fields.department" />
53
54
  </NeonFields>
54
55
 
55
56
  <div class="flex items-right">
@@ -99,6 +99,19 @@
99
99
  />
100
100
  </NeonFields>
101
101
 
102
+ <OfficeRelation
103
+ v-model="values"
104
+ :field="fields.department"
105
+ :is-disabled="
106
+ values.statusStaff === 'raised' ||
107
+ values.statusStaff === 'processed' ||
108
+ values.statusStaff === 'approved' ||
109
+ values.statusStaff === 'monitored' ||
110
+ values.statusStaff === 'discontinued' ||
111
+ values.statusStaff === 'resolved'
112
+ "
113
+ />
114
+
102
115
  <div class="flex items-right">
103
116
  <div class="flex-grow">
104
117
  <NeonFields class="flex-1">
@@ -52,13 +52,26 @@ const copy = ref({
52
52
  is-disabled
53
53
  />
54
54
 
55
- <NeonFields md="grid-cols-2">
55
+ <NeonFields md="grid-cols-3">
56
56
  <OfficeRelation
57
57
  v-model="values"
58
58
  :field="fields.branches"
59
59
  is-disabled
60
60
  />
61
61
  <OfficeRelation v-model="values" :field="fields.type" is-disabled />
62
+ <OfficeRelation
63
+ v-model="values"
64
+ :field="fields.department"
65
+ :is-disabled="
66
+ values.status === 'raised' ||
67
+ values.status === 'processed' ||
68
+ values.status === 'delay' ||
69
+ values.status === 'approved' ||
70
+ values.status === 'monitored' ||
71
+ values.status === 'discontinued' ||
72
+ values.status === 'resolved'
73
+ "
74
+ />
62
75
  </NeonFields>
63
76
 
64
77
  <div class="flex items-right">
@@ -268,6 +268,20 @@ const copy = ref({
268
268
  />
269
269
  </NeonFields>
270
270
 
271
+ <OfficeRelation
272
+ v-model="values"
273
+ :field="fields.department"
274
+ :is-disabled="
275
+ values.status === 'raised' ||
276
+ values.status === 'processed' ||
277
+ values.status === 'delay' ||
278
+ values.status === 'approved' ||
279
+ values.status === 'monitored' ||
280
+ values.status === 'discontinued' ||
281
+ values.status === 'resolved'
282
+ "
283
+ />
284
+
271
285
  <div class="flex items-right">
272
286
  <div class="flex-grow">
273
287
  <NeonFields class="flex-1">
@@ -3,6 +3,7 @@ export { default as SubmissionFollowUp } from './SubmissionFollowUp.vue';
3
3
  export { default as SubmissionAudit } from './SubmissionAudit.vue';
4
4
  export { default as SubmissionDecision } from './SubmissionDecision.vue';
5
5
  export { default as SubmissionWaitingDecision } from './SubmissionWaitingDecision.vue';
6
+ export { default as SubmissionForDecision } from './SubmissionForDecision.vue';
6
7
  export { default as SubmissionSupervisor } from './SubmissionSupervisor.vue';
7
8
  export * from './SubmissionCollection';
8
9
  export * from './SubmissionSingle';
@@ -3,6 +3,7 @@ export { default as SubmissionFollowUp } from "./SubmissionFollowUp.vue";
3
3
  export { default as SubmissionAudit } from "./SubmissionAudit.vue";
4
4
  export { default as SubmissionDecision } from "./SubmissionDecision.vue";
5
5
  export { default as SubmissionWaitingDecision } from "./SubmissionWaitingDecision.vue";
6
+ export { default as SubmissionForDecision } from "./SubmissionForDecision.vue";
6
7
  export { default as SubmissionSupervisor } from "./SubmissionSupervisor.vue";
7
8
  export * from "./SubmissionCollection/index.mjs";
8
9
  export * from "./SubmissionSingle/index.mjs";
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
2
+ export default _default;
@@ -3,6 +3,7 @@ export { default as SubmissionFollowUp } from './SubmissionFollowUp.vue';
3
3
  export { default as SubmissionAudit } from './SubmissionAudit.vue';
4
4
  export { default as SubmissionDecision } from './SubmissionDecision.vue';
5
5
  export { default as SubmissionWaitingDecision } from './SubmissionWaitingDecision.vue';
6
+ export { default as SubmissionForDecision } from './SubmissionForDecision.vue';
6
7
  export { default as SubmissionSupervisor } from './SubmissionSupervisor.vue';
7
8
  export * from './SubmissionCollection';
8
9
  export * from './SubmissionSingle';