@things-factory/organization 10.1.34 → 10.1.37

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.
@@ -56,6 +56,29 @@ export declare function storedParticipation(item?: {
56
56
  export declare function isApprovalStep(item?: {
57
57
  participation?: ApprovalParticipation | string | null;
58
58
  }): boolean;
59
+ /**
60
+ * 결재선 한 줄을 화면이 어떻게 표시할지 — **셋이 같은 답을 쓰라고 한 자리에 둔다.**
61
+ *
62
+ * 「이 업무에 결재자가 있나」를 화면 셋이 각각 셌다. 업무정의 리스트의 사람 표는 결재선이 **비었는지**만
63
+ * 보고 답해서, 참조만 있는 줄도 사람 아이콘을 그렸다. BatchRelease 가 그랬다 — 두 줄 다 「참조에만
64
+ * 씁니다」인데 목록에는 결재자가 있는 것으로 보였다(2026-09-22, 수석 아키텍트가 화면에서 확인).
65
+ *
66
+ * 참조만 있는 결재선으로 규제를 걸면 **건은 올라가고 아무도 못 내린다.** 참조는 의견을 낼 뿐 판정하지
67
+ * 않기 때문이다.
68
+ *
69
+ * ── 네 갈래로 가른다 ──────────────────────────────────────────────────────
70
+ * 「참조만」을 「아예 없음」과 같이 그리면 고칠 사람이 무엇을 해야 하는지 모른다. 한쪽은 결재선을
71
+ * 만들어야 하고, 다른 쪽은 이미 있는 줄에 결재자를 더해야 한다.
72
+ *
73
+ * none 줄이 없다
74
+ * reference-only 줄은 있는데 결재 단계가 0 이다 — 아무도 못 내린다
75
+ * one 결재자 한 단계
76
+ * many 결재자 여러 단계
77
+ */
78
+ export type ApprovalLineMark = 'none' | 'reference-only' | 'one' | 'many';
79
+ export declare function approvalLineMark(line?: {
80
+ participation?: ApprovalParticipation | string | null;
81
+ }[] | null): ApprovalLineMark;
59
82
  export declare class ApprovalLineItem {
60
83
  type?: OrgMemberTargetType;
61
84
  value?: string;
@@ -70,6 +70,15 @@ export function storedParticipation(item) {
70
70
  export function isApprovalStep(item) {
71
71
  return !!item && !isReferenceStep(item);
72
72
  }
73
+ export function approvalLineMark(line) {
74
+ if (!Array.isArray(line) || !line.length) {
75
+ return 'none';
76
+ }
77
+ const steps = line.filter(isApprovalStep).length;
78
+ if (!steps)
79
+ return 'reference-only';
80
+ return steps === 1 ? 'one' : 'many';
81
+ }
73
82
  export class ApprovalLineItem {
74
83
  }
75
84
  export class ApprovalLine {
@@ -1 +1 @@
1
- {"version":3,"file":"approval-line.js","sourceRoot":"","sources":["../../client/types/approval-line.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,qBAGX;AAHD,WAAY,qBAAqB;IAC/B,8CAAqB,CAAA;IACrB,0CAAiB,CAAA;AACnB,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,QAGhC;AAED;;;;GAIG;AACH,MAAM,CAAN,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,wCAAwC;IACxC,8CAAqB,CAAA;IACrB,8CAA8C;IAC9C,gDAAuB,CAAA;AACzB,CAAC,EALW,qBAAqB,KAArB,qBAAqB,QAKhC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgE;IAC9F,MAAM,KAAK,GAAG,IAAI,EAAE,aAAa,CAAA;IAEjC;;;;;;;;;;;;;;OAcG;IACH,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,qBAAqB,CAAC,SAAS,CAAA;AAC7F,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAEnC;IACC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;AAC5E,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,IAAgE;IAC7F,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,OAAO,gBAAgB;CAoB5B;AAED,MAAM,OAAO,YAAY;CAkCxB","sourcesContent":["import { Domain, User, Role } from '@operato/shell'\n\nimport { Employee } from './employee'\nimport { Department } from './department'\nimport { OrgMemberTarget, OrgMemberTargetType } from './org-member'\n\nexport enum ApprovalLineOwnerType {\n Employee = 'Employee',\n Common = 'Common'\n}\n\n/**\n * 결재선에 어떤 자격으로 서는가.\n *\n * 서버는 소문자를 쓴다(`approval-line-item.ts` 의 `ApprovalParticipation`).\n */\nexport enum ApprovalParticipation {\n /** 결정한다. 이 사람이 승인하거나 반려해야 다음으로 넘어간다. */\n Approval = 'approval',\n /** 알기만 한다. 의견은 낼 수 있고 안 내도 되며, 결재를 막지 않는다. */\n Reference = 'reference'\n}\n\n/**\n * Is this step a reference rather than an approval?\n *\n * Ask it here, never inline. \"This is an approval\" is written two ways on stored rows — `'approval'`\n * on recent ones and nothing at all on rows created before the column existed (5 of the 8 in 내\n * 결재함 today). Both are approvals, and asking in the negative is what makes them behave alike.\n *\n * The danger is the opposite question. `participation === 'approval'` looks equivalent and drops\n * every older row — no error, just a list that is quietly shorter. Four places in this package had\n * each written the check by hand, three of them against the raw string rather than the enum, so a\n * single one of them turning the question around would have gone unnoticed.\n *\n * The server settled this the same way and says why in\n * worklist/server/controllers/activity-approval/approval-line.ts: one place to decide, or the rule\n * grows a second copy that nobody updates.\n */\nexport function isReferenceStep(item?: { participation?: ApprovalParticipation | string | null }): boolean {\n const value = item?.participation\n\n /*\n * The same fact arrives spelled two ways, and neither side is wrong.\n *\n * The column holds `reference`, and everything server-side compares against that. GraphQL does\n * not: type-graphql's registerEnumType exposes an enum by its **key**, so the API answers\n * `Reference`. A screen reading `approvalLines { model { participation } }` therefore receives\n * `Reference` and was comparing it to `reference` — false every time.\n *\n * That is why 「표준 3단 결재」 showed its reference step as an approver: no 참조 marker on the\n * list, no quiet styling, and 알림 시점 left editable on a row that is not a reference at all.\n * Four hand-written copies of this check hid it; one place to ask makes it a one-line fix.\n *\n * Both spellings are accepted here, at the boundary, rather than by teaching every caller about\n * the API's casing.\n */\n return typeof value === 'string' && value.toLowerCase() === ApprovalParticipation.Reference\n}\n\n/**\n * The spelling this step should be stored and edited under.\n *\n * isReferenceStep answers the question; this answers with a value, for the places that cannot ask a\n * function. A `<select>` matches its options by string equality, so an option list of `''` and\n * `'reference'` silently selects neither when the API hands back `Reference` — the row then reads\n * as an approver, and the next edit to that row writes the approver spelling back. A reference step\n * turns into an approval with no error and nothing on screen to notice.\n *\n * Approval canonicalises to undefined rather than `'approval'`: rows created before the column\n * existed have nothing there, and empty has to keep meaning approval for those to behave. See\n * ApprovalLineItem.participation.\n */\nexport function storedParticipation(item?: {\n participation?: ApprovalParticipation | string | null\n}): ApprovalParticipation | undefined {\n return isReferenceStep(item) ? ApprovalParticipation.Reference : undefined\n}\n\n/** Is this step one that has to approve before the request moves on? See isReferenceStep. */\nexport function isApprovalStep(item?: { participation?: ApprovalParticipation | string | null }): boolean {\n return !!item && !isReferenceStep(item)\n}\n\nexport class ApprovalLineItem {\n type?: OrgMemberTargetType\n value?: string\n approver?: OrgMemberTarget\n\n /**\n * **비어 있으면 결재다.**\n *\n * 지금 도는 결재선에는 이 칸이 없다. 그 항목들이 전부 결재자로 읽혀야 거동이 안 바뀐다.\n */\n participation?: ApprovalParticipation\n\n /**\n * 참조에게 언제 알리나 — 몇 번째 결재가 끝났을 때. 비면 상신 즉시.\n *\n * 배열 자리로 시점을 표현하지 않는다. 참조 항목의 자리는 뜻이 없고 결재 차례를 소비하지 않는다.\n * 편집기가 항목을 목록 끝에 붙이므로, 자리로 하면 기본값이 「마지막 결재 뒤」가 되어 의견 낼 기회가\n * 아예 없는 쪽이 기본이 된다.\n */\n notifyAfter?: number\n}\n\nexport class ApprovalLine {\n readonly id?: string\n\n domain?: Domain\n\n domainId?: string\n\n name?: string\n\n description?: string\n\n model?: ApprovalLineItem[]\n\n ownerType?: ApprovalLineOwnerType\n\n ownerValue?: string\n\n ownerEmployee?: Employee\n\n ownerDepartment?: Department\n\n ownerRole?: Role\n\n createdAt?: Date\n\n updatedAt?: Date\n\n creator?: User\n\n creatorId?: string\n\n updater?: User\n\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"approval-line.js","sourceRoot":"","sources":["../../client/types/approval-line.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,qBAGX;AAHD,WAAY,qBAAqB;IAC/B,8CAAqB,CAAA;IACrB,0CAAiB,CAAA;AACnB,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,QAGhC;AAED;;;;GAIG;AACH,MAAM,CAAN,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,wCAAwC;IACxC,8CAAqB,CAAA;IACrB,8CAA8C;IAC9C,gDAAuB,CAAA;AACzB,CAAC,EALW,qBAAqB,KAArB,qBAAqB,QAKhC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgE;IAC9F,MAAM,KAAK,GAAG,IAAI,EAAE,aAAa,CAAA;IAEjC;;;;;;;;;;;;;;OAcG;IACH,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,qBAAqB,CAAC,SAAS,CAAA;AAC7F,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAEnC;IACC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;AAC5E,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,IAAgE;IAC7F,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC;AAuBD,MAAM,UAAU,gBAAgB,CAAC,IAAyE;IACxG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAA;IAEhD,IAAI,CAAC,KAAK;QAAE,OAAO,gBAAgB,CAAA;IACnC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;AACrC,CAAC;AAED,MAAM,OAAO,gBAAgB;CAoB5B;AAED,MAAM,OAAO,YAAY;CAkCxB","sourcesContent":["import { Domain, User, Role } from '@operato/shell'\n\nimport { Employee } from './employee'\nimport { Department } from './department'\nimport { OrgMemberTarget, OrgMemberTargetType } from './org-member'\n\nexport enum ApprovalLineOwnerType {\n Employee = 'Employee',\n Common = 'Common'\n}\n\n/**\n * 결재선에 어떤 자격으로 서는가.\n *\n * 서버는 소문자를 쓴다(`approval-line-item.ts` 의 `ApprovalParticipation`).\n */\nexport enum ApprovalParticipation {\n /** 결정한다. 이 사람이 승인하거나 반려해야 다음으로 넘어간다. */\n Approval = 'approval',\n /** 알기만 한다. 의견은 낼 수 있고 안 내도 되며, 결재를 막지 않는다. */\n Reference = 'reference'\n}\n\n/**\n * Is this step a reference rather than an approval?\n *\n * Ask it here, never inline. \"This is an approval\" is written two ways on stored rows — `'approval'`\n * on recent ones and nothing at all on rows created before the column existed (5 of the 8 in 내\n * 결재함 today). Both are approvals, and asking in the negative is what makes them behave alike.\n *\n * The danger is the opposite question. `participation === 'approval'` looks equivalent and drops\n * every older row — no error, just a list that is quietly shorter. Four places in this package had\n * each written the check by hand, three of them against the raw string rather than the enum, so a\n * single one of them turning the question around would have gone unnoticed.\n *\n * The server settled this the same way and says why in\n * worklist/server/controllers/activity-approval/approval-line.ts: one place to decide, or the rule\n * grows a second copy that nobody updates.\n */\nexport function isReferenceStep(item?: { participation?: ApprovalParticipation | string | null }): boolean {\n const value = item?.participation\n\n /*\n * The same fact arrives spelled two ways, and neither side is wrong.\n *\n * The column holds `reference`, and everything server-side compares against that. GraphQL does\n * not: type-graphql's registerEnumType exposes an enum by its **key**, so the API answers\n * `Reference`. A screen reading `approvalLines { model { participation } }` therefore receives\n * `Reference` and was comparing it to `reference` — false every time.\n *\n * That is why 「표준 3단 결재」 showed its reference step as an approver: no 참조 marker on the\n * list, no quiet styling, and 알림 시점 left editable on a row that is not a reference at all.\n * Four hand-written copies of this check hid it; one place to ask makes it a one-line fix.\n *\n * Both spellings are accepted here, at the boundary, rather than by teaching every caller about\n * the API's casing.\n */\n return typeof value === 'string' && value.toLowerCase() === ApprovalParticipation.Reference\n}\n\n/**\n * The spelling this step should be stored and edited under.\n *\n * isReferenceStep answers the question; this answers with a value, for the places that cannot ask a\n * function. A `<select>` matches its options by string equality, so an option list of `''` and\n * `'reference'` silently selects neither when the API hands back `Reference` — the row then reads\n * as an approver, and the next edit to that row writes the approver spelling back. A reference step\n * turns into an approval with no error and nothing on screen to notice.\n *\n * Approval canonicalises to undefined rather than `'approval'`: rows created before the column\n * existed have nothing there, and empty has to keep meaning approval for those to behave. See\n * ApprovalLineItem.participation.\n */\nexport function storedParticipation(item?: {\n participation?: ApprovalParticipation | string | null\n}): ApprovalParticipation | undefined {\n return isReferenceStep(item) ? ApprovalParticipation.Reference : undefined\n}\n\n/** Is this step one that has to approve before the request moves on? See isReferenceStep. */\nexport function isApprovalStep(item?: { participation?: ApprovalParticipation | string | null }): boolean {\n return !!item && !isReferenceStep(item)\n}\n\n/**\n * 결재선 한 줄을 화면이 어떻게 표시할지 — **셋이 같은 답을 쓰라고 한 자리에 둔다.**\n *\n * 「이 업무에 결재자가 있나」를 화면 셋이 각각 셌다. 업무정의 리스트의 사람 표는 결재선이 **비었는지**만\n * 보고 답해서, 참조만 있는 줄도 사람 아이콘을 그렸다. BatchRelease 가 그랬다 — 두 줄 다 「참조에만\n * 씁니다」인데 목록에는 결재자가 있는 것으로 보였다(2026-09-22, 수석 아키텍트가 화면에서 확인).\n *\n * 참조만 있는 결재선으로 규제를 걸면 **건은 올라가고 아무도 못 내린다.** 참조는 의견을 낼 뿐 판정하지\n * 않기 때문이다.\n *\n * ── 네 갈래로 가른다 ──────────────────────────────────────────────────────\n * 「참조만」을 「아예 없음」과 같이 그리면 고칠 사람이 무엇을 해야 하는지 모른다. 한쪽은 결재선을\n * 만들어야 하고, 다른 쪽은 이미 있는 줄에 결재자를 더해야 한다.\n *\n * none 줄이 없다\n * reference-only 줄은 있는데 결재 단계가 0 이다 — 아무도 못 내린다\n * one 결재자 한 단계\n * many 결재자 여러 단계\n */\nexport type ApprovalLineMark = 'none' | 'reference-only' | 'one' | 'many'\n\nexport function approvalLineMark(line?: { participation?: ApprovalParticipation | string | null }[] | null): ApprovalLineMark {\n if (!Array.isArray(line) || !line.length) {\n return 'none'\n }\n\n const steps = line.filter(isApprovalStep).length\n\n if (!steps) return 'reference-only'\n return steps === 1 ? 'one' : 'many'\n}\n\nexport class ApprovalLineItem {\n type?: OrgMemberTargetType\n value?: string\n approver?: OrgMemberTarget\n\n /**\n * **비어 있으면 결재다.**\n *\n * 지금 도는 결재선에는 이 칸이 없다. 그 항목들이 전부 결재자로 읽혀야 거동이 안 바뀐다.\n */\n participation?: ApprovalParticipation\n\n /**\n * 참조에게 언제 알리나 — 몇 번째 결재가 끝났을 때. 비면 상신 즉시.\n *\n * 배열 자리로 시점을 표현하지 않는다. 참조 항목의 자리는 뜻이 없고 결재 차례를 소비하지 않는다.\n * 편집기가 항목을 목록 끝에 붙이므로, 자리로 하면 기본값이 「마지막 결재 뒤」가 되어 의견 낼 기회가\n * 아예 없는 쪽이 기본이 된다.\n */\n notifyAfter?: number\n}\n\nexport class ApprovalLine {\n readonly id?: string\n\n domain?: Domain\n\n domainId?: string\n\n name?: string\n\n description?: string\n\n model?: ApprovalLineItem[]\n\n ownerType?: ApprovalLineOwnerType\n\n ownerValue?: string\n\n ownerEmployee?: Employee\n\n ownerDepartment?: Department\n\n ownerRole?: Role\n\n createdAt?: Date\n\n updatedAt?: Date\n\n creator?: User\n\n creatorId?: string\n\n updater?: User\n\n updaterId?: string\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/organization",
3
- "version": "10.1.34",
3
+ "version": "10.1.37",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -36,10 +36,10 @@
36
36
  "@operato/p13n": "^10.0.0",
37
37
  "@operato/popup": "^10.15.0",
38
38
  "@operato/shell": "^10.0.0",
39
- "@things-factory/auth-base": "^10.1.34",
40
- "@things-factory/code-ui": "^10.1.34",
41
- "@things-factory/contact": "^10.1.34",
42
- "@things-factory/shell": "^10.1.34"
39
+ "@things-factory/auth-base": "^10.1.37",
40
+ "@things-factory/code-ui": "^10.1.37",
41
+ "@things-factory/contact": "^10.1.37",
42
+ "@things-factory/shell": "^10.1.37"
43
43
  },
44
- "gitHead": "5e16fd9f0cbb71c8d395b58a95bd9e99c93975c7"
44
+ "gitHead": "d8a69e5c8803a4b9d3289df0cf38e161a207db61"
45
45
  }
@@ -0,0 +1,68 @@
1
+ import { readFileSync } from 'fs'
2
+ import path from 'path'
3
+
4
+ import { approvalLineMark } from '../client/types/approval-line'
5
+
6
+ /**
7
+ * 「이 업무에 결재자가 있나」를 화면 셋이 각각 셌다. 업무정의 리스트의 사람 표만 결재선이 비었는지로
8
+ * 답해서, 참조만 있는 줄도 사람 아이콘을 얻었다 — BatchRelease 가 그랬다.
9
+ *
10
+ * 참조는 의견을 낼 뿐 판정하지 않는다. 참조만 있는 결재선으로 규제를 걸면 건은 올라가고 아무도 못
11
+ * 내린다.
12
+ *
13
+ * 이 고침이 가르는 축을 먼저 적는다:
14
+ * ① 줄이 없다 → none
15
+ * ② 줄은 있고 결재 0 → reference-only ← 전에는 person/group 이 나오던 자리
16
+ * ③ 결재 1 → one
17
+ * ④ 결재 2 이상 → many
18
+ * ⑤ 빈 participation → 결재다 (옛 행)
19
+ * ⑥ 렌더러가 길이가 아니라 이 답으로 그린다
20
+ */
21
+
22
+ const approval = { participation: undefined }
23
+ const reference = { participation: 'reference' }
24
+
25
+ describe('approval line mark', () => {
26
+ it('★ 줄이 없으면 아무것도 아니다', () => {
27
+ expect(approvalLineMark(undefined)).toEqual('none')
28
+ expect(approvalLineMark(null)).toEqual('none')
29
+ expect(approvalLineMark([])).toEqual('none')
30
+ })
31
+
32
+ it('★ 참조만 있는 줄은 결재자가 있는 것으로 세지 않는다', () => {
33
+ expect(approvalLineMark([reference])).toEqual('reference-only')
34
+ expect(approvalLineMark([reference, reference])).toEqual('reference-only')
35
+ })
36
+
37
+ it('★ 참조만 있는 것과 줄이 아예 없는 것을 가른다', () => {
38
+ /* 고칠 사람이 할 일이 다르다 — 하나는 줄을 만들고, 하나는 그 줄에 결재자를 더한다. */
39
+ expect(approvalLineMark([reference])).not.toEqual(approvalLineMark([]))
40
+ })
41
+
42
+ it('★ 결재 단계를 센다. 줄의 길이가 아니다', () => {
43
+ expect(approvalLineMark([approval])).toEqual('one')
44
+ expect(approvalLineMark([approval, reference])).toEqual('one')
45
+ expect(approvalLineMark([reference, approval, reference])).toEqual('one')
46
+ expect(approvalLineMark([approval, approval])).toEqual('many')
47
+ expect(approvalLineMark([reference, approval, approval])).toEqual('many')
48
+ })
49
+
50
+ it('빈 participation 은 결재다 — 그 칸이 생기기 전에 쌓인 줄이 있다', () => {
51
+ expect(approvalLineMark([{}])).toEqual('one')
52
+ expect(approvalLineMark([{ participation: null }])).toEqual('one')
53
+ })
54
+
55
+ it('★ 격자 칸이 줄의 길이로 가르지 않는다', () => {
56
+ /*
57
+ * 전에는 `value.length == 1` 로 person 을, 그보다 많으면 group 을 그렸다. 그 셈은 참조를
58
+ * 결재자로 읽는다. 이 줄이 없으면 렌더러가 다시 자기 셈을 쓴다.
59
+ */
60
+ const source = readFileSync(
61
+ path.resolve(__dirname, '..', 'client', 'grist-editor', 'grist-renderer-approval-line.ts'),
62
+ 'utf-8'
63
+ ).replace(/\/\*[\s\S]*?\*\//g, '')
64
+
65
+ expect(/approvalLineMark\(/.test(source)).toEqual(true)
66
+ expect(/value\.length/.test(source)).toEqual(false)
67
+ })
68
+ })
@@ -50,6 +50,9 @@
50
50
  "prompt.sure to empty approval line ?": "sure to empty approval line ?",
51
51
  "text.add the first department": "fill in a control number and a name, then add",
52
52
  "text.all departments": "everyone",
53
+ "text.approval-line has one approver": "one approval step",
54
+ "text.approval-line has references only": "references only — nobody here can approve it",
55
+ "text.approval-line has several approvers": "several approval steps",
53
56
  "text.approval-line-empty": "no approver — a submission completes at once",
54
57
  "text.approver-unknown": "(no name)",
55
58
  "text.deleted": "deleted",
@@ -10,8 +10,8 @@
10
10
  "button.view": "表示",
11
11
  "error.contact-information-required": "この従業員には連絡先情報が必要です。",
12
12
  "error.employee-already-registered": "この従業員はすでにシステムユーザーとして登録されています。",
13
- "error.multiple-employees-for-user": "このアカウントに紐づく社員情報が複数あり、どの社員として処理するか判断できません。ドメイン管理者が一つだけ残す必要があります。",
14
- "error.no-employee-for-user": "このアカウントに紐づく社員情報がありません。ドメイン管理者が社員一覧で紐づけできます。",
13
+ "error.multiple-employees-for-user": "このアカウントに紐づく社員情報が複数あり、どの社員として処理するか判断できません。$t(term.domain)管理者が一つだけ残す必要があります。",
14
+ "error.no-employee-for-user": "このアカウントに紐づく社員情報がありません。$t(term.domain)管理者が社員一覧で紐づけできます。",
15
15
  "field.approval-line": "決裁ライン",
16
16
  "field.approver": "決裁者",
17
17
  "field.control-no": "管理番号",
@@ -50,6 +50,9 @@
50
50
  "prompt.sure to empty approval line ?": "承認ラインを空にしますか?",
51
51
  "text.add the first department": "管理番号と名前を入力して追加してください",
52
52
  "text.all departments": "全体",
53
+ "text.approval-line has one approver": "承認 1段階",
54
+ "text.approval-line has references only": "参照のみです — 承認できる方がいません",
55
+ "text.approval-line has several approvers": "承認 複数段階",
53
56
  "text.approval-line-empty": "決裁者がいません — 提出すると即完了します",
54
57
  "text.approver-unknown": "(名前なし)",
55
58
  "text.deleted": "削除しました",
@@ -10,8 +10,8 @@
10
10
  "button.view": "보기",
11
11
  "error.contact-information-required": "해당 직원의 연락처 정보가 필요합니다.",
12
12
  "error.employee-already-registered": "해당 직원은 이미 시스템 사용자로 등록되어 있습니다.",
13
- "error.multiple-employees-for-user": "이 계정에 연결된 직원 정보가 둘 이상이어서 어느 직원으로 처리할지 알 수 없습니다. 도메인 관리자가 하나만 남겨야 합니다.",
14
- "error.no-employee-for-user": "이 계정에 연결된 직원 정보가 없습니다. 도메인 관리자가 직원 목록에서 연결해 줄 수 있습니다.",
13
+ "error.multiple-employees-for-user": "이 계정에 연결된 직원 정보가 둘 이상이어서 어느 직원으로 처리할지 알 수 없습니다. $t(term.domain) 관리자가 하나만 남겨야 합니다.",
14
+ "error.no-employee-for-user": "이 계정에 연결된 직원 정보가 없습니다. $t(term.domain) 관리자가 직원 목록에서 연결해 줄 수 있습니다.",
15
15
  "field.approval-line": "결재선",
16
16
  "field.approver": "결재자",
17
17
  "field.control-no": "관리 번호",
@@ -50,6 +50,9 @@
50
50
  "prompt.sure to empty approval line ?": "결재라인을 비우시겠습니까 ?",
51
51
  "text.add the first department": "관리번호와 이름을 적고 추가하십시오",
52
52
  "text.all departments": "전체",
53
+ "text.approval-line has one approver": "결재 1단계",
54
+ "text.approval-line has references only": "참조만 있습니다 — 결재할 사람이 없습니다",
55
+ "text.approval-line has several approvers": "결재 여러 단계",
53
56
  "text.approval-line-empty": "결재자가 없습니다 — 올리면 곧 완료됩니다",
54
57
  "text.approver-unknown": "(이름 없음)",
55
58
  "text.deleted": "삭제했습니다",
@@ -50,6 +50,9 @@
50
50
  "prompt.sure to empty approval line ?": "pasti mahu kosongkan garis kelulusan?",
51
51
  "text.add the first department": "isi nombor kawalan dan nama, kemudian tambah",
52
52
  "text.all departments": "semua",
53
+ "text.approval-line has one approver": "satu langkah kelulusan",
54
+ "text.approval-line has references only": "rujukan sahaja — tiada sesiapa di sini boleh meluluskannya",
55
+ "text.approval-line has several approvers": "beberapa langkah kelulusan",
53
56
  "text.approval-line-empty": "tiada pelulus — penghantaran selesai serta-merta",
54
57
  "text.approver-unknown": "(tiada nama)",
55
58
  "text.deleted": "dipadam",
@@ -10,8 +10,8 @@
10
10
  "button.view": "查看",
11
11
  "error.contact-information-required": "该员工需要联系信息。",
12
12
  "error.employee-already-registered": "该员工已注册为系统用户。",
13
- "error.multiple-employees-for-user": "此账号关联了多条员工信息,无法判断以哪一位员工身份处理。域管理员需只保留一条。",
14
- "error.no-employee-for-user": "此账号未关联员工信息。域管理员可在员工列表中进行关联。",
13
+ "error.multiple-employees-for-user": "此账号关联了多条员工信息,无法判断以哪一位员工身份处理。$t(term.domain)管理员需只保留一条。",
14
+ "error.no-employee-for-user": "此账号未关联员工信息。$t(term.domain)管理员可在员工列表中进行关联。",
15
15
  "field.approval-line": "审批线",
16
16
  "field.approver": "审批人",
17
17
  "field.control-no": "控制编号",
@@ -50,6 +50,9 @@
50
50
  "prompt.sure to empty approval line ?": "确定要清空审批行吗?",
51
51
  "text.add the first department": "填写管理编号和名称后添加",
52
52
  "text.all departments": "全部",
53
+ "text.approval-line has one approver": "审批 1 个环节",
54
+ "text.approval-line has references only": "仅为参照 — 此处无人可审批",
55
+ "text.approval-line has several approvers": "审批多个环节",
53
56
  "text.approval-line-empty": "没有审批人 — 提交后立即完成",
54
57
  "text.approver-unknown": "(无名称)",
55
58
  "text.deleted": "已删除",