@things-factory/organization 10.1.165 → 10.1.168
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-client/component/approval-line-edit.d.ts +54 -0
- package/dist-client/component/approval-line-edit.js +66 -0
- package/dist-client/component/approval-line-edit.js.map +1 -0
- package/dist-client/component/approval-line-items-editor.d.ts +3 -0
- package/dist-client/component/approval-line-items-editor.js +27 -35
- package/dist-client/component/approval-line-items-editor.js.map +1 -1
- package/dist-client/component/approval-line-selector.d.ts +2 -1
- package/dist-client/component/approval-line-selector.js +8 -2
- package/dist-client/component/approval-line-selector.js.map +1 -1
- package/dist-client/pages/approval-line/common-approval-line-templates-page.js +4 -0
- package/dist-client/pages/approval-line/common-approval-line-templates-page.js.map +1 -1
- package/dist-client/pages/approval-line/my-approval-line-templates-page.js +4 -0
- package/dist-client/pages/approval-line/my-approval-line-templates-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/tests/approval-line-edit.test.ts +78 -0
- package/tests/approval-line-step-fields.test.ts +108 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ApprovalLineItem } from '../types/approval-line';
|
|
2
|
+
/**
|
|
3
|
+
* What the approval line editor decides, kept out of the element so it can be tested.
|
|
4
|
+
*
|
|
5
|
+
* The editor is a Lit element over a grist, and neither loads under this repo's jest. Its decisions
|
|
6
|
+
* are small but each one lost a line without an error: a deleted row came back on confirm, a copied
|
|
7
|
+
* reference step turned into an approver, and confirming the copy window with nothing picked emptied
|
|
8
|
+
* the line. They live here so each has a test.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* The participation choices, once - the select offers these and the cell draws them.
|
|
12
|
+
*
|
|
13
|
+
* Empty is approval: lines saved before the column existed have nothing there and must keep reading
|
|
14
|
+
* as approvals (ApprovalLineItem.participation).
|
|
15
|
+
*/
|
|
16
|
+
export declare const PARTICIPATION_CHOICES: {
|
|
17
|
+
key: string;
|
|
18
|
+
value: string;
|
|
19
|
+
}[];
|
|
20
|
+
/**
|
|
21
|
+
* The choice a step shows in the participation cell.
|
|
22
|
+
*
|
|
23
|
+
* The cell cannot leave this to the grist's select renderer: that renderer returns an empty string
|
|
24
|
+
* for a null or undefined value before it looks at the options, and an approval is stored as
|
|
25
|
+
* undefined (storedParticipation). Every approval step drew a blank cell, so the option `''` labelled
|
|
26
|
+
* 「결재」 was never seen.
|
|
27
|
+
*/
|
|
28
|
+
export declare function participationChoice(item?: {
|
|
29
|
+
participation?: string | null;
|
|
30
|
+
}): {
|
|
31
|
+
key: string;
|
|
32
|
+
value: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* The line the editor hands on, read off the rows on screen.
|
|
36
|
+
*
|
|
37
|
+
* Only these fields are kept. A field added to the row and not here is edited on screen and never
|
|
38
|
+
* saved - with no error. A row with no type is one that was added and not filled.
|
|
39
|
+
*/
|
|
40
|
+
export declare function lineFromRows(rows?: any[] | null): ApprovalLineItem[];
|
|
41
|
+
/**
|
|
42
|
+
* The line after "copy from" closes.
|
|
43
|
+
*
|
|
44
|
+
* Three answers, kept apart: `undefined` is "nothing picked" and leaves the line alone; `null` is the
|
|
45
|
+
* window's own 「비우기」 and empties it; a picked line replaces it. The window used to send
|
|
46
|
+
* `undefined` for both of the first two, and the editor read that as empty - confirming with nothing
|
|
47
|
+
* picked cleared the line being edited.
|
|
48
|
+
*
|
|
49
|
+
* A picked line goes through the same reading as the rows, so its reference steps keep their
|
|
50
|
+
* participation (the API spells it `Reference`) and their notify point.
|
|
51
|
+
*/
|
|
52
|
+
export declare function lineAfterCopy(current: ApprovalLineItem[] | undefined, picked?: {
|
|
53
|
+
model?: ApprovalLineItem[] | null;
|
|
54
|
+
} | null): ApprovalLineItem[] | undefined;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { storedParticipation } from '../types/approval-line';
|
|
2
|
+
/**
|
|
3
|
+
* What the approval line editor decides, kept out of the element so it can be tested.
|
|
4
|
+
*
|
|
5
|
+
* The editor is a Lit element over a grist, and neither loads under this repo's jest. Its decisions
|
|
6
|
+
* are small but each one lost a line without an error: a deleted row came back on confirm, a copied
|
|
7
|
+
* reference step turned into an approver, and confirming the copy window with nothing picked emptied
|
|
8
|
+
* the line. They live here so each has a test.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* The participation choices, once - the select offers these and the cell draws them.
|
|
12
|
+
*
|
|
13
|
+
* Empty is approval: lines saved before the column existed have nothing there and must keep reading
|
|
14
|
+
* as approvals (ApprovalLineItem.participation).
|
|
15
|
+
*/
|
|
16
|
+
export const PARTICIPATION_CHOICES = [
|
|
17
|
+
{ key: 'label.participation-approval', value: '' },
|
|
18
|
+
{ key: 'label.participation-reference', value: 'reference' }
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* The choice a step shows in the participation cell.
|
|
22
|
+
*
|
|
23
|
+
* The cell cannot leave this to the grist's select renderer: that renderer returns an empty string
|
|
24
|
+
* for a null or undefined value before it looks at the options, and an approval is stored as
|
|
25
|
+
* undefined (storedParticipation). Every approval step drew a blank cell, so the option `''` labelled
|
|
26
|
+
* 「결재」 was never seen.
|
|
27
|
+
*/
|
|
28
|
+
export function participationChoice(item) {
|
|
29
|
+
const value = storedParticipation(item) ?? '';
|
|
30
|
+
return PARTICIPATION_CHOICES.find(one => one.value === value) || PARTICIPATION_CHOICES[0];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The line the editor hands on, read off the rows on screen.
|
|
34
|
+
*
|
|
35
|
+
* Only these fields are kept. A field added to the row and not here is edited on screen and never
|
|
36
|
+
* saved - with no error. A row with no type is one that was added and not filled.
|
|
37
|
+
*/
|
|
38
|
+
export function lineFromRows(rows) {
|
|
39
|
+
return (rows || [])
|
|
40
|
+
.map(row => ({
|
|
41
|
+
type: row?.type,
|
|
42
|
+
approver: row?.approver,
|
|
43
|
+
participation: storedParticipation(row),
|
|
44
|
+
/* An empty string and 0 are both "notify at once", so neither is stored. */
|
|
45
|
+
notifyAfter: row?.notifyAfter ? Number(row.notifyAfter) : undefined
|
|
46
|
+
}))
|
|
47
|
+
.filter(item => item.type);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The line after "copy from" closes.
|
|
51
|
+
*
|
|
52
|
+
* Three answers, kept apart: `undefined` is "nothing picked" and leaves the line alone; `null` is the
|
|
53
|
+
* window's own 「비우기」 and empties it; a picked line replaces it. The window used to send
|
|
54
|
+
* `undefined` for both of the first two, and the editor read that as empty - confirming with nothing
|
|
55
|
+
* picked cleared the line being edited.
|
|
56
|
+
*
|
|
57
|
+
* A picked line goes through the same reading as the rows, so its reference steps keep their
|
|
58
|
+
* participation (the API spells it `Reference`) and their notify point.
|
|
59
|
+
*/
|
|
60
|
+
export function lineAfterCopy(current, picked) {
|
|
61
|
+
if (picked === undefined) {
|
|
62
|
+
return current;
|
|
63
|
+
}
|
|
64
|
+
return lineFromRows(picked?.model);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=approval-line-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-line-edit.js","sourceRoot":"","sources":["../../client/component/approval-line-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE9E;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,EAAE,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,EAAE,EAAE;IAClD,EAAE,GAAG,EAAE,+BAA+B,EAAE,KAAK,EAAE,WAAW,EAAE;CAC7D,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAwC;IAC1E,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAW,CAAC,IAAI,EAAE,CAAA;IAEpD,OAAO,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAA;AAC3F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC9C,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;SAChB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,EAAE,IAAI;QACf,QAAQ,EAAE,GAAG,EAAE,QAAQ;QACvB,aAAa,EAAE,mBAAmB,CAAC,GAAG,CAAC;QACvC,4EAA4E;QAC5E,WAAW,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;KACpE,CAAC,CAAC;SACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAuC,EACvC,MAAqD;IAErD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACpC,CAAC","sourcesContent":["import { ApprovalLineItem, storedParticipation } from '../types/approval-line'\n\n/**\n * What the approval line editor decides, kept out of the element so it can be tested.\n *\n * The editor is a Lit element over a grist, and neither loads under this repo's jest. Its decisions\n * are small but each one lost a line without an error: a deleted row came back on confirm, a copied\n * reference step turned into an approver, and confirming the copy window with nothing picked emptied\n * the line. They live here so each has a test.\n */\n\n/**\n * The participation choices, once - the select offers these and the cell draws them.\n *\n * Empty is approval: lines saved before the column existed have nothing there and must keep reading\n * as approvals (ApprovalLineItem.participation).\n */\nexport const PARTICIPATION_CHOICES = [\n { key: 'label.participation-approval', value: '' },\n { key: 'label.participation-reference', value: 'reference' }\n]\n\n/**\n * The choice a step shows in the participation cell.\n *\n * The cell cannot leave this to the grist's select renderer: that renderer returns an empty string\n * for a null or undefined value before it looks at the options, and an approval is stored as\n * undefined (storedParticipation). Every approval step drew a blank cell, so the option `''` labelled\n * 「결재」 was never seen.\n */\nexport function participationChoice(item?: { participation?: string | null }) {\n const value = storedParticipation(item as any) ?? ''\n\n return PARTICIPATION_CHOICES.find(one => one.value === value) || PARTICIPATION_CHOICES[0]\n}\n\n/**\n * The line the editor hands on, read off the rows on screen.\n *\n * Only these fields are kept. A field added to the row and not here is edited on screen and never\n * saved - with no error. A row with no type is one that was added and not filled.\n */\nexport function lineFromRows(rows?: any[] | null): ApprovalLineItem[] {\n return (rows || [])\n .map(row => ({\n type: row?.type,\n approver: row?.approver,\n participation: storedParticipation(row),\n /* An empty string and 0 are both \"notify at once\", so neither is stored. */\n notifyAfter: row?.notifyAfter ? Number(row.notifyAfter) : undefined\n }))\n .filter(item => item.type)\n}\n\n/**\n * The line after \"copy from\" closes.\n *\n * Three answers, kept apart: `undefined` is \"nothing picked\" and leaves the line alone; `null` is the\n * window's own 「비우기」 and empties it; a picked line replaces it. The window used to send\n * `undefined` for both of the first two, and the editor read that as empty - confirming with nothing\n * picked cleared the line being edited.\n *\n * A picked line goes through the same reading as the rows, so its reference steps keep their\n * participation (the API spells it `Reference`) and their notify point.\n */\nexport function lineAfterCopy(\n current: ApprovalLineItem[] | undefined,\n picked?: { model?: ApprovalLineItem[] | null } | null\n): ApprovalLineItem[] | undefined {\n if (picked === undefined) {\n return current\n }\n\n return lineFromRows(picked?.model)\n}\n"]}
|
|
@@ -30,6 +30,9 @@ export declare class ApprovalLineItemsEditor extends ApprovalLineItemsEditor_bas
|
|
|
30
30
|
}[];
|
|
31
31
|
};
|
|
32
32
|
deleteDataItems(): Promise<void>;
|
|
33
|
+
/** 화면의 줄을 결재선으로 읽어 넘긴다 — 고치기와 지우기가 같은 길로 간다. */
|
|
34
|
+
private takeRows;
|
|
35
|
+
private announce;
|
|
33
36
|
private countSavedLines;
|
|
34
37
|
openSelector(): void;
|
|
35
38
|
}
|
|
@@ -11,6 +11,7 @@ import { openPopup } from '@operato/layout';
|
|
|
11
11
|
import gql from 'graphql-tag';
|
|
12
12
|
import { client } from '@operato/graphql';
|
|
13
13
|
import { ApprovalLineView } from './approval-line-view';
|
|
14
|
+
import { lineAfterCopy, lineFromRows, participationChoice, PARTICIPATION_CHOICES } from './approval-line-edit';
|
|
14
15
|
import { offersCopyFrom } from './copy-from';
|
|
15
16
|
import { isReferenceStep, storedParticipation } from '../types/approval-line';
|
|
16
17
|
/**
|
|
@@ -48,28 +49,7 @@ let ApprovalLineItemsEditor = class ApprovalLineItemsEditor extends localize(i18
|
|
|
48
49
|
.mode=${isMobileDevice() ? 'CARD' : 'GRID'}
|
|
49
50
|
.config=${this.gristConfig}
|
|
50
51
|
.fetchHandler=${this.fetchHandler.bind(this)}
|
|
51
|
-
@record-change=${
|
|
52
|
-
this.value = (this.grist?._data.records || [])
|
|
53
|
-
.map(v => {
|
|
54
|
-
/*
|
|
55
|
-
* 여기서 고른 칸만 저장된다. 칸을 더하고 이 줄을 안 고치면 **화면에서는 고쳐지는데
|
|
56
|
-
* 저장이 안 된다** — 오류도 나지 않는다.
|
|
57
|
-
*/
|
|
58
|
-
return {
|
|
59
|
-
type: v.type,
|
|
60
|
-
approver: v.approver,
|
|
61
|
-
participation: storedParticipation(v),
|
|
62
|
-
/* 빈 글자와 0 을 가른다. 0 은 「상신 즉시」와 같은 뜻이라 비운다. */
|
|
63
|
-
notifyAfter: v.notifyAfter ? Number(v.notifyAfter) : undefined
|
|
64
|
-
};
|
|
65
|
-
})
|
|
66
|
-
.filter(v => v.type);
|
|
67
|
-
this.dispatchEvent(new CustomEvent('change', {
|
|
68
|
-
bubbles: true,
|
|
69
|
-
composed: true,
|
|
70
|
-
detail: this.value
|
|
71
|
-
}));
|
|
72
|
-
}}
|
|
52
|
+
@record-change=${() => this.takeRows()}
|
|
73
53
|
>
|
|
74
54
|
<div slot="headroom" class="header">
|
|
75
55
|
<div class="actions">
|
|
@@ -127,18 +107,17 @@ let ApprovalLineItemsEditor = class ApprovalLineItemsEditor extends localize(i18
|
|
|
127
107
|
* 어떤 자격으로 서는가 — 결재냐 참조냐.
|
|
128
108
|
*
|
|
129
109
|
* 빈 값이 「결재」다. 지금 도는 결재선에는 이 칸이 없어서, 그 항목들이 전부 결재자로 읽혀야
|
|
130
|
-
* 거동이 안 바뀐다. 그래서 옵션의 첫 자리를 빈 값으로 두고 그 문구를 「결재」로
|
|
131
|
-
*
|
|
110
|
+
* 거동이 안 바뀐다. 그래서 옵션의 첫 자리를 빈 값으로 두고 그 문구를 「결재」로 그린다.
|
|
111
|
+
* 그리는 것은 이 칸이 한다 — 그리스트의 select 렌더러는 값이 비면 옵션을 보기도 전에 빈
|
|
112
|
+
* 글자를 내서, 결재 항목이 전부 빈칸으로 보였다(§ approval-line-edit 의 participationChoice).
|
|
132
113
|
*/
|
|
133
114
|
type: 'select',
|
|
134
115
|
name: 'participation',
|
|
135
116
|
header: i18next.t('field.participation'),
|
|
136
117
|
record: {
|
|
137
118
|
editable: true,
|
|
138
|
-
options:
|
|
139
|
-
|
|
140
|
-
{ display: i18next.t('label.participation-reference'), value: 'reference' }
|
|
141
|
-
]
|
|
119
|
+
options: PARTICIPATION_CHOICES.map(one => ({ display: i18next.t(one.key), value: one.value })),
|
|
120
|
+
renderer: (value, column, record) => html `<span>${i18next.t(participationChoice(record).key)}</span>`
|
|
142
121
|
},
|
|
143
122
|
width: 100
|
|
144
123
|
},
|
|
@@ -330,8 +309,25 @@ let ApprovalLineItemsEditor = class ApprovalLineItemsEditor extends localize(i18
|
|
|
330
309
|
}
|
|
331
310
|
async deleteDataItems() {
|
|
332
311
|
this.grist?.deleteSelectedRecords(false);
|
|
312
|
+
/*
|
|
313
|
+
* 지우기는 record-change 를 안 낸다. 여기서 읽지 않으면 줄은 화면에서 사라지는데 팝업이 받은
|
|
314
|
+
* 값은 지우기 전 그대로라, 확인을 누르면 지운 줄이 되살아난다.
|
|
315
|
+
*/
|
|
316
|
+
this.takeRows();
|
|
317
|
+
}
|
|
318
|
+
/** 화면의 줄을 결재선으로 읽어 넘긴다 — 고치기와 지우기가 같은 길로 간다. */
|
|
319
|
+
takeRows() {
|
|
320
|
+
this.value = lineFromRows(this.grist?._data?.records);
|
|
321
|
+
this.announce();
|
|
322
|
+
}
|
|
323
|
+
announce() {
|
|
324
|
+
this.dispatchEvent(new CustomEvent('change', {
|
|
325
|
+
bubbles: true,
|
|
326
|
+
composed: true,
|
|
327
|
+
detail: this.value
|
|
328
|
+
}));
|
|
333
329
|
}
|
|
334
|
-
/*
|
|
330
|
+
/* 선택기가 읽는 목록과 같은 질의다 — 수만 센다. */
|
|
335
331
|
async countSavedLines() {
|
|
336
332
|
try {
|
|
337
333
|
const response = await client.query({
|
|
@@ -354,13 +350,9 @@ let ApprovalLineItemsEditor = class ApprovalLineItemsEditor extends localize(i18
|
|
|
354
350
|
delete this.popup;
|
|
355
351
|
}
|
|
356
352
|
const confirmCallback = async (selected) => {
|
|
357
|
-
this.value =
|
|
353
|
+
this.value = lineAfterCopy(this.value, selected);
|
|
358
354
|
this.grist.fetch();
|
|
359
|
-
this.
|
|
360
|
-
bubbles: true,
|
|
361
|
-
composed: true,
|
|
362
|
-
detail: this.value
|
|
363
|
-
}));
|
|
355
|
+
this.announce();
|
|
364
356
|
};
|
|
365
357
|
this.popup = openPopup(html ` <approval-line-selector .confirmCallback=${confirmCallback.bind(this)}></approval-line-selector> `, {
|
|
366
358
|
backdrop: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-line-items-editor.js","sourceRoot":"","sources":["../../client/component/approval-line-items-editor.ts"],"names":[],"mappings":";AAAA,OAAO,sBAAsB,CAAA;AAC7B,OAAO,0BAA0B,CAAA;AAEjC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,SAAS,EAAe,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAExD,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAkC,eAAe,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE7G;;GAEG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;aACjE,WAAM,GAAG;QACd,kBAAkB;QAClB,qBAAqB;QACrB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;KAmBF;KACF,AAvBY,CAuBZ;IAaD,MAAM;QACJ,OAAO,IAAI,CAAA;mCACoB,IAAI,CAAC,KAAK;;gBAE7B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;kBAChC,IAAI,CAAC,WAAW;wBACV,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;yBAC3B,CAAC,CAAC,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,CAAE,IAAI,CAAC,KAAa,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;iBACpD,GAAG,CAAC,CAAC,CAAC,EAAE;gBACP;;;mBAGG;gBACH,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC;oBACrC,6CAA6C;oBAC7C,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC/D,CAAA;YACH,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAEtB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACxB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI,CAAC,KAAK;aACnB,CAAC,CACH,CAAA;QACH,CAAC;;;;cAIK,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/B,CAAC,CAAC,IAAI,CAAA,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;mDACf,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;0BACtD;YACZ,CAAC,CAAC,EAAE;;oCAEkB,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE;yCACvB,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;;;;KAK9D,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,IAAI,CAAC,WAAW,GAAG;YACjB,IAAI,EAAE;gBACJ,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC;aAC9C;YACD,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC9D,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE;gBAC1C;oBACE,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,QAAQ;oBACpB,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE;wBACR,KAAK,EAAE,SAAS;qBACjB;iBACF;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,QAAQ;oBACpB,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE;wBACR,KAAK,EAAE,WAAW;qBACnB;iBACF;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;oBACzD,MAAM,EAAE;wBACN,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC;qBAC1F;oBACD,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE;;;;;;uBAMG;oBACH,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;oBACxC,MAAM,EAAE;wBACN,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;4BACjE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;yBAC5E;qBACF;oBACD,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE;;;;;;;;uBAQG;oBACH,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;oBACvC,MAAM,EAAE;wBACN,QAAQ,EAAE,CAAC,KAAU,EAAE,MAAW,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC;wBAC9D,KAAK,EAAE,MAAM;wBACb,QAAQ,EAAE,CAAC,KAAU,EAAE,MAAW,EAAE,MAAW,EAAE,EAAE;4BACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;gCAC7B,OAAO,IAAI,CAAA,sBAAsB,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,SAAS,CAAA;4BACzF,CAAC;4BAED,OAAO,KAAK;gCACV,CAAC,CAAC,IAAI,CAAA,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gCAC3D,CAAC,CAAC,IAAI,CAAA,uBAAuB,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAA;wBAC9E,CAAC;qBACF;oBACD,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;oBACnC,MAAM,EAAE;wBACN,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BACtD,IAAI,OAAO,GAAG,EAAE,CAAA;4BAChB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gCACpB,KAAK,UAAU;oCACb,OAAO,GAAG;wCACR,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;wCACvC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;wCACrC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;wCAC3E,SAAS,EAAE,WAAW;wCACtB,OAAO,EAAE;4CACP,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;4CAC5B;gDACE,IAAI,EAAE,WAAW;gDACjB,KAAK,EAAE,GAAG;gDACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE;gDACzD,MAAM,EAAE,QAAQ;gDAChB,QAAQ,EAAE,IAAI;6CACf;4CACD;gDACE,IAAI,EAAE,MAAM;gDACZ,KAAK,EAAE,GAAG;gDACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE;gDACnD,MAAM,EAAE,QAAQ;gDAChB,QAAQ,EAAE,IAAI;6CACf;4CACD;gDACE,IAAI,EAAE,OAAO;gDACb,KAAK,EAAE,GAAG;gDACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE;gDACpD,MAAM,EAAE,QAAQ;gDAChB,QAAQ,EAAE,IAAI;6CACf;4CACD;gDACE,IAAI,EAAE,MAAM;gDACZ,IAAI,EAAE,MAAM;gDACZ,KAAK,EAAE,GAAG;gDACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE;gDAC7E,MAAM,EAAE;oDACN,QAAQ,EAAE,KAAK;oDACf,QAAQ,EAAE,eAAe;iDAC1B;6CACF;4CACD;gDACE,IAAI,EAAE,MAAM;gDACZ,IAAI,EAAE,aAAa;gDACnB,KAAK,EAAE,GAAG;gDACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE;gDAC3D,MAAM,EAAE;oDACN,QAAQ,EAAE,KAAK;oDACf,QAAQ,EAAE,cAAc;iDACzB;6CACF;4CACD;gDACE,IAAI,EAAE,MAAM;gDACZ,IAAI,EAAE,mBAAmB;gDACzB,KAAK,EAAE,GAAG;gDACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE;gDACjE,MAAM,EAAE;oDACN,QAAQ,EAAE,KAAK;oDACf,QAAQ,EAAE,oBAAoB;iDAC/B;6CACF;4CACD;gDACE,IAAI,EAAE,MAAM;gDACZ,IAAI,EAAE,SAAS;gDACf,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE;gDACvD,KAAK,EAAE,GAAG;6CACX;yCACF;wCACD,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE;wCAC3D,UAAU,EAAE,IAAI;wCAChB,SAAS,EAAE,MAAM;wCACjB,gBAAgB,EAAE,WAAW;qCAC9B,CAAA;oCACD,MAAK;gCACP,KAAK,YAAY;oCACf,OAAO,GAAG;wCACR,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;wCACzC,SAAS,EAAE,aAAa;wCACxB,OAAO,EAAE;4CACP,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;4CAC5B;gDACE,IAAI,EAAE,WAAW;gDACjB,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE;gDACzD,MAAM,EAAE,QAAQ;6CACjB;4CACD,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;yCACxF;wCACD,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE;wCACxC,UAAU,EAAE,IAAI;wCAChB,SAAS,EAAE,MAAM;wCACjB,gBAAgB,EAAE,WAAW;qCAC9B,CAAA;oCACD,MAAK;gCACP,KAAK,MAAM;oCACT,OAAO,GAAG;wCACR,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;wCACtE,SAAS,EAAE,OAAO;qCACnB,CAAA;oCACD,MAAK;gCACP;oCACE,OAAO,IAAI,CAAA;4BACf,CAAC;4BAED,IAAI,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;4BAEjD,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;wBACrG,CAAC;wBACD,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BACxD,IAAI,OAAO,GAAG,EAAE,CAAA;4BAChB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gCACpB,KAAK,UAAU;oCACb,OAAO,GAAG;wCACR,UAAU,EAAE,IAAI;wCAChB,SAAS,EAAE,MAAM;wCACjB,gBAAgB,EAAE,WAAW;qCAC9B,CAAA;oCACD,MAAK;gCACP,KAAK,YAAY,CAAC;gCAClB,KAAK,MAAM,CAAC;gCACZ;oCACE,MAAK;4BACT,CAAC;4BAED,IAAI,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;4BAEjD,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;wBACvG,CAAC;qBACF;oBACD,KAAK,EAAE,GAAG;iBACX;aACF;YACD,IAAI,EAAE;gBACJ,UAAU,EAAE;oBACV,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,UAAU,EAAE;gBACV,QAAQ,EAAE,IAAI;aACf;YACD,OAAO,EAAE,EAAE;SACZ,CAAA;IACH,CAAC;IAED,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE,EAAe;QAC/D;;;;;WAKG;QACH,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACrG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK;SACf,CAAA;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,KAAK,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC;IAGD,iCAAiC;IACzB,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,GAAG,CAAA;;;;;;SAMT;aACF,CAAC,CAAA;YAEF,IAAI,CAAC,UAAU,GAAG,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,SAAS,CAAA;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC7B,CAAC;IACH,CAAC;IACD,YAAY;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,EAAE,QAAuB,EAAE,EAAE;YACxD,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;YAEzC,IAAI,CAAC,KAAM,CAAC,KAAK,EAAE,CAAA;YAEnB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACxB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI,CAAC,KAAK;aACnB,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,IAAI,CAAC,KAAK,GAAG,SAAS,CACpB,IAAI,CAAA,6CAA6C,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,EACxG;YACE,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC;gBAC3D,OAAO,EAAE,CAAC,QAAa,EAAE,KAAU,EAAE,EAAE;oBACrC,iCAAiC;oBACjC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBAC5B,CAAC;aACF;SACF,CACF,CAAA;IACH,CAAC;;AA/W0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;sDAA2B;AAE5C;IAAR,KAAK,EAAE;;4DAAkB;AAEjB;IAAR,KAAK,EAAE;;2DAAoB;AAET;IAAlB,KAAK,CAAC,UAAU,CAAC;8BAAS,SAAS;sDAAA;AACP;IAA5B,KAAK,CAAC,oBAAoB,CAAC;8BAAQ,gBAAgB;qDAAA;AAjCzC,uBAAuB;IADnC,aAAa,CAAC,4BAA4B,CAAC;GAC/B,uBAAuB,CA0YnC","sourcesContent":["import './approval-line-view'\nimport './approval-line-selector'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { DataGrist, FetchOption, getEditor, getRenderer } from '@operato/data-grist'\nimport { isMobileDevice } from '@operato/utils'\nimport { ButtonContainerStyles, CommonHeaderStyles } from '@operato/styles'\nimport { openPopup, PopupHandle } from '@operato/layout'\n\nimport gql from 'graphql-tag'\nimport { client } from '@operato/graphql'\n\nimport { ApprovalLineView } from './approval-line-view'\nimport { offersCopyFrom } from './copy-from'\nimport { ApprovalLine, ApprovalLineItem, isReferenceStep, storedParticipation } from '../types/approval-line'\n\n/**\n * 결재선의 각 결재자 리스트를 편집한다.\n */\n@customElement('approval-line-items-editor')\nexport class ApprovalLineItemsEditor extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n approval-line-view {\n min-height: 100px;\n }\n\n ox-grist {\n flex: 1;\n }\n\n .header {\n grid-template-areas: 'filters actions';\n }\n `\n ]\n\n @property({ type: Array }) value?: ApprovalLineItem[]\n\n @state() gristConfig?: any\n /** 퍼 올 수 있는 저장된 결재선의 수. 세기 전과 못 센 것은 undefined 다(§ copy-from.ts). */\n @state() savedLines?: number\n\n @query('ox-grist') grist?: DataGrist\n @query('approval-line-view') view?: ApprovalLineView\n\n private popup?: PopupHandle\n\n render() {\n return html`\n <approval-line-view .model=${this.value}></approval-line-view>\n <ox-grist\n .mode=${isMobileDevice() ? 'CARD' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n @record-change=${e => {\n this.value = ((this.grist as any)?._data.records || [])\n .map(v => {\n /*\n * 여기서 고른 칸만 저장된다. 칸을 더하고 이 줄을 안 고치면 **화면에서는 고쳐지는데\n * 저장이 안 된다** — 오류도 나지 않는다.\n */\n return {\n type: v.type,\n approver: v.approver,\n participation: storedParticipation(v),\n /* 빈 글자와 0 을 가른다. 0 은 「상신 즉시」와 같은 뜻이라 비운다. */\n notifyAfter: v.notifyAfter ? Number(v.notifyAfter) : undefined\n }\n })\n .filter(v => v.type)\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"actions\">\n ${offersCopyFrom(this.savedLines)\n ? html`<button @click=${this.openSelector.bind(this)}>\n <md-icon>content_copy</md-icon>${i18next.t('button.copy from')}\n </button>`\n : ''}\n\n <button danger @click=${() => this.deleteDataItems()}>\n <md-icon>delete</md-icon>${i18next.t('button.delete')}\n </button>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async firstUpdated() {\n this.countSavedLines()\n\n this.gristConfig = {\n list: {\n fields: ['type', 'approver', 'participation']\n },\n columns: [\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_upward',\n handlers: {\n click: 'move-up'\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_downward',\n handlers: {\n click: 'move-down'\n }\n },\n {\n type: 'select',\n name: 'type',\n header: i18next.t('field.type', { defaultValue: 'type' }),\n record: {\n editable: true,\n options: ['', 'Employee', 'Department', 'Role', 'MyDepartment', 'MySupervisor', 'Myself']\n },\n width: 140\n },\n {\n /*\n * 어떤 자격으로 서는가 — 결재냐 참조냐.\n *\n * 빈 값이 「결재」다. 지금 도는 결재선에는 이 칸이 없어서, 그 항목들이 전부 결재자로 읽혀야\n * 거동이 안 바뀐다. 그래서 옵션의 첫 자리를 빈 값으로 두고 그 문구를 「결재」로 그린다 —\n * 사용자에게는 비어 있음이 보이지 않고 「결재」로 보인다.\n */\n type: 'select',\n name: 'participation',\n header: i18next.t('field.participation'),\n record: {\n editable: true,\n options: [\n { display: i18next.t('label.participation-approval'), value: '' },\n { display: i18next.t('label.participation-reference'), value: 'reference' }\n ]\n },\n width: 100\n },\n {\n /*\n * 참조에게 언제 알리나.\n *\n * 결재자에게는 뜻이 없다 — 자기 차례가 곧 시점이다. 그래서 결재 항목에서는 고칠 수 없게 두고,\n * 그 자리에 「참조에만 씁니다」를 적는다. 빈 칸으로 두면 「안 정했다」로 읽힌다.\n *\n * 비면 「상신 즉시」다. 가장 일찍 알리는 쪽이 안 정한 사람에게 안전하다 — 늦게 알리면 의견 낼\n * 기회가 줄고, 마지막 결재 뒤라면 기회가 아예 없다.\n */\n type: 'integer',\n name: 'notifyAfter',\n header: i18next.t('field.notify-after'),\n record: {\n editable: (value: any, record: any) => isReferenceStep(record),\n align: 'left',\n renderer: (value: any, column: any, record: any) => {\n if (!isReferenceStep(record)) {\n return html`<span class=\"none\">${i18next.t('text.notify-after-only-reference')}</span>`\n }\n\n return value\n ? html`${i18next.t('text.notify-after-nth', { n: value })}`\n : html`<span class=\"quiet\">${i18next.t('text.notify-immediately')}</span>`\n }\n },\n width: 130\n },\n {\n type: 'resource-object',\n name: 'approver',\n header: i18next.t('field.approver'),\n record: {\n editable: true,\n editor: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n title: i18next.t('title.employee list'),\n pagination: { pages: [50, 100, 200] },\n basicArgs: { filters: [{ name: 'active', operator: 'eq', value: 'true' }] },\n queryName: 'employees',\n columns: [\n { name: 'id', hidden: true },\n {\n name: 'controlNo',\n width: 120,\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search',\n sortable: true\n },\n {\n name: 'name',\n width: 120,\n header: { renderer: () => i18next.t('field.name') },\n filter: 'search',\n sortable: true\n },\n {\n name: 'alias',\n width: 150,\n header: { renderer: () => i18next.t('label.alias') },\n filter: 'search',\n sortable: true\n },\n {\n type: 'code',\n name: 'type',\n width: 110,\n header: { renderer: () => i18next.t('label.type', { defaultValue: 'type' }) },\n record: {\n editable: false,\n codeName: 'EMPLOYEE_TYPE'\n }\n },\n {\n type: 'code',\n name: 'jobPosition',\n width: 110,\n header: { renderer: () => i18next.t('label.job-position') },\n record: {\n editable: false,\n codeName: 'JOB_POSITION'\n }\n },\n {\n type: 'code',\n name: 'jobResponsibility',\n width: 200,\n header: { renderer: () => i18next.t('label.job-responsibility') },\n record: {\n editable: false,\n codeName: 'JOB_RESPONSIBILITY'\n }\n },\n {\n type: 'date',\n name: 'hiredOn',\n header: { renderer: () => i18next.t('field.hired-on') },\n width: 100\n }\n ],\n list: { fields: ['controlNo', 'name', 'alias', 'hiredOn'] },\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n options = {\n title: i18next.t('title.department list'),\n queryName: 'departments',\n columns: [\n { name: 'id', hidden: true },\n {\n name: 'controlNo',\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search'\n },\n { name: 'name', header: { renderer: () => i18next.t('field.name') }, filter: 'search' }\n ],\n list: { fields: ['name', 'control-no'] },\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Role':\n options = {\n title: i18next.t('title.lookup role', { defaultValue: 'lookup role' }),\n queryName: 'roles'\n }\n break\n default:\n return null\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getEditor(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n },\n renderer: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n case 'Role':\n default:\n break\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n pagination: {\n infinite: true\n },\n sorters: []\n }\n }\n\n fetchHandler({ filters, page, limit, sortings = [] }: FetchOption) {\n /*\n * Rows come straight from the API, where participation is spelled `Reference` — type-graphql\n * publishes a registered enum by its key. The select below matches its options by string, so\n * that spelling matches neither `''` nor `'reference'` and the row draws as an approver. Fixed\n * here rather than in the column, because grist compares the record's own value.\n */\n const value = (this.value || []).map(item => ({ ...item, participation: storedParticipation(item) }))\n this.value = value\n\n return {\n total: value.length,\n records: value\n }\n }\n\n async deleteDataItems() {\n this.grist?.deleteSelectedRecords(false)\n }\n\n\n /* 고르개가 읽는 목록과 같은 질의다 — 수만 센다. */\n private async countSavedLines() {\n try {\n const response = await client.query({\n query: gql`\n query {\n responses: approvalLineReferences(pagination: { page: 1, limit: 1 }) {\n total\n }\n }\n `\n })\n\n this.savedLines = response?.data?.responses?.total ?? undefined\n } catch {\n this.savedLines = undefined\n }\n }\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n const confirmCallback = async (selected?: ApprovalLine) => {\n this.value = [...(selected?.model || [])]\n\n this.grist!.fetch()\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }\n\n this.popup = openPopup(\n html` <approval-line-selector .confirmCallback=${confirmCallback.bind(this)}></approval-line-selector> `,\n {\n backdrop: true,\n size: 'large',\n search: {\n placeholder: i18next.t('title.approval-line template list'),\n handler: (instance: any, value: any) => {\n /* instance: template instance */\n instance.searchText(value)\n }\n }\n }\n )\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"approval-line-items-editor.js","sourceRoot":"","sources":["../../client/component/approval-line-items-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import './approval-line-view'\nimport './approval-line-selector'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { DataGrist, FetchOption, getEditor, getRenderer } from '@operato/data-grist'\nimport { isMobileDevice } from '@operato/utils'\nimport { ButtonContainerStyles, CommonHeaderStyles } from '@operato/styles'\nimport { openPopup, PopupHandle } from '@operato/layout'\n\nimport gql from 'graphql-tag'\nimport { client } from '@operato/graphql'\n\nimport { ApprovalLineView } from './approval-line-view'\nimport { lineAfterCopy, lineFromRows, participationChoice, PARTICIPATION_CHOICES } from './approval-line-edit'\nimport { offersCopyFrom } from './copy-from'\nimport { ApprovalLine, ApprovalLineItem, isReferenceStep, storedParticipation } from '../types/approval-line'\n\n/**\n * 결재선의 각 결재자 리스트를 편집한다.\n */\n@customElement('approval-line-items-editor')\nexport class ApprovalLineItemsEditor extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n approval-line-view {\n min-height: 100px;\n }\n\n ox-grist {\n flex: 1;\n }\n\n .header {\n grid-template-areas: 'filters actions';\n }\n `\n ]\n\n @property({ type: Array }) value?: ApprovalLineItem[]\n\n @state() gristConfig?: any\n /** 퍼 올 수 있는 저장된 결재선의 수. 세기 전과 못 센 것은 undefined 다(§ copy-from.ts). */\n @state() savedLines?: number\n\n @query('ox-grist') grist?: DataGrist\n @query('approval-line-view') view?: ApprovalLineView\n\n private popup?: PopupHandle\n\n render() {\n return html`\n <approval-line-view .model=${this.value}></approval-line-view>\n <ox-grist\n .mode=${isMobileDevice() ? 'CARD' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n @record-change=${() => this.takeRows()}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"actions\">\n ${offersCopyFrom(this.savedLines)\n ? html`<button @click=${this.openSelector.bind(this)}>\n <md-icon>content_copy</md-icon>${i18next.t('button.copy from')}\n </button>`\n : ''}\n\n <button danger @click=${() => this.deleteDataItems()}>\n <md-icon>delete</md-icon>${i18next.t('button.delete')}\n </button>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async firstUpdated() {\n this.countSavedLines()\n\n this.gristConfig = {\n list: {\n fields: ['type', 'approver', 'participation']\n },\n columns: [\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_upward',\n handlers: {\n click: 'move-up'\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_downward',\n handlers: {\n click: 'move-down'\n }\n },\n {\n type: 'select',\n name: 'type',\n header: i18next.t('field.type', { defaultValue: 'type' }),\n record: {\n editable: true,\n options: ['', 'Employee', 'Department', 'Role', 'MyDepartment', 'MySupervisor', 'Myself']\n },\n width: 140\n },\n {\n /*\n * 어떤 자격으로 서는가 — 결재냐 참조냐.\n *\n * 빈 값이 「결재」다. 지금 도는 결재선에는 이 칸이 없어서, 그 항목들이 전부 결재자로 읽혀야\n * 거동이 안 바뀐다. 그래서 옵션의 첫 자리를 빈 값으로 두고 그 문구를 「결재」로 그린다.\n * 그리는 것은 이 칸이 한다 — 그리스트의 select 렌더러는 값이 비면 옵션을 보기도 전에 빈\n * 글자를 내서, 결재 항목이 전부 빈칸으로 보였다(§ approval-line-edit 의 participationChoice).\n */\n type: 'select',\n name: 'participation',\n header: i18next.t('field.participation'),\n record: {\n editable: true,\n options: PARTICIPATION_CHOICES.map(one => ({ display: i18next.t(one.key), value: one.value })),\n renderer: (value: any, column: any, record: any) => html`<span>${i18next.t(participationChoice(record).key)}</span>`\n },\n width: 100\n },\n {\n /*\n * 참조에게 언제 알리나.\n *\n * 결재자에게는 뜻이 없다 — 자기 차례가 곧 시점이다. 그래서 결재 항목에서는 고칠 수 없게 두고,\n * 그 자리에 「참조에만 씁니다」를 적는다. 빈 칸으로 두면 「안 정했다」로 읽힌다.\n *\n * 비면 「상신 즉시」다. 가장 일찍 알리는 쪽이 안 정한 사람에게 안전하다 — 늦게 알리면 의견 낼\n * 기회가 줄고, 마지막 결재 뒤라면 기회가 아예 없다.\n */\n type: 'integer',\n name: 'notifyAfter',\n header: i18next.t('field.notify-after'),\n record: {\n editable: (value: any, record: any) => isReferenceStep(record),\n align: 'left',\n renderer: (value: any, column: any, record: any) => {\n if (!isReferenceStep(record)) {\n return html`<span class=\"none\">${i18next.t('text.notify-after-only-reference')}</span>`\n }\n\n return value\n ? html`${i18next.t('text.notify-after-nth', { n: value })}`\n : html`<span class=\"quiet\">${i18next.t('text.notify-immediately')}</span>`\n }\n },\n width: 130\n },\n {\n type: 'resource-object',\n name: 'approver',\n header: i18next.t('field.approver'),\n record: {\n editable: true,\n editor: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n title: i18next.t('title.employee list'),\n pagination: { pages: [50, 100, 200] },\n basicArgs: { filters: [{ name: 'active', operator: 'eq', value: 'true' }] },\n queryName: 'employees',\n columns: [\n { name: 'id', hidden: true },\n {\n name: 'controlNo',\n width: 120,\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search',\n sortable: true\n },\n {\n name: 'name',\n width: 120,\n header: { renderer: () => i18next.t('field.name') },\n filter: 'search',\n sortable: true\n },\n {\n name: 'alias',\n width: 150,\n header: { renderer: () => i18next.t('label.alias') },\n filter: 'search',\n sortable: true\n },\n {\n type: 'code',\n name: 'type',\n width: 110,\n header: { renderer: () => i18next.t('label.type', { defaultValue: 'type' }) },\n record: {\n editable: false,\n codeName: 'EMPLOYEE_TYPE'\n }\n },\n {\n type: 'code',\n name: 'jobPosition',\n width: 110,\n header: { renderer: () => i18next.t('label.job-position') },\n record: {\n editable: false,\n codeName: 'JOB_POSITION'\n }\n },\n {\n type: 'code',\n name: 'jobResponsibility',\n width: 200,\n header: { renderer: () => i18next.t('label.job-responsibility') },\n record: {\n editable: false,\n codeName: 'JOB_RESPONSIBILITY'\n }\n },\n {\n type: 'date',\n name: 'hiredOn',\n header: { renderer: () => i18next.t('field.hired-on') },\n width: 100\n }\n ],\n list: { fields: ['controlNo', 'name', 'alias', 'hiredOn'] },\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n options = {\n title: i18next.t('title.department list'),\n queryName: 'departments',\n columns: [\n { name: 'id', hidden: true },\n {\n name: 'controlNo',\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search'\n },\n { name: 'name', header: { renderer: () => i18next.t('field.name') }, filter: 'search' }\n ],\n list: { fields: ['name', 'control-no'] },\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Role':\n options = {\n title: i18next.t('title.lookup role', { defaultValue: 'lookup role' }),\n queryName: 'roles'\n }\n break\n default:\n return null\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getEditor(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n },\n renderer: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n case 'Role':\n default:\n break\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n pagination: {\n infinite: true\n },\n sorters: []\n }\n }\n\n fetchHandler({ filters, page, limit, sortings = [] }: FetchOption) {\n /*\n * Rows come straight from the API, where participation is spelled `Reference` — type-graphql\n * publishes a registered enum by its key. The select below matches its options by string, so\n * that spelling matches neither `''` nor `'reference'` and the row draws as an approver. Fixed\n * here rather than in the column, because grist compares the record's own value.\n */\n const value = (this.value || []).map(item => ({ ...item, participation: storedParticipation(item) }))\n this.value = value\n\n return {\n total: value.length,\n records: value\n }\n }\n\n async deleteDataItems() {\n this.grist?.deleteSelectedRecords(false)\n\n /*\n * 지우기는 record-change 를 안 낸다. 여기서 읽지 않으면 줄은 화면에서 사라지는데 팝업이 받은\n * 값은 지우기 전 그대로라, 확인을 누르면 지운 줄이 되살아난다.\n */\n this.takeRows()\n }\n\n /** 화면의 줄을 결재선으로 읽어 넘긴다 — 고치기와 지우기가 같은 길로 간다. */\n private takeRows() {\n this.value = lineFromRows((this.grist as any)?._data?.records)\n this.announce()\n }\n\n private announce() {\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }\n\n\n /* 선택기가 읽는 목록과 같은 질의다 — 수만 센다. */\n private async countSavedLines() {\n try {\n const response = await client.query({\n query: gql`\n query {\n responses: approvalLineReferences(pagination: { page: 1, limit: 1 }) {\n total\n }\n }\n `\n })\n\n this.savedLines = response?.data?.responses?.total ?? undefined\n } catch {\n this.savedLines = undefined\n }\n }\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n const confirmCallback = async (selected?: ApprovalLine | null) => {\n this.value = lineAfterCopy(this.value, selected)\n\n this.grist!.fetch()\n\n this.announce()\n }\n\n this.popup = openPopup(\n html` <approval-line-selector .confirmCallback=${confirmCallback.bind(this)}></approval-line-selector> `,\n {\n backdrop: true,\n size: 'large',\n search: {\n placeholder: i18next.t('title.approval-line template list'),\n handler: (instance: any, value: any) => {\n /* instance: template instance */\n instance.searchText(value)\n }\n }\n }\n )\n }\n}\n"]}
|
|
@@ -12,7 +12,8 @@ export declare class ApprovalLineSelector extends LitElement {
|
|
|
12
12
|
value?: string;
|
|
13
13
|
config: any;
|
|
14
14
|
data: GristData;
|
|
15
|
-
|
|
15
|
+
/** `null` is 「비우기」; a picked line is the line to copy. Nothing picked never calls it (§ lineAfterCopy). */
|
|
16
|
+
confirmCallback?: (record?: GristRecord | null) => Promise<void>;
|
|
16
17
|
selectedRecords: GristRecord[];
|
|
17
18
|
grist: DataGrist;
|
|
18
19
|
view?: ApprovalLineView;
|
|
@@ -98,14 +98,18 @@ let ApprovalLineSelector = class ApprovalLineSelector extends LitElement {
|
|
|
98
98
|
this.grist.searchText = value;
|
|
99
99
|
}
|
|
100
100
|
onEmpty() {
|
|
101
|
-
this.confirmCallback && this.confirmCallback();
|
|
101
|
+
this.confirmCallback && this.confirmCallback(null);
|
|
102
102
|
closePopup(this);
|
|
103
103
|
}
|
|
104
104
|
onCancel() {
|
|
105
105
|
closePopup(this);
|
|
106
106
|
}
|
|
107
107
|
onConfirm() {
|
|
108
|
-
|
|
108
|
+
/* Nothing picked copies nothing - the line being edited stays as it is. */
|
|
109
|
+
const selected = this.selected;
|
|
110
|
+
if (selected) {
|
|
111
|
+
this.confirmCallback && this.confirmCallback(selected);
|
|
112
|
+
}
|
|
109
113
|
closePopup(this);
|
|
110
114
|
}
|
|
111
115
|
async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }) {
|
|
@@ -126,6 +130,8 @@ let ApprovalLineSelector = class ApprovalLineSelector extends LitElement {
|
|
|
126
130
|
}
|
|
127
131
|
model {
|
|
128
132
|
type
|
|
133
|
+
participation
|
|
134
|
+
notifyAfter
|
|
129
135
|
approver {
|
|
130
136
|
id
|
|
131
137
|
name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-line-selector.js","sourceRoot":"","sources":["../../client/component/approval-line-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup-actions.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@operato/data-grist'\nimport './approval-line-view'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport {\n getRenderer,\n DataGrist,\n FetchOption,\n GristEventHandler,\n GristData,\n GristRecord,\n ZERO_DATA\n} from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport { isMobileDevice } from '@operato/utils'\nimport { CommonHeaderStyles, CommonPopupStyles } from '@operato/styles'\n\nimport { ApprovalLineView } from './approval-line-view'\n\n@customElement('approval-line-selector')\nexport class ApprovalLineSelector extends LitElement {\n static styles = [\n CommonHeaderStyles,\n CommonPopupStyles,\n css`\n /*\n * 단추 줄은 **제품의 팝업 규약**을 쓴다(CommonPopupStyles 의 .buttons).\n *\n * 전에는 손으로 만든 .footer 였고 organization 의 팝업 다섯이 그것을 복사해 갖고 있었다.\n * 규약이 주는 것을 다 놓쳤다 — 팝업 안 단추의 알약 모서리(담는 카드가 둥그니 그 안도\n * 둥글다), 마우스와 손가락을 가르는 갈래(손가락에서는 카드 아래 폭을 채우는 액션바가 된다),\n * 단추 높이 통일.\n *\n * 단추는 Material 것으로 쓴다. 규약의 마우스 갈래는 **md-*-button 의 토큰으로만** 모양을\n * 말한다 — 평범한 button 을 두면 모서리가 0 으로 남는다(실측: 알약이어야 할 자리에 0px).\n * 제품의 다른 팝업도 같은 관용구다(operato-plant 의 maintenance-dialog).\n *\n * 「비우기」는 왼쪽에 둔다 — 되돌리는 것이라 저지르는 것들과 같은 자리에 두지 않는다.\n */\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n\n width: var(--overlay-center-normal-width, 50%);\n height: var(--overlay-center-normal-height, 50%);\n }\n\n approval-line-view {\n min-height: 100px;\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: String }) value?: string\n @property({ type: Object }) config: any\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) confirmCallback?: (record?: GristRecord) => Promise<void>\n @property({ type: Array }) selectedRecords: GristRecord[] = []\n\n @query('ox-grist') grist!: DataGrist\n @query('approval-line-view') view?: ApprovalLineView\n\n render() {\n return html`\n <approval-line-view></approval-line-view>\n <!--\n .data 를 넘기지 않는다 — 목록은 fetchHandler 가 채운다.\n\n 이 부품은 data 를 **읽지도 채우지도 않는다.** 선언과 이 바인딩만 있어서 값은 늘\n ZERO_DATA(빈 것)이고, 렌더가 돌 때마다 그 빈 것이 내려간다. 그리스트는 data 가 설정되면\n reset() 하므로(data-grist 의 updated), 이 부품이 **다시 그려지는 순간 목록이 통째로\n 사라진다.** 조회 결과는 data-provider 가 그리스트에 직접 넣는다.\n\n 오늘은 안 터진다 — 이 부품에 다시 그릴 상태(@state)가 없다. 그러나 @operato/app 의\n 참조 선택기에서 바닥 단추를 고른 상태에 묶자마자 바로 터졌다.\n\n [확인함] 2026-09-05 · 라디오 클릭 → reset() 1회(DataGrist.updated) → 20건 → 0건\n -->\n <ox-grist\n .mode=${isMobileDevice() ? 'LIST' : 'GRID'}\n .config=${this.config}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .selectedRecords=${this.selectedRecords}\n @select-record-change=${e => {\n this.view!.model = this.selected?.model || []\n }}\n >\n </ox-grist>\n\n <ox-popup-actions>\n <md-text-button slot=\"start\" @click=${this.onEmpty.bind(this)}>\n ${i18next.t('button.empty', { defaultValue: 'empty' })}\n </md-text-button>\n <md-text-button slot=\"cancel\" @click=${this.onCancel.bind(this)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" @click=${this.onConfirm.bind(this)}>${i18next.t('button.confirm', { defaultValue: 'confirm' })}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n searchText(value: string) {\n this.grist!.searchText = value\n }\n\n onEmpty() {\n this.confirmCallback && this.confirmCallback()\n closePopup(this)\n }\n\n onCancel() {\n closePopup(this)\n }\n\n onConfirm() {\n this.confirmCallback && this.confirmCallback(this.selected)\n closePopup(this)\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: approvalLineReferences(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n ownerType\n owner {\n id\n name\n description\n controlNo\n }\n model {\n type\n approver {\n id\n name\n description\n controlNo\n }\n }\n }\n total\n }\n }\n `,\n variables: {\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n async firstUpdated() {\n this.config = {\n list: {\n fields: ['name', 'description'],\n details: ['ownerType', 'owner']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: false },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: {\n editable: false\n },\n filter: 'search',\n sortable: true,\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: {\n editable: false\n },\n filter: 'search',\n width: 200\n },\n {\n type: 'string',\n name: 'ownerType',\n header: i18next.t('field.owner-type'),\n record: {\n editable: false\n },\n width: 200\n },\n {\n type: 'resource-object',\n name: 'owner',\n header: i18next.t('field.owner'),\n record: {\n editable: false,\n renderer: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.ownerType) {\n case 'Employee':\n options = {\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Common':\n default:\n return\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 200\n }\n ],\n rows: {\n selectable: {\n multiple: false\n },\n appendable: false,\n handlers: {\n click: 'select-row',\n dblclick: ((columns, data, column, record, rowIndex, field) => {\n this.onConfirm()\n }) as GristEventHandler\n }\n }\n }\n }\n\n get selected() {\n var selected = this.grist.selected\n\n return selected && selected.length > 0 ? selected[0] : undefined\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"approval-line-selector.js","sourceRoot":"","sources":["../../client/component/approval-line-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup-actions.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@operato/data-grist'\nimport './approval-line-view'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport {\n getRenderer,\n DataGrist,\n FetchOption,\n GristEventHandler,\n GristData,\n GristRecord,\n ZERO_DATA\n} from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport { isMobileDevice } from '@operato/utils'\nimport { CommonHeaderStyles, CommonPopupStyles } from '@operato/styles'\n\nimport { ApprovalLineView } from './approval-line-view'\n\n@customElement('approval-line-selector')\nexport class ApprovalLineSelector extends LitElement {\n static styles = [\n CommonHeaderStyles,\n CommonPopupStyles,\n css`\n /*\n * 단추 줄은 **제품의 팝업 규약**을 쓴다(CommonPopupStyles 의 .buttons).\n *\n * 전에는 손으로 만든 .footer 였고 organization 의 팝업 다섯이 그것을 복사해 갖고 있었다.\n * 규약이 주는 것을 다 놓쳤다 — 팝업 안 단추의 알약 모서리(담는 카드가 둥그니 그 안도\n * 둥글다), 마우스와 손가락을 가르는 갈래(손가락에서는 카드 아래 폭을 채우는 액션바가 된다),\n * 단추 높이 통일.\n *\n * 단추는 Material 것으로 쓴다. 규약의 마우스 갈래는 **md-*-button 의 토큰으로만** 모양을\n * 말한다 — 평범한 button 을 두면 모서리가 0 으로 남는다(실측: 알약이어야 할 자리에 0px).\n * 제품의 다른 팝업도 같은 관용구다(operato-plant 의 maintenance-dialog).\n *\n * 「비우기」는 왼쪽에 둔다 — 되돌리는 것이라 저지르는 것들과 같은 자리에 두지 않는다.\n */\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n\n width: var(--overlay-center-normal-width, 50%);\n height: var(--overlay-center-normal-height, 50%);\n }\n\n approval-line-view {\n min-height: 100px;\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: String }) value?: string\n @property({ type: Object }) config: any\n @property({ type: Object }) data: GristData = ZERO_DATA\n /** `null` is 「비우기」; a picked line is the line to copy. Nothing picked never calls it (§ lineAfterCopy). */\n @property({ type: Object }) confirmCallback?: (record?: GristRecord | null) => Promise<void>\n @property({ type: Array }) selectedRecords: GristRecord[] = []\n\n @query('ox-grist') grist!: DataGrist\n @query('approval-line-view') view?: ApprovalLineView\n\n render() {\n return html`\n <approval-line-view></approval-line-view>\n <!--\n .data 를 넘기지 않는다 — 목록은 fetchHandler 가 채운다.\n\n 이 부품은 data 를 **읽지도 채우지도 않는다.** 선언과 이 바인딩만 있어서 값은 늘\n ZERO_DATA(빈 것)이고, 렌더가 돌 때마다 그 빈 것이 내려간다. 그리스트는 data 가 설정되면\n reset() 하므로(data-grist 의 updated), 이 부품이 **다시 그려지는 순간 목록이 통째로\n 사라진다.** 조회 결과는 data-provider 가 그리스트에 직접 넣는다.\n\n 오늘은 안 터진다 — 이 부품에 다시 그릴 상태(@state)가 없다. 그러나 @operato/app 의\n 참조 선택기에서 바닥 단추를 고른 상태에 묶자마자 바로 터졌다.\n\n [확인함] 2026-09-05 · 라디오 클릭 → reset() 1회(DataGrist.updated) → 20건 → 0건\n -->\n <ox-grist\n .mode=${isMobileDevice() ? 'LIST' : 'GRID'}\n .config=${this.config}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .selectedRecords=${this.selectedRecords}\n @select-record-change=${e => {\n this.view!.model = this.selected?.model || []\n }}\n >\n </ox-grist>\n\n <ox-popup-actions>\n <md-text-button slot=\"start\" @click=${this.onEmpty.bind(this)}>\n ${i18next.t('button.empty', { defaultValue: 'empty' })}\n </md-text-button>\n <md-text-button slot=\"cancel\" @click=${this.onCancel.bind(this)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" @click=${this.onConfirm.bind(this)}>${i18next.t('button.confirm', { defaultValue: 'confirm' })}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n searchText(value: string) {\n this.grist!.searchText = value\n }\n\n onEmpty() {\n this.confirmCallback && this.confirmCallback(null)\n closePopup(this)\n }\n\n onCancel() {\n closePopup(this)\n }\n\n onConfirm() {\n /* Nothing picked copies nothing - the line being edited stays as it is. */\n const selected = this.selected\n\n if (selected) {\n this.confirmCallback && this.confirmCallback(selected)\n }\n\n closePopup(this)\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: approvalLineReferences(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n ownerType\n owner {\n id\n name\n description\n controlNo\n }\n model {\n type\n participation\n notifyAfter\n approver {\n id\n name\n description\n controlNo\n }\n }\n }\n total\n }\n }\n `,\n variables: {\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n async firstUpdated() {\n this.config = {\n list: {\n fields: ['name', 'description'],\n details: ['ownerType', 'owner']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: false },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: {\n editable: false\n },\n filter: 'search',\n sortable: true,\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: {\n editable: false\n },\n filter: 'search',\n width: 200\n },\n {\n type: 'string',\n name: 'ownerType',\n header: i18next.t('field.owner-type'),\n record: {\n editable: false\n },\n width: 200\n },\n {\n type: 'resource-object',\n name: 'owner',\n header: i18next.t('field.owner'),\n record: {\n editable: false,\n renderer: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.ownerType) {\n case 'Employee':\n options = {\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Common':\n default:\n return\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 200\n }\n ],\n rows: {\n selectable: {\n multiple: false\n },\n appendable: false,\n handlers: {\n click: 'select-row',\n dblclick: ((columns, data, column, record, rowIndex, field) => {\n this.onConfirm()\n }) as GristEventHandler\n }\n }\n }\n }\n\n get selected() {\n var selected = this.grist.selected\n\n return selected && selected.length > 0 ? selected[0] : undefined\n }\n}\n"]}
|
|
@@ -194,6 +194,8 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
|
|
|
194
194
|
controlNo
|
|
195
195
|
}
|
|
196
196
|
model { type
|
|
197
|
+
participation
|
|
198
|
+
notifyAfter
|
|
197
199
|
approver { id
|
|
198
200
|
name
|
|
199
201
|
description
|
|
@@ -275,6 +277,8 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
|
|
|
275
277
|
mutation ($id: String!, $patch: ApprovalLinePatch!) { updateApprovalLine(id: $id, patch: $patch) { id
|
|
276
278
|
name
|
|
277
279
|
model { type
|
|
280
|
+
participation
|
|
281
|
+
notifyAfter
|
|
278
282
|
approver { id
|
|
279
283
|
name
|
|
280
284
|
description
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-approval-line-templates-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/common-approval-line-templates-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '../../component/approval-line-items-editor-popup'\n\nimport { OxPrompt } from '@operato/popup'\nimport { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\n\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { getRenderer, DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { isMobileDevice } from '@operato/utils'\n\nimport gql from 'graphql-tag'\n\n@customElement('common-approval-line-templates-page')\nexport class CommonApprovalLineTemplatesPage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n :host {\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() { return { title: i18next.t('title.common-approval-line template list'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n help: 'organization/approval-line',\n actions: [\n { icon: 'save',\n title: i18next.t('button.save'),\n action: this.updateApprovalLines.bind(this)\n },\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.deleteApprovalLines.bind(this),\n emphasis: { danger: true\n }\n }\n ]\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist class=\"page-fill\" .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) { this.gristConfig = { list: { fields: ['name', 'description'],\n details: ['updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n { type: 'gutter', gutterName: 'row-selector', fixed: true, multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n fixed: true,\n icon: record => (!record ? 'reorder' : record.id ? 'reorder' : ''),\n iconOnly: false,\n title: record => (!record ? i18next.t('button.edit') : record.id ? i18next.t('button.edit') : ''),\n width: 72,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record.id) { return\n }\n\n const { id, model } = record\n const popup = openPopup(\n html`\n <approval-line-items-editor-popup\n .confirmCallback=${async model => { await this.updateApprovalLine(id, model)\n await this.grist.fetch()\n }}\n .value=${model}\n ></approval-line-items-editor-popup>\n `,\n { backdrop: true,\n help: 'organization/approval-line-items-editor',\n size: 'large',\n title: i18next.t('title.approval-line item list')\n }\n )\n popup.onclosed = () => { this.grist?.fetch()\n }\n }\n }\n },\n { type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable: true\n },\n filter: 'search',\n sortable: true,\n width: 300\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 325\n },\n { type: 'string',\n name: 'ownerType',\n header: i18next.t('field.owner-type'),\n width: 120\n },\n { type: 'resource-object',\n name: 'owner',\n header: i18next.t('field.owner'),\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { var options = {}\n switch (record.ownerType) { case 'Employee':\n options = { valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Common':\n default:\n return\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n sortable: true,\n width: 90\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n sortable: true,\n width: 180\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) { if (this.active) { // do something here when this page just became as active\n }\n }\n\n /*\n * ── 「공용만」은 서버가 정한다 ─────────────────────────────────────────────\n * 전에는 `approvalLines` 를 부르고 화면이 `ownerType eq Common` 필터를 붙였다.\n *\n * `approvalLines` 는 **관리자 축의 읽기**다 — 짝이 되는 쓰기(create·update·deleteApprovalLine)가\n * 권한을 요구하고, 도메인의 결재선을 개인 것까지 전부 준다. 그게 그 축의 뜻이다.\n *\n * 범위를 화면이 붙이면 그 조건은 **이 화면 하나의 약속**이 된다. 같은 쿼리를 다른 화면이나\n * 스크립트가 필터 없이 부르면 남의 개인 결재선이 다 나오고, 아무도 그것을 잘못이라고 말해 주지\n * 않는다.\n *\n * `commonApprovalLines` 가 서버에서 `ownerType: 'Common'` 을 걸어 준다. 쓰기는 그대로 권한 걸린\n * 뮤테이션을 쓴다 — 읽는 범위가 넓어진 것이 아니라, 좁히는 자리가 옮겨진 것이다.\n */\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) { const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: commonApprovalLines(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n ownerType\n owner { id\n name\n description\n controlNo\n }\n model { type\n approver { id\n name\n description\n controlNo\n }\n }\n updater { id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return { total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n async deleteApprovalLines() { if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) { const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteApprovalLines(ids: $ids)\n }\n `,\n variables: { ids\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n notify({ message: i18next.t('text.deleted')\n })\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n }\n\n async updateApprovalLines() { let patches = this.grist.dirtyRecords\n if (patches && patches.length) { patches = patches.map(patch => { let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n\n patchField['ownerType'] = 'Common'\n patchField['owner'] = null\n\n patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) { updateMultipleApprovalLine(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n\n async updateApprovalLine(id, model) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) { updateApprovalLine(id: $id, patch: $patch) { id\n name\n model { type\n approver { id\n name\n description\n controlNo\n }\n }\n }\n }\n `,\n variables: { id,\n patch: { model,\n cuFlag: 'M'\n }\n }\n })\n if (!response.errors) { await document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.saved')\n }\n })\n )\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"common-approval-line-templates-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/common-approval-line-templates-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '../../component/approval-line-items-editor-popup'\n\nimport { OxPrompt } from '@operato/popup'\nimport { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\n\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { getRenderer, DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { isMobileDevice } from '@operato/utils'\n\nimport gql from 'graphql-tag'\n\n@customElement('common-approval-line-templates-page')\nexport class CommonApprovalLineTemplatesPage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n :host {\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() { return { title: i18next.t('title.common-approval-line template list'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n help: 'organization/approval-line',\n actions: [\n { icon: 'save',\n title: i18next.t('button.save'),\n action: this.updateApprovalLines.bind(this)\n },\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.deleteApprovalLines.bind(this),\n emphasis: { danger: true\n }\n }\n ]\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist class=\"page-fill\" .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) { this.gristConfig = { list: { fields: ['name', 'description'],\n details: ['updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n { type: 'gutter', gutterName: 'row-selector', fixed: true, multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n fixed: true,\n icon: record => (!record ? 'reorder' : record.id ? 'reorder' : ''),\n iconOnly: false,\n title: record => (!record ? i18next.t('button.edit') : record.id ? i18next.t('button.edit') : ''),\n width: 72,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record.id) { return\n }\n\n const { id, model } = record\n const popup = openPopup(\n html`\n <approval-line-items-editor-popup\n .confirmCallback=${async model => { await this.updateApprovalLine(id, model)\n await this.grist.fetch()\n }}\n .value=${model}\n ></approval-line-items-editor-popup>\n `,\n { backdrop: true,\n help: 'organization/approval-line-items-editor',\n size: 'large',\n title: i18next.t('title.approval-line item list')\n }\n )\n popup.onclosed = () => { this.grist?.fetch()\n }\n }\n }\n },\n { type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable: true\n },\n filter: 'search',\n sortable: true,\n width: 300\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 325\n },\n { type: 'string',\n name: 'ownerType',\n header: i18next.t('field.owner-type'),\n width: 120\n },\n { type: 'resource-object',\n name: 'owner',\n header: i18next.t('field.owner'),\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { var options = {}\n switch (record.ownerType) { case 'Employee':\n options = { valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Common':\n default:\n return\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n sortable: true,\n width: 90\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n sortable: true,\n width: 180\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) { if (this.active) { // do something here when this page just became as active\n }\n }\n\n /*\n * ── 「공용만」은 서버가 정한다 ─────────────────────────────────────────────\n * 전에는 `approvalLines` 를 부르고 화면이 `ownerType eq Common` 필터를 붙였다.\n *\n * `approvalLines` 는 **관리자 축의 읽기**다 — 짝이 되는 쓰기(create·update·deleteApprovalLine)가\n * 권한을 요구하고, 도메인의 결재선을 개인 것까지 전부 준다. 그게 그 축의 뜻이다.\n *\n * 범위를 화면이 붙이면 그 조건은 **이 화면 하나의 약속**이 된다. 같은 쿼리를 다른 화면이나\n * 스크립트가 필터 없이 부르면 남의 개인 결재선이 다 나오고, 아무도 그것을 잘못이라고 말해 주지\n * 않는다.\n *\n * `commonApprovalLines` 가 서버에서 `ownerType: 'Common'` 을 걸어 준다. 쓰기는 그대로 권한 걸린\n * 뮤테이션을 쓴다 — 읽는 범위가 넓어진 것이 아니라, 좁히는 자리가 옮겨진 것이다.\n */\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) { const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: commonApprovalLines(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n ownerType\n owner { id\n name\n description\n controlNo\n }\n model { type\n participation\n notifyAfter\n approver { id\n name\n description\n controlNo\n }\n }\n updater { id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return { total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n async deleteApprovalLines() { if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) { const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteApprovalLines(ids: $ids)\n }\n `,\n variables: { ids\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n notify({ message: i18next.t('text.deleted')\n })\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n }\n\n async updateApprovalLines() { let patches = this.grist.dirtyRecords\n if (patches && patches.length) { patches = patches.map(patch => { let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n\n patchField['ownerType'] = 'Common'\n patchField['owner'] = null\n\n patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) { updateMultipleApprovalLine(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n\n async updateApprovalLine(id, model) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) { updateApprovalLine(id: $id, patch: $patch) { id\n name\n model { type\n participation\n notifyAfter\n approver { id\n name\n description\n controlNo\n }\n }\n }\n }\n `,\n variables: { id,\n patch: { model,\n cuFlag: 'M'\n }\n }\n })\n if (!response.errors) { await document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.saved')\n }\n })\n )\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n}\n"]}
|
|
@@ -185,6 +185,8 @@ let MyApprovalLineTemplatesPage = class MyApprovalLineTemplatesPage extends loca
|
|
|
185
185
|
controlNo
|
|
186
186
|
}
|
|
187
187
|
model { type
|
|
188
|
+
participation
|
|
189
|
+
notifyAfter
|
|
188
190
|
approver { id
|
|
189
191
|
name
|
|
190
192
|
description
|
|
@@ -277,6 +279,8 @@ let MyApprovalLineTemplatesPage = class MyApprovalLineTemplatesPage extends loca
|
|
|
277
279
|
mutation ($id: String!, $patch: ApprovalLinePatch!) { updateMyApprovalLine(id: $id, patch: $patch) { id
|
|
278
280
|
name
|
|
279
281
|
model { type
|
|
282
|
+
participation
|
|
283
|
+
notifyAfter
|
|
280
284
|
approver { id
|
|
281
285
|
name
|
|
282
286
|
description
|