@wipco/sdui 0.26.0 → 0.28.0

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/meta.js CHANGED
@@ -3416,6 +3416,326 @@ var RankBoardMeta = {
3416
3416
  },
3417
3417
  resize: { kind: "none" }
3418
3418
  };
3419
+ var customApproverItem = [
3420
+ { name: "id", kind: "string", label: "\uC2DD\uBCC4\uC790", required: true },
3421
+ { name: "name", kind: "string", label: "\uD45C\uC2DC\uBA85", required: true },
3422
+ {
3423
+ name: "type",
3424
+ kind: "enum",
3425
+ label: "\uC885\uB958",
3426
+ required: true,
3427
+ options: [
3428
+ { value: "user", label: "\uC9C1\uC6D0" },
3429
+ { value: "group", label: "\uBD80\uC11C\xB7\uADF8\uB8F9" }
3430
+ ]
3431
+ }
3432
+ ];
3433
+ var approvalLineStepItem = [
3434
+ { name: "id", kind: "string", label: "\uC2A4\uD15D id", required: true },
3435
+ {
3436
+ name: "type",
3437
+ kind: "enum",
3438
+ label: "\uC720\uD615",
3439
+ description: "\uC5C6\uC73C\uBA74 \uBC31\uC5D4\uB4DC\uAC00 custom\uC73C\uB85C \uCDE8\uAE09\uD55C\uB2E4(\uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC774\uAD00 \uC2A4\uD15D \uD638\uD658).",
3440
+ options: [
3441
+ { value: "team_leader", label: "\uD300\uC7A5" },
3442
+ { value: "division_head", label: "\uBCF8\uBD80\uC7A5\xB7\uC2E4\uC7A5" },
3443
+ { value: "custom", label: "\uC0AC\uC6A9\uC790 \uC9C0\uC815" }
3444
+ ]
3445
+ },
3446
+ {
3447
+ name: "name",
3448
+ kind: "string",
3449
+ label: "\uD45C\uC2DC\uBA85",
3450
+ description: "\uBC31\uC5D4\uB4DC\uAC00 \uACB0\uC7AC \uB2E8\uACC4 \uC124\uBA85\uC73C\uB85C \uADF8\uB300\uB85C \uC4F4\uB2E4. \uC5C6\uC73C\uBA74 type\uC73C\uB85C \uB300\uC2E0\uD55C\uB2E4."
3451
+ },
3452
+ {
3453
+ name: "order",
3454
+ kind: "number",
3455
+ label: "\uC21C\uBC88",
3456
+ required: true,
3457
+ description: "1\uBD80\uD130. \uD3B8\uC9D1\uAE30\uAC00 \uAC12\uC744 \uBC14\uAFC0 \uB54C\uB9C8\uB2E4 1..n\uC73C\uB85C \uC815\uADDC\uD654\uD55C\uB2E4."
3458
+ },
3459
+ {
3460
+ name: "customApprovers",
3461
+ kind: "array",
3462
+ label: "\uC9C0\uC815 \uACB0\uC7AC\uC790",
3463
+ description: "type\uC774 custom\uC77C \uB54C\uB9CC \uC758\uBBF8\uAC00 \uC788\uB2E4. \uC2A4\uD399 \uB9AC\uD130\uB7F4\uC5D0\uB294 \uD55C \uBC88\uB3C4 \uB4F1\uC7A5\uD558\uC9C0 \uC54A\uC558\uACE0, \uD615\uD0DC\uC758 \uADFC\uAC70\uB294 \uC800\uC7A5 JSON \uACC4\uC57D\uC774\uB2E4.",
3464
+ item: customApproverItem
3465
+ }
3466
+ ];
3467
+ var ApprovalLineEditorMeta = {
3468
+ name: "ApprovalLineEditor",
3469
+ label: "\uAE30\uBCF8 \uACB0\uC7AC\uC120 \uD3B8\uC9D1\uAE30",
3470
+ category: "input",
3471
+ icon: "route",
3472
+ description: "\uACB0\uC7AC \uB2E8\uACC4\uB97C \uCD94\uAC00\xB7\uC0AD\uC81C\xB7\uC7AC\uC815\uB82C\uD558\uB294 controlled \uD3B8\uC9D1\uAE30. \uC800\uC7A5 JSON(approval_forms.default_steps)\uC758 \uD0A4\uB97C \uADF8\uB300\uB85C \uC4F4\uB2E4.",
3473
+ props: [
3474
+ {
3475
+ name: "value",
3476
+ kind: "array",
3477
+ label: "\uACB0\uC7AC\uC120",
3478
+ required: true,
3479
+ bindable: true,
3480
+ description: "\uC2A4\uD15D \uBC30\uC5F4. \uC2E4\uCE21 4/4\uAC00 \uC804\uBD80 $state \uBC14\uC778\uB529\uC774\uB2E4.",
3481
+ group: "data",
3482
+ item: approvalLineStepItem
3483
+ },
3484
+ {
3485
+ name: "onChange",
3486
+ kind: "action",
3487
+ label: "\uACB0\uC7AC\uC120 \uBCC0\uACBD",
3488
+ required: true,
3489
+ eventArg: "order\uB97C 1..n\uC73C\uB85C \uC815\uADDC\uD654\uD55C \uC2A4\uD15D \uBC30\uC5F4",
3490
+ group: "behavior"
3491
+ },
3492
+ // 실측 4/4 — 전부 setState + fromEvent
3493
+ {
3494
+ name: "options",
3495
+ kind: "array",
3496
+ label: "\uACB0\uC7AC\uC790 \uD6C4\uBCF4",
3497
+ bindable: true,
3498
+ description: "\uAC80\uC0C9 \uACBD\uB85C\uAC00 \uC5C6\uC744 \uB54C \uB85C\uCEEC \uAC80\uC0C9 \uB300\uC0C1.",
3499
+ group: "data",
3500
+ item: customApproverItem
3501
+ },
3502
+ // 실측 4/4 (원소 28개)
3503
+ {
3504
+ name: "searchEndpoint",
3505
+ kind: "string",
3506
+ label: "\uACB0\uC7AC\uC790 \uAC80\uC0C9 \uACBD\uB85C",
3507
+ description: "GET {\uACBD\uB85C}?q=\u2026 \uB85C \uC9C1\uC6D0\xB7\uBD80\uC11C\uB97C \uD1B5\uD569 \uAC80\uC0C9\uD55C\uB2E4. \uC5C6\uC73C\uBA74 options\uB85C \uB85C\uCEEC \uAC80\uC0C9\uB9CC \uD55C\uB2E4.",
3508
+ group: "data",
3509
+ advanced: true
3510
+ },
3511
+ // 실측 0/4 — 구현에는 있다
3512
+ {
3513
+ name: "groupSearchEndpoint",
3514
+ kind: "string",
3515
+ label: "\uBD80\uC11C \uAC80\uC0C9 \uACBD\uB85C",
3516
+ description: "\uC8FC\uBA74 searchEndpoint\uC640 \uBCD1\uB82C\uB85C \uC870\uD68C\uD574 \uACB0\uACFC\uB97C \uD569\uCE5C\uB2E4(v2\uC758 /employees + /departments \uBCD1\uB82C \uAC80\uC0C9\uACFC \uAC19\uC740 \uBAA8\uC591). \uC774 \uACBD\uB85C\uC758 \uC751\uB2F5\uC740 \uC804\uBD80 \uADF8\uB8F9\uC73C\uB85C \uCDE8\uAE09\uD55C\uB2E4.",
3517
+ group: "data",
3518
+ advanced: true
3519
+ },
3520
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
3521
+ // 실측 0/4
3522
+ ],
3523
+ children: { accepts: false },
3524
+ dom: { element: "div" },
3525
+ // 실측: 루트가 <div class="wp-col">
3526
+ // 프리셋에 searchEndpoint를 넣지 않는다 — 소스가 `if (searchEndpoint)`로 감싸고 있어
3527
+ // 미지정이면 fetch 경로 자체가 없다. default에 2스텝을 넣어 빈 상태가 아닌 모습을 보여 준다.
3528
+ preset: {
3529
+ component: "ApprovalLineEditor",
3530
+ props: {
3531
+ value: {
3532
+ $state: "approvalLineForm.defaultSteps",
3533
+ default: [
3534
+ { id: "st1", name: "\uD300\uC7A5", type: "team_leader", order: 1 },
3535
+ { id: "st2", name: "\uBCF8\uBD80\uC7A5", type: "division_head", order: 2 }
3536
+ ]
3537
+ },
3538
+ onChange: { action: "setState", key: "approvalLineForm.defaultSteps", fromEvent: true },
3539
+ options: [
3540
+ { id: "u1", name: "\uAE40\uB3C4\uD604", type: "user" },
3541
+ { id: "u2", name: "\uC774\uC11C\uC5F0", type: "user" },
3542
+ { id: "g1", name: "\uC778\uC0AC\uD300", type: "group" }
3543
+ ]
3544
+ }
3545
+ },
3546
+ resize: { kind: "none" }
3547
+ };
3548
+ var ApprovalOverridesEditorMeta = {
3549
+ name: "ApprovalOverridesEditor",
3550
+ label: "\uACB0\uC7AC\uC120 \uC624\uBC84\uB77C\uC774\uB4DC \uD3B8\uC9D1\uAE30",
3551
+ category: "input",
3552
+ icon: "layers",
3553
+ description: "\uC9C1\uCC45\xB7\uC9C1\uAE09\uBCC4\uB85C \uAE30\uBCF8 \uACB0\uC7AC\uC120 \uB300\uC2E0 \uC801\uC6A9\uD560 \uACB0\uC7AC\uB77C\uC778 \uBAA9\uB85D. \uC9C1\uCC45\uACFC \uC9C1\uAE09\uC740 OR\uC774\uACE0, \uC704\uC5D0\uC11C\uBD80\uD130 \uBA3C\uC800 \uB9DE\uB294 \uAC83\uC774 \uC6B0\uC120\uD55C\uB2E4.",
3554
+ props: [
3555
+ {
3556
+ name: "value",
3557
+ kind: "array",
3558
+ label: "\uC624\uBC84\uB77C\uC774\uB4DC \uBAA9\uB85D",
3559
+ required: true,
3560
+ bindable: true,
3561
+ description: "\uC2E4\uCE21 2/2\uAC00 \uC804\uBD80 $state \uBC14\uC778\uB529\uC774\uACE0 default\uAC00 \uBE48 \uBC30\uC5F4\uC774\uB2E4. \uC6D0\uC18C \uB9AC\uD130\uB7F4\uC740 \uC2A4\uD399\uC5D0 \uD55C \uAC74\uB3C4 \uC5C6\uC5B4 \uD615\uD0DC\uC758 \uADFC\uAC70\uB294 \uC800\uC7A5 JSON \uACC4\uC57D(approval_forms.line_overrides)\uC774\uB2E4.",
3562
+ group: "data",
3563
+ item: [
3564
+ { name: "id", kind: "string", label: "\uC2DD\uBCC4\uC790", required: true },
3565
+ { name: "name", kind: "string", label: "\uADDC\uCE59 \uC774\uB984", required: true },
3566
+ { name: "jobTitles", kind: "array", label: "\uC801\uC6A9 \uC9C1\uCC45", item: [], itemKind: "string" },
3567
+ { name: "grades", kind: "array", label: "\uC801\uC6A9 \uC9C1\uAE09", item: [], itemKind: "string" },
3568
+ {
3569
+ name: "entityTypes",
3570
+ kind: "array",
3571
+ label: "\uC801\uC6A9 \uC5C5\uBB34\uC720\uD615(\uB808\uAC70\uC2DC)",
3572
+ description: '\uB808\uAC70\uC2DC \uC774\uAD00 \uD0A4 \u2014 UI\uAC00 \uD3B8\uC9D1\uD558\uC9C0 \uC54A\uACE0 spread\uB85C \uBCF4\uC874\uB9CC \uD55C\uB2E4. \uB2E4\uB9CC \uC801\uC6A9 \uC870\uAC74\uC774\uB77C, \uC9C1\uCC45\xB7\uC9C1\uAE09\uC774 \uBAA8\uB450 \uBE44\uC5C8\uC744 \uB54C \uC774 \uAC12\uC758 \uC720\uBB34\uB85C "\uC804 \uC9C1\uC6D0 \uC801\uC6A9"\uACFC "\uB9E4\uCE6D \uC548 \uB428"\uC774 \uAC08\uB9B0\uB2E4.',
3573
+ item: [],
3574
+ itemKind: "string",
3575
+ advanced: true
3576
+ },
3577
+ { name: "steps", kind: "array", label: "\uACB0\uC7AC\uC120", item: approvalLineStepItem }
3578
+ ]
3579
+ },
3580
+ {
3581
+ name: "onChange",
3582
+ kind: "action",
3583
+ label: "\uC624\uBC84\uB77C\uC774\uB4DC \uBCC0\uACBD",
3584
+ required: true,
3585
+ eventArg: "\uBCC0\uACBD\uB41C \uC624\uBC84\uB77C\uC774\uB4DC \uBC30\uC5F4(\uC54C \uC218 \uC5C6\uB294 \uD0A4\uB294 \uADF8\uB300\uB85C \uBCF4\uC874\uB41C\uB2E4)",
3586
+ group: "behavior"
3587
+ },
3588
+ // 실측 2/2
3589
+ {
3590
+ name: "jobTitleOptions",
3591
+ kind: "array",
3592
+ label: "\uC9C1\uCC45 \uD6C4\uBCF4",
3593
+ required: true,
3594
+ bindable: true,
3595
+ description: "\uC9C1\uC6D0 \uB370\uC774\uD130\uC5D0\uC11C distinct\uB85C \uBF51\uC740 \uBB38\uC790\uC5F4 \uBAA9\uB85D.",
3596
+ group: "data",
3597
+ item: [],
3598
+ itemKind: "string"
3599
+ },
3600
+ // 실측 2/2 (원소 10개)
3601
+ {
3602
+ name: "gradeOptions",
3603
+ kind: "array",
3604
+ label: "\uC9C1\uAE09 \uD6C4\uBCF4",
3605
+ required: true,
3606
+ bindable: true,
3607
+ group: "data",
3608
+ item: [],
3609
+ itemKind: "string"
3610
+ },
3611
+ // 실측 2/2 (원소 15개)
3612
+ {
3613
+ name: "searchOptions",
3614
+ kind: "array",
3615
+ label: "\uACB0\uC7AC\uC790 \uD6C4\uBCF4",
3616
+ bindable: true,
3617
+ description: "\uC911\uCCA9\uB41C \uACB0\uC7AC\uC120 \uD3B8\uC9D1\uAE30\uB85C \uADF8\uB300\uB85C \uC804\uB2EC\uB41C\uB2E4. \uAC80\uC0C9 \uACBD\uB85C\uAC00 \uC5C6\uC744 \uB54C\uC758 \uB85C\uCEEC \uAC80\uC0C9 \uB300\uC0C1.",
3618
+ group: "data",
3619
+ item: customApproverItem
3620
+ },
3621
+ // 실측 2/2 (원소 15개)
3622
+ {
3623
+ name: "facetsEndpoint",
3624
+ kind: "string",
3625
+ label: "\uC9C1\uCC45\xB7\uC9C1\uAE09 \uC635\uC158 \uACBD\uB85C",
3626
+ description: "\uC9C1\uC6D0 \uBAA9\uB85D \uACBD\uB85C(\uC608: /employees?limit=500). \uC751\uB2F5\uC758 job_title\xB7grade\uB97C distinct \uCD94\uCD9C\uD574 \uC815\uC801 \uC635\uC158 \uBAA9\uB85D\uC5D0 \uD569\uCE5C\uB2E4 \u2014 v2\uAC00 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC9C1\uC811 \uD558\uB358 \uC870\uD68C\uB2E4.",
3627
+ group: "data",
3628
+ advanced: true
3629
+ },
3630
+ {
3631
+ name: "searchEndpoint",
3632
+ kind: "string",
3633
+ label: "\uACB0\uC7AC\uC790 \uAC80\uC0C9 \uACBD\uB85C",
3634
+ description: "\uC911\uCCA9\uB41C \uACB0\uC7AC\uC120 \uD3B8\uC9D1\uAE30\uB85C \uADF8\uB300\uB85C \uC804\uB2EC\uB41C\uB2E4.",
3635
+ group: "data",
3636
+ advanced: true
3637
+ },
3638
+ // 실측 0/2
3639
+ {
3640
+ name: "groupSearchEndpoint",
3641
+ kind: "string",
3642
+ label: "\uBD80\uC11C \uAC80\uC0C9 \uACBD\uB85C",
3643
+ description: "\uC911\uCCA9\uB41C \uACB0\uC7AC\uC120 \uD3B8\uC9D1\uAE30\uB85C \uADF8\uB300\uB85C \uC804\uB2EC\uB41C\uB2E4 \u2014 searchEndpoint\uC640 \uBCD1\uB82C \uC870\uD68C.",
3644
+ group: "data",
3645
+ advanced: true
3646
+ },
3647
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
3648
+ // 실측 0/2
3649
+ ],
3650
+ children: { accepts: false },
3651
+ dom: { element: "div" },
3652
+ // 실측: 루트가 <div class="wp-col">
3653
+ // searchEndpoint 금지는 ApprovalLineEditor와 같은 이유다 — 중첩 편집기로 그대로 내려간다.
3654
+ preset: {
3655
+ component: "ApprovalOverridesEditor",
3656
+ props: {
3657
+ value: { $state: "approvalLineForm.lineOverrides", default: [] },
3658
+ onChange: { action: "setState", key: "approvalLineForm.lineOverrides", fromEvent: true },
3659
+ jobTitleOptions: ["\uBCF8\uBD80\uC7A5", "\uD300\uC7A5", "\uD30C\uD2B8\uC7A5"],
3660
+ gradeOptions: ["\uC0AC\uC6D0", "\uB300\uB9AC", "\uACFC\uC7A5", "\uBD80\uC7A5"],
3661
+ searchOptions: [
3662
+ { id: "u1", name: "\uAE40\uB3C4\uD604", type: "user" },
3663
+ { id: "g1", name: "\uC778\uC0AC\uD300", type: "group" }
3664
+ ]
3665
+ }
3666
+ },
3667
+ resize: { kind: "none" }
3668
+ };
3669
+ var OrgChartBoardMeta = {
3670
+ name: "OrgChartBoard",
3671
+ label: "\uC870\uC9C1\uB3C4 \uBCF4\uB4DC",
3672
+ category: "display",
3673
+ icon: "git-branch",
3674
+ description: "\uC2E4\uB370\uC774\uD130 \uC870\uC9C1\uB3C4 \uCE94\uBC84\uC2A4(v2 \uC774\uC2DD). /employees\xB7/departments?include=paths\xB7/job-positions 3\uC6D0\uC744 \uC2A4\uC2A4\uB85C \uD398\uC774\uC9C0 \uC218\uC9D1\uD574 \uB9AC\uB354\uC2ED \uC2A4\uD0DD\xB7\uBCF8\uBD80 \uC0C9 \uD5E4\uB354\xB7\uC138\uB85C\uC4F0\uAE30 \uD300 \uB77C\uBCA8\xB72\uC5F4 \uAD6C\uC131\uC6D0 \uADF8\uB9AC\uB4DC\uB85C \uADF8\uB9B0\uB2E4(\uBD80\uC11C\xB7\uC9C1\uC704 \uC870\uD68C\uB294 \uC2E4\uD328 \uD5C8\uC6A9). \uAD6C\uC131\uC6D0 \uC815\uB82C\uC740 \uC9C1\uCC45\u2192\uC9C1\uC704 \uB9C8\uC2A4\uD130 rank_order(\uCD5C\uC7A5 \uD3EC\uD568 \uB9E4\uCE6D)\u2192GRADE_ORDER \uD3F4\uBC31\u2192level\u2192\uC774\uB984. \uD720 \uC90C\xB7\uB4DC\uB798\uADF8 \uD32C\xB7\uC804\uCCB4\uD654\uBA74 \uB0B4\uC7A5, \uBBF8\uC9C0\uC815 \uADF8\uB8F9\uC740 \uC228\uAE34\uB2E4.",
3675
+ props: [
3676
+ {
3677
+ name: "onMemberClick",
3678
+ kind: "action",
3679
+ label: "\uC0AC\uC6D0 \uCE74\uB4DC \uD074\uB9AD",
3680
+ eventArg: "\uC0AC\uC6D0 \uD589(snake_case \uC6D0\uBB38 \u2014 id\xB7name\xB7grade\xB7job_title\xB7department_id \u2026)",
3681
+ description: "\uBE44\uC6B0\uBA74 \uC704\uC82F\uC774 /hr/personal-card/{id}\uB85C \uC9C1\uC811 \uC774\uB3D9\uD55C\uB2E4.",
3682
+ group: "behavior"
3683
+ },
3684
+ {
3685
+ name: "height",
3686
+ kind: "string",
3687
+ label: "\uCE94\uBC84\uC2A4 \uB192\uC774",
3688
+ default: "72vh",
3689
+ description: "px \uC22B\uC790 \uB610\uB294 CSS \uAE38\uC774. \uCD5C\uC18C 620px\uB294 \uC704\uC82F\uC774 \uBCF4\uC7A5\uD55C\uB2E4.",
3690
+ group: "appearance",
3691
+ advanced: true
3692
+ },
3693
+ {
3694
+ name: "employeesEndpoint",
3695
+ kind: "string",
3696
+ label: "\uC0AC\uC6D0 \uBAA9\uB85D \uACBD\uB85C",
3697
+ description: "\uC751\uB2F5\uC740 {data:[\u2026], total}. \uD589\uC5D0\uC11C id\xB7name\xB7grade\xB7job_title\xB7department_id \uB97C \uC77D\uB294\uB2E4(\uC2A4\uB124\uC774\uD06C\xB7\uCE74\uBA5C \uAD00\uC6A9 \uC218\uC6A9). \uAE30\uBCF8 '/employees'.",
3698
+ group: "data",
3699
+ advanced: true
3700
+ },
3701
+ {
3702
+ name: "departmentsEndpoint",
3703
+ kind: "string",
3704
+ label: "\uBD80\uC11C \uBAA9\uB85D \uACBD\uB85C",
3705
+ description: "\uAE30\uBCF8 '/departments?include=paths' \u2014 \uACBD\uB85C \uC815\uBCF4\uAC00 \uC788\uC5B4\uC57C \uACC4\uCE35\uC774 \uC120\uB2E4.",
3706
+ group: "data",
3707
+ advanced: true
3708
+ },
3709
+ {
3710
+ name: "positionsEndpoint",
3711
+ kind: "string",
3712
+ label: "\uC9C1\uC704 \uB9C8\uC2A4\uD130 \uACBD\uB85C",
3713
+ description: "\uC11C\uC5F4 \uC815\uB82C\uC5D0 \uC4F4\uB2E4. \uC2E4\uD328\uD574\uB3C4 \uC774\uB984\uC21C\uC73C\uB85C \uB5A8\uC5B4\uC9C4\uB2E4. \uAE30\uBCF8 '/job-positions'.",
3714
+ group: "data",
3715
+ advanced: true
3716
+ }
3717
+ ],
3718
+ children: { accepts: false },
3719
+ dom: { element: "div" },
3720
+ preset: {
3721
+ component: "OrgChartBoard",
3722
+ props: {
3723
+ onMemberClick: [
3724
+ { action: "setState", key: "orgMember", fromEvent: true },
3725
+ {
3726
+ action: "navigate",
3727
+ to: {
3728
+ $calc: {
3729
+ op: "concat",
3730
+ args: ["/hr/personal-card/", { $state: "orgMember.id", default: "" }]
3731
+ }
3732
+ }
3733
+ }
3734
+ ]
3735
+ }
3736
+ },
3737
+ resize: { kind: "none" }
3738
+ };
3419
3739
  var AutocompleteFieldMeta = {
3420
3740
  name: "AutocompleteField",
3421
3741
  label: "\uC790\uB3D9\uC644\uC131",
@@ -4833,7 +5153,10 @@ var StripMeta = {
4833
5153
  resize: { kind: "none" }
4834
5154
  };
4835
5155
  var widgetComponentMeta = {
5156
+ ApprovalLineEditor: ApprovalLineEditorMeta,
5157
+ ApprovalOverridesEditor: ApprovalOverridesEditorMeta,
4836
5158
  ApprovalStepper: ApprovalStepperMeta,
5159
+ OrgChartBoard: OrgChartBoardMeta,
4837
5160
  RankBoard: RankBoardMeta,
4838
5161
  AutocompleteField: AutocompleteFieldMeta,
4839
5162
  ColumnBoard: ColumnBoardMeta,
@@ -4892,4 +5215,4 @@ function paletteGroups(catalog = allComponentMeta) {
4892
5215
  })).filter((group) => group.items.length > 0);
4893
5216
  }
4894
5217
 
4895
- export { ActionsMeta, AlertMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, FieldMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PrintSheetMeta, ProgressBarMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RowMeta, SDUI_CATEGORIES, SELF_AXIS_PROPS, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
5218
+ export { ActionsMeta, AlertMeta, ApprovalLineEditorMeta, ApprovalOverridesEditorMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, FieldMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OrgChartBoardMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PrintSheetMeta, ProgressBarMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RowMeta, SDUI_CATEGORIES, SELF_AXIS_PROPS, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
@@ -0,0 +1,43 @@
1
+ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
2
+ import React__default from 'react';
3
+
4
+ /** 저장 JSON 계약(approval-line) — 키 이름 변경 금지. */
5
+ interface CustomApprover {
6
+ id: string;
7
+ name: string;
8
+ type: 'user' | 'group';
9
+ }
10
+ /** 저장 JSON 계약(approval-line) — 키 이름 변경 금지. */
11
+ interface ApprovalLineStep {
12
+ id: string;
13
+ /** 없으면 백엔드가 custom으로 취급한다(마이그레이션 이관 스텝 호환). */
14
+ type?: 'team_leader' | 'division_head' | 'custom';
15
+ /** 스텝 표시명 — 백엔드가 결재 단계 설명으로 그대로 쓴다(없으면 type). */
16
+ name?: string;
17
+ customApprovers?: CustomApprover[];
18
+ order: number;
19
+ }
20
+ interface ApprovalLineEditorProps {
21
+ value: ApprovalLineStep[];
22
+ onChange: (steps: ApprovalLineStep[]) => void;
23
+ /** 직원·부서 통합 검색 경로 — GET {endpoint}?q=… (어댑터 fetch). */
24
+ searchEndpoint?: string;
25
+ /**
26
+ * 부서(그룹) 검색 경로 — 주면 searchEndpoint 와 **병렬로** 조회해 결과를 합친다.
27
+ * v2 원본이 이 모양이다: `/employees?q=` 와 `/departments?q=` 를 동시에 던져
28
+ * 사용자·그룹을 한 목록으로 보여 준다(approval-step-editor.tsx:167-168).
29
+ * 이 경로의 응답은 전부 `type:'group'` 으로 정규화한다 — 부서 행에는 type 필드가
30
+ * 없어 기본값(user)으로 잘못 접히기 때문이다.
31
+ */
32
+ groupSearchEndpoint?: string;
33
+ /** 정적 데모 폴백 — searchEndpoint가 없을 때 로컬 검색 대상. */
34
+ options?: CustomApprover[];
35
+ disabled?: boolean;
36
+ }
37
+ declare const stepTypeIcon: (type: ApprovalLineStep["type"]) => "user" | "users" | "building-2";
38
+ /** 스텝 표시 라벨 — 운영자가 붙인 이름 > 유형 > 커스텀 결재자 나열(30자 말줄임). */
39
+ declare const stepLabel: (step: ApprovalLineStep) => string;
40
+ /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다 — 자기 축(폭·여백)이 닿게 하는 통로. */
41
+ declare const ApprovalLineEditor: React__default.FC<ApprovalLineEditorProps & SduiBoxProps>;
42
+
43
+ export { ApprovalLineEditor, type ApprovalLineEditorProps, type ApprovalLineStep, type CustomApprover, stepLabel, stepTypeIcon };
@@ -0,0 +1,7 @@
1
+ export { ApprovalLineEditor, stepLabel, stepTypeIcon } from '../chunk-SAPJVLZM.js';
2
+ import '../chunk-BD75U73S.js';
3
+ import '../chunk-DVOPZFQS.js';
4
+ import '../chunk-EFMKWPZ3.js';
5
+ import '../chunk-XQPTSEJC.js';
6
+ import '../chunk-WIDDHR7L.js';
7
+ import '../chunk-SAN4IX6N.js';
@@ -0,0 +1,42 @@
1
+ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
2
+ import React__default from 'react';
3
+ import { ApprovalLineStep, CustomApprover } from './ApprovalLineEditor.js';
4
+
5
+ /** 저장 JSON 계약(approval-line) — 키 이름 변경 금지. */
6
+ interface ApprovalLineOverride {
7
+ id: string;
8
+ name: string;
9
+ jobTitles: string[];
10
+ grades: string[];
11
+ /** 레거시 이관 키(적용 업무유형) — 편집 금지, spread로 보존만 한다. */
12
+ entityTypes?: string[];
13
+ steps: ApprovalLineStep[];
14
+ }
15
+ interface ApprovalOverridesEditorProps {
16
+ value: ApprovalLineOverride[];
17
+ onChange: (value: ApprovalLineOverride[]) => void;
18
+ /** 선택 가능한 직책 목록(직원 데이터에서 distinct 추출한 문자열). */
19
+ jobTitleOptions: string[];
20
+ /** 선택 가능한 직급 목록. */
21
+ gradeOptions: string[];
22
+ /**
23
+ * 직책·직급 옵션을 스스로 끌어올 직원 목록 경로(예: `/employees?limit=500`).
24
+ * v2 는 편집기가 직접 `/employees` 를 distinct 추출했다(approval-line-overrides-
25
+ * editor.tsx) — 같은 방식이다. 주면 응답의 `job_title`·`grade` 를 모아
26
+ * jobTitleOptions/gradeOptions **에 합친다**(대체가 아니라 합집합 — 정적 폴백이
27
+ * 캔버스 샌드박스에서 살아남아야 한다). 실패는 조용히 무시한다: 폴백 목록이
28
+ * 그대로 남고, 저장된 값은 withSelected 가 어차피 살린다.
29
+ */
30
+ facetsEndpoint?: string;
31
+ /** 결재자 통합 검색 경로 — 중첩 결재선 편집기로 전달. */
32
+ searchEndpoint?: string;
33
+ /** 부서(그룹) 검색 경로 — 중첩 결재선 편집기로 전달. */
34
+ groupSearchEndpoint?: string;
35
+ /** 정적 데모 폴백 결재자 목록 — 중첩 결재선 편집기로 전달. */
36
+ searchOptions?: CustomApprover[];
37
+ disabled?: boolean;
38
+ }
39
+ /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다 — 자기 축(폭·여백)이 닿게 하는 통로. */
40
+ declare const ApprovalOverridesEditor: React__default.FC<ApprovalOverridesEditorProps & SduiBoxProps>;
41
+
42
+ export { type ApprovalLineOverride, ApprovalOverridesEditor, type ApprovalOverridesEditorProps };
@@ -0,0 +1,9 @@
1
+ export { ApprovalOverridesEditor } from '../chunk-ZDRERW4G.js';
2
+ import '../chunk-QDEZXA34.js';
3
+ import '../chunk-SAPJVLZM.js';
4
+ import '../chunk-BD75U73S.js';
5
+ import '../chunk-DVOPZFQS.js';
6
+ import '../chunk-EFMKWPZ3.js';
7
+ import '../chunk-XQPTSEJC.js';
8
+ import '../chunk-WIDDHR7L.js';
9
+ import '../chunk-SAN4IX6N.js';
@@ -0,0 +1,72 @@
1
+ import * as React from 'react';
2
+ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
3
+
4
+ /**
5
+ * OrgChartBoard — 실데이터 조직도 보드(v2 organization-chart.tsx 1522줄 직이식).
6
+ *
7
+ * 라이브러리 OrgChart(단순 상하 트리)로는 v2 개편 화면(리더십 스택·노드 내 사원 카드·
8
+ * 세로쓰기 팀 라벨·세대 홀짝 레이아웃·마스터 직위 서열 정렬)을 표현할 수 없어
9
+ * ERP 위젯으로 옮겼다. 데이터도 스펙($state/$calc)에는 3원 조인·트리 조립 어휘가
10
+ * 없으므로 위젯이 스스로 불러온다(PermissionMatrixEditor의 "묶기 연산은 위젯" 원칙).
11
+ *
12
+ * 데이터 3원(전부 페이지 수집, limit=500):
13
+ * - GET /employees — 필수. 실패하면 화면 전체가 오류 상태.
14
+ * - GET /departments?include=paths — **실패 허용**: 사원의 department 참조로 그룹을 합성.
15
+ * - GET /job-positions — **실패 허용**: 정렬 보조일 뿐(마스터 없으면 GRADE_ORDER).
16
+ *
17
+ * v3 서버 응답은 snake_case이고 v2와 필드가 다르다(실측):
18
+ * - 사원: position 없음 → 직위 = `grade`, 직책 = `job_title`. groups/teamGroup 없음 →
19
+ * 소속 = `department_id ?? department.id`(v2 규칙의 잔여 폴백만 남음).
20
+ * - 부서: {id, name, parent_id, path}. 직위: {name, rank_order, sort_order, is_active}.
21
+ *
22
+ * 구성원 정렬(v2 compareMembers 그대로): 직책 서열(DUTY_ORDER) → 직위 서열
23
+ * (마스터 rank_order 항상 우선, 최장 포함 매칭 — "부사장"≠"사장", 한쪽만 마스터에
24
+ * 있으면 그쪽이 위, 둘 다 없으면 GRADE_ORDER 폴백) → level 내림차순 → 이름(ko).
25
+ * rank map은 미사용(is_active=false) 직위 포함 전건이다.
26
+ *
27
+ * 사원 카드 클릭 → `onMemberClick(사원 행)` — 스펙에서 setState(fromEvent)+navigate
28
+ * 체인으로 /hr/personal-card/{id}에 잇는다. 프롭이 없으면 location.assign 폴백.
29
+ */
30
+ interface OrgGroupRow {
31
+ id: string;
32
+ name: string;
33
+ parent_id?: string | null;
34
+ path?: string | null;
35
+ }
36
+ interface OrgEmployeeRow {
37
+ id: string;
38
+ name: string;
39
+ /** 직위 문자열(직위 마스터 name의 사본) — v2의 position/grade에 해당 */
40
+ grade?: string | null;
41
+ /** 직책(팀장·본부장 등) */
42
+ job_title?: string | null;
43
+ level?: number | null;
44
+ department_id?: string | null;
45
+ department?: {
46
+ id?: string | null;
47
+ name?: string | null;
48
+ parent_id?: string | null;
49
+ } | null;
50
+ image?: string | null;
51
+ /** 이벤트 인자로 원문 행을 그대로 넘긴다(스펙이 다른 키도 쓸 수 있게) */
52
+ [key: string]: unknown;
53
+ }
54
+ interface OrgChartBoardProps {
55
+ /** 사원 카드 클릭 — 인자는 사원 행(id·name·grade·job_title·department_id …). */
56
+ onMemberClick?: (member: OrgEmployeeRow) => void;
57
+ /** 캔버스 높이(px 숫자 또는 CSS 길이). 기본 72vh(최소 620px). */
58
+ height?: number | string;
59
+ /**
60
+ * 사원 목록 경로. 응답은 `{data:[…], total}` 이고 행에서 읽는 키는
61
+ * id·name·grade·job_title·department_id 다(스네이크·카멜 양쪽 관용 수용).
62
+ */
63
+ employeesEndpoint?: string;
64
+ /** 부서(그룹) 목록 경로. 경로 정보를 함께 주는 질의를 기본값에 담았다. */
65
+ departmentsEndpoint?: string;
66
+ /** 직위 마스터 경로 — 서열 정렬에 쓴다. 실패해도 이름순으로 떨어진다. */
67
+ positionsEndpoint?: string;
68
+ }
69
+ /** 바깥 style·className을 뿌리에 얹는다 — 자기 축(폭·여백) 통로. */
70
+ declare const OrgChartBoard: React.FC<OrgChartBoardProps & SduiBoxProps>;
71
+
72
+ export { OrgChartBoard, type OrgChartBoardProps, type OrgEmployeeRow, type OrgGroupRow };
@@ -0,0 +1,6 @@
1
+ export { OrgChartBoard } from '../chunk-KBLFOC37.js';
2
+ import '../chunk-XPBZMECW.js';
3
+ import '../chunk-THEP3VWY.js';
4
+ import '../chunk-DVOPZFQS.js';
5
+ import '../chunk-WIDDHR7L.js';
6
+ import '../chunk-SAN4IX6N.js';
@@ -24,6 +24,8 @@ import { PrintSheetProps } from './PrintSheet.js';
24
24
  export { PrintSheet } from './PrintSheet.js';
25
25
  import { PeriodFilterProps } from './PeriodFilter.js';
26
26
  export { Period, PeriodFilter, PeriodMode, PeriodModeItem } from './PeriodFilter.js';
27
+ import { OrgChartBoardProps } from './OrgChartBoard.js';
28
+ export { OrgChartBoard } from './OrgChartBoard.js';
27
29
  import { OrgChartProps } from './OrgChart.js';
28
30
  export { OrgChart, OrgNode } from './OrgChart.js';
29
31
  import { LiveClockProps } from './LiveClock.js';
@@ -42,10 +44,14 @@ import { DiffViewProps } from './DiffView.js';
42
44
  export { DiffField, DiffList, DiffView } from './DiffView.js';
43
45
  import { ColumnBoardProps } from './ColumnBoard.js';
44
46
  export { ColumnBoard, ColumnBoardColumn, ColumnBoardItem, ColumnBoardTone } from './ColumnBoard.js';
45
- import * as React from 'react';
46
- import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
47
47
  import { ApprovalStepperProps } from './ApprovalStepper.js';
48
48
  export { ApprovalStepper, ApprovalStepperStep } from './ApprovalStepper.js';
49
+ import { ApprovalOverridesEditorProps } from './ApprovalOverridesEditor.js';
50
+ export { ApprovalLineOverride, ApprovalOverridesEditor } from './ApprovalOverridesEditor.js';
51
+ import * as React from 'react';
52
+ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
53
+ import { ApprovalLineEditorProps } from './ApprovalLineEditor.js';
54
+ export { ApprovalLineEditor, ApprovalLineStep, CustomApprover } from './ApprovalLineEditor.js';
49
55
  export { AutocompleteField, AutocompleteFieldProps, AutocompleteOption, AutocompleteSearchFn, AutocompleteSearchResult, toAutocompleteOptions } from './AutocompleteField.js';
50
56
 
51
57
  /**
@@ -56,6 +62,8 @@ export { AutocompleteField, AutocompleteFieldProps, AutocompleteOption, Autocomp
56
62
  * `SduiWidgetComponentName`이 어휘 목록이 되게 한다.
57
63
  */
58
64
  declare const widgetComponents: {
65
+ ApprovalLineEditor: React.FC<ApprovalLineEditorProps & SduiBoxProps>;
66
+ ApprovalOverridesEditor: React.FC<ApprovalOverridesEditorProps & SduiBoxProps>;
59
67
  ApprovalStepper: React.FC<ApprovalStepperProps & SduiBoxProps>;
60
68
  ColumnBoard: React.FC<ColumnBoardProps & SduiBoxProps>;
61
69
  DiffView: React.FC<DiffViewProps & SduiBoxProps>;
@@ -66,6 +74,7 @@ declare const widgetComponents: {
66
74
  JsonField: React.FC<JsonFieldProps & SduiBoxProps>;
67
75
  LiveClock: React.FC<LiveClockProps & SduiBoxProps>;
68
76
  OrgChart: React.FC<OrgChartProps & SduiBoxProps>;
77
+ OrgChartBoard: React.FC<OrgChartBoardProps & SduiBoxProps>;
69
78
  PeriodFilter: React.FC<PeriodFilterProps & SduiBoxProps>;
70
79
  PrintSheet: React.FC<PrintSheetProps & SduiBoxProps>;
71
80
  RankBoard: React.FC<RankBoardProps & SduiBoxProps>;
@@ -83,4 +92,4 @@ declare const widgetComponents: {
83
92
  /** 위젯 어휘의 컴포넌트 이름 union — 메타데이터 대조에 쓴다(`@wipco/sdui/meta`). */
84
93
  type SduiWidgetComponentName = keyof typeof widgetComponents;
85
94
 
86
- export { ApprovalStepperProps, ColumnBoardProps, DiffViewProps, DisclosureProps, EventCalendarProps, ImageLightboxProps, InlineEditProps, JsonFieldProps, LiveClockProps, OrgChartProps, PeriodFilterProps, PrintSheetProps, RankBoardProps, RecordSheetProps, type SduiWidgetComponentName, SearchableMultiPickerProps, SecureScreenProps, StackedMeterProps, StripProps, SummaryTableProps, TagMultiSelectProps, TimelineProps, TreePickerProps, TreeViewProps, widgetComponents };
95
+ export { ApprovalLineEditorProps, ApprovalOverridesEditorProps, ApprovalStepperProps, ColumnBoardProps, DiffViewProps, DisclosureProps, EventCalendarProps, ImageLightboxProps, InlineEditProps, JsonFieldProps, LiveClockProps, OrgChartBoardProps, OrgChartProps, PeriodFilterProps, PrintSheetProps, RankBoardProps, RecordSheetProps, type SduiWidgetComponentName, SearchableMultiPickerProps, SecureScreenProps, StackedMeterProps, StripProps, SummaryTableProps, TagMultiSelectProps, TimelineProps, TreePickerProps, TreeViewProps, widgetComponents };