@industry-theme/backlogmd-kanban-panel 1.0.21 → 1.0.23
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/panels/KanbanPanel.d.ts.map +1 -1
- package/dist/panels/KanbanPanel.stories.d.ts.map +1 -1
- package/dist/panels/MilestonePanel.stories.d.ts.map +1 -1
- package/dist/panels/TaskDetailPanel.d.ts.map +1 -1
- package/dist/panels/kanban/components/KanbanColumn.d.ts.map +1 -1
- package/dist/panels/kanban/components/TaskCard.d.ts.map +1 -1
- package/dist/panels/kanban/hooks/useKanbanData.d.ts +15 -25
- package/dist/panels/kanban/hooks/useKanbanData.d.ts.map +1 -1
- package/dist/panels/kanban/mocks/mockData.d.ts +1 -1
- package/dist/panels/kanban/mocks/mockData.d.ts.map +1 -1
- package/dist/panels.bundle.js +268 -299
- package/dist/panels.bundle.js.map +1 -1
- package/package.json +1 -1
package/dist/panels.bundle.js
CHANGED
|
@@ -3741,88 +3741,77 @@ const createLucideIcon = (iconName, iconNode) => {
|
|
|
3741
3741
|
* See the LICENSE file in the root directory of this source tree.
|
|
3742
3742
|
*/
|
|
3743
3743
|
const __iconNode$o = [
|
|
3744
|
-
["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
|
|
3745
|
-
["path", { d: "M19 12H5", key: "x3x0zl" }]
|
|
3746
|
-
];
|
|
3747
|
-
const ArrowLeft = createLucideIcon("arrow-left", __iconNode$o);
|
|
3748
|
-
/**
|
|
3749
|
-
* @license lucide-react v0.552.0 - ISC
|
|
3750
|
-
*
|
|
3751
|
-
* This source code is licensed under the ISC license.
|
|
3752
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
3753
|
-
*/
|
|
3754
|
-
const __iconNode$n = [
|
|
3755
3744
|
["path", { d: "M8 2v4", key: "1cmpym" }],
|
|
3756
3745
|
["path", { d: "M16 2v4", key: "4m81vk" }],
|
|
3757
3746
|
["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
|
|
3758
3747
|
["path", { d: "M3 10h18", key: "8toen8" }]
|
|
3759
3748
|
];
|
|
3760
|
-
const Calendar = createLucideIcon("calendar", __iconNode$
|
|
3749
|
+
const Calendar = createLucideIcon("calendar", __iconNode$o);
|
|
3761
3750
|
/**
|
|
3762
3751
|
* @license lucide-react v0.552.0 - ISC
|
|
3763
3752
|
*
|
|
3764
3753
|
* This source code is licensed under the ISC license.
|
|
3765
3754
|
* See the LICENSE file in the root directory of this source tree.
|
|
3766
3755
|
*/
|
|
3767
|
-
const __iconNode$
|
|
3768
|
-
const Check = createLucideIcon("check", __iconNode$
|
|
3756
|
+
const __iconNode$n = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
|
|
3757
|
+
const Check = createLucideIcon("check", __iconNode$n);
|
|
3769
3758
|
/**
|
|
3770
3759
|
* @license lucide-react v0.552.0 - ISC
|
|
3771
3760
|
*
|
|
3772
3761
|
* This source code is licensed under the ISC license.
|
|
3773
3762
|
* See the LICENSE file in the root directory of this source tree.
|
|
3774
3763
|
*/
|
|
3775
|
-
const __iconNode$
|
|
3776
|
-
const ChevronDown = createLucideIcon("chevron-down", __iconNode$
|
|
3764
|
+
const __iconNode$m = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
|
|
3765
|
+
const ChevronDown = createLucideIcon("chevron-down", __iconNode$m);
|
|
3777
3766
|
/**
|
|
3778
3767
|
* @license lucide-react v0.552.0 - ISC
|
|
3779
3768
|
*
|
|
3780
3769
|
* This source code is licensed under the ISC license.
|
|
3781
3770
|
* See the LICENSE file in the root directory of this source tree.
|
|
3782
3771
|
*/
|
|
3783
|
-
const __iconNode$
|
|
3784
|
-
const ChevronRight = createLucideIcon("chevron-right", __iconNode$
|
|
3772
|
+
const __iconNode$l = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
|
|
3773
|
+
const ChevronRight = createLucideIcon("chevron-right", __iconNode$l);
|
|
3785
3774
|
/**
|
|
3786
3775
|
* @license lucide-react v0.552.0 - ISC
|
|
3787
3776
|
*
|
|
3788
3777
|
* This source code is licensed under the ISC license.
|
|
3789
3778
|
* See the LICENSE file in the root directory of this source tree.
|
|
3790
3779
|
*/
|
|
3791
|
-
const __iconNode$
|
|
3780
|
+
const __iconNode$k = [
|
|
3792
3781
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3793
3782
|
["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
|
|
3794
3783
|
["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
|
|
3795
3784
|
];
|
|
3796
|
-
const CircleAlert = createLucideIcon("circle-alert", __iconNode$
|
|
3785
|
+
const CircleAlert = createLucideIcon("circle-alert", __iconNode$k);
|
|
3797
3786
|
/**
|
|
3798
3787
|
* @license lucide-react v0.552.0 - ISC
|
|
3799
3788
|
*
|
|
3800
3789
|
* This source code is licensed under the ISC license.
|
|
3801
3790
|
* See the LICENSE file in the root directory of this source tree.
|
|
3802
3791
|
*/
|
|
3803
|
-
const __iconNode$
|
|
3792
|
+
const __iconNode$j = [
|
|
3804
3793
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3805
3794
|
["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
|
|
3806
3795
|
];
|
|
3807
|
-
const CircleCheck = createLucideIcon("circle-check", __iconNode$
|
|
3796
|
+
const CircleCheck = createLucideIcon("circle-check", __iconNode$j);
|
|
3808
3797
|
/**
|
|
3809
3798
|
* @license lucide-react v0.552.0 - ISC
|
|
3810
3799
|
*
|
|
3811
3800
|
* This source code is licensed under the ISC license.
|
|
3812
3801
|
* See the LICENSE file in the root directory of this source tree.
|
|
3813
3802
|
*/
|
|
3814
|
-
const __iconNode$
|
|
3803
|
+
const __iconNode$i = [
|
|
3815
3804
|
["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
|
|
3816
3805
|
["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
|
|
3817
3806
|
];
|
|
3818
|
-
const Copy = createLucideIcon("copy", __iconNode$
|
|
3807
|
+
const Copy = createLucideIcon("copy", __iconNode$i);
|
|
3819
3808
|
/**
|
|
3820
3809
|
* @license lucide-react v0.552.0 - ISC
|
|
3821
3810
|
*
|
|
3822
3811
|
* This source code is licensed under the ISC license.
|
|
3823
3812
|
* See the LICENSE file in the root directory of this source tree.
|
|
3824
3813
|
*/
|
|
3825
|
-
const __iconNode$
|
|
3814
|
+
const __iconNode$h = [
|
|
3826
3815
|
["path", { d: "m15 15 6 6", key: "1s409w" }],
|
|
3827
3816
|
["path", { d: "m15 9 6-6", key: "ko1vev" }],
|
|
3828
3817
|
["path", { d: "M21 16v5h-5", key: "1ck2sf" }],
|
|
@@ -3832,26 +3821,26 @@ const __iconNode$g = [
|
|
|
3832
3821
|
["path", { d: "M3 8V3h5", key: "1ln10m" }],
|
|
3833
3822
|
["path", { d: "M9 9 3 3", key: "v551iv" }]
|
|
3834
3823
|
];
|
|
3835
|
-
const Expand = createLucideIcon("expand", __iconNode$
|
|
3824
|
+
const Expand = createLucideIcon("expand", __iconNode$h);
|
|
3836
3825
|
/**
|
|
3837
3826
|
* @license lucide-react v0.552.0 - ISC
|
|
3838
3827
|
*
|
|
3839
3828
|
* This source code is licensed under the ISC license.
|
|
3840
3829
|
* See the LICENSE file in the root directory of this source tree.
|
|
3841
3830
|
*/
|
|
3842
|
-
const __iconNode$
|
|
3831
|
+
const __iconNode$g = [
|
|
3843
3832
|
["path", { d: "M15 3h6v6", key: "1q9fwt" }],
|
|
3844
3833
|
["path", { d: "M10 14 21 3", key: "gplh6r" }],
|
|
3845
3834
|
["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
|
|
3846
3835
|
];
|
|
3847
|
-
const ExternalLink = createLucideIcon("external-link", __iconNode$
|
|
3836
|
+
const ExternalLink = createLucideIcon("external-link", __iconNode$g);
|
|
3848
3837
|
/**
|
|
3849
3838
|
* @license lucide-react v0.552.0 - ISC
|
|
3850
3839
|
*
|
|
3851
3840
|
* This source code is licensed under the ISC license.
|
|
3852
3841
|
* See the LICENSE file in the root directory of this source tree.
|
|
3853
3842
|
*/
|
|
3854
|
-
const __iconNode$
|
|
3843
|
+
const __iconNode$f = [
|
|
3855
3844
|
[
|
|
3856
3845
|
"path",
|
|
3857
3846
|
{
|
|
@@ -3864,14 +3853,14 @@ const __iconNode$e = [
|
|
|
3864
3853
|
["path", { d: "M16 13H8", key: "t4e002" }],
|
|
3865
3854
|
["path", { d: "M16 17H8", key: "z1uh3a" }]
|
|
3866
3855
|
];
|
|
3867
|
-
const FileText = createLucideIcon("file-text", __iconNode$
|
|
3856
|
+
const FileText = createLucideIcon("file-text", __iconNode$f);
|
|
3868
3857
|
/**
|
|
3869
3858
|
* @license lucide-react v0.552.0 - ISC
|
|
3870
3859
|
*
|
|
3871
3860
|
* This source code is licensed under the ISC license.
|
|
3872
3861
|
* See the LICENSE file in the root directory of this source tree.
|
|
3873
3862
|
*/
|
|
3874
|
-
const __iconNode$
|
|
3863
|
+
const __iconNode$e = [
|
|
3875
3864
|
[
|
|
3876
3865
|
"path",
|
|
3877
3866
|
{
|
|
@@ -3880,14 +3869,14 @@ const __iconNode$d = [
|
|
|
3880
3869
|
}
|
|
3881
3870
|
]
|
|
3882
3871
|
];
|
|
3883
|
-
const Flag = createLucideIcon("flag", __iconNode$
|
|
3872
|
+
const Flag = createLucideIcon("flag", __iconNode$e);
|
|
3884
3873
|
/**
|
|
3885
3874
|
* @license lucide-react v0.552.0 - ISC
|
|
3886
3875
|
*
|
|
3887
3876
|
* This source code is licensed under the ISC license.
|
|
3888
3877
|
* See the LICENSE file in the root directory of this source tree.
|
|
3889
3878
|
*/
|
|
3890
|
-
const __iconNode$
|
|
3879
|
+
const __iconNode$d = [
|
|
3891
3880
|
["path", { d: "M12 10v6", key: "1bos4e" }],
|
|
3892
3881
|
["path", { d: "M9 13h6", key: "1uhe8q" }],
|
|
3893
3882
|
[
|
|
@@ -3898,47 +3887,47 @@ const __iconNode$c = [
|
|
|
3898
3887
|
}
|
|
3899
3888
|
]
|
|
3900
3889
|
];
|
|
3901
|
-
const FolderPlus = createLucideIcon("folder-plus", __iconNode$
|
|
3890
|
+
const FolderPlus = createLucideIcon("folder-plus", __iconNode$d);
|
|
3902
3891
|
/**
|
|
3903
3892
|
* @license lucide-react v0.552.0 - ISC
|
|
3904
3893
|
*
|
|
3905
3894
|
* This source code is licensed under the ISC license.
|
|
3906
3895
|
* See the LICENSE file in the root directory of this source tree.
|
|
3907
3896
|
*/
|
|
3908
|
-
const __iconNode$
|
|
3897
|
+
const __iconNode$c = [
|
|
3909
3898
|
["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
|
|
3910
3899
|
["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
|
|
3911
3900
|
["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
|
|
3912
3901
|
["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
|
|
3913
3902
|
];
|
|
3914
|
-
const GitBranch = createLucideIcon("git-branch", __iconNode$
|
|
3903
|
+
const GitBranch = createLucideIcon("git-branch", __iconNode$c);
|
|
3915
3904
|
/**
|
|
3916
3905
|
* @license lucide-react v0.552.0 - ISC
|
|
3917
3906
|
*
|
|
3918
3907
|
* This source code is licensed under the ISC license.
|
|
3919
3908
|
* See the LICENSE file in the root directory of this source tree.
|
|
3920
3909
|
*/
|
|
3921
|
-
const __iconNode$
|
|
3910
|
+
const __iconNode$b = [
|
|
3922
3911
|
["path", { d: "M5 3v14", key: "9nsxs2" }],
|
|
3923
3912
|
["path", { d: "M12 3v8", key: "1h2ygw" }],
|
|
3924
3913
|
["path", { d: "M19 3v18", key: "1sk56x" }]
|
|
3925
3914
|
];
|
|
3926
|
-
const Kanban = createLucideIcon("kanban", __iconNode$
|
|
3915
|
+
const Kanban = createLucideIcon("kanban", __iconNode$b);
|
|
3927
3916
|
/**
|
|
3928
3917
|
* @license lucide-react v0.552.0 - ISC
|
|
3929
3918
|
*
|
|
3930
3919
|
* This source code is licensed under the ISC license.
|
|
3931
3920
|
* See the LICENSE file in the root directory of this source tree.
|
|
3932
3921
|
*/
|
|
3933
|
-
const __iconNode$
|
|
3934
|
-
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$
|
|
3922
|
+
const __iconNode$a = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
|
|
3923
|
+
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$a);
|
|
3935
3924
|
/**
|
|
3936
3925
|
* @license lucide-react v0.552.0 - ISC
|
|
3937
3926
|
*
|
|
3938
3927
|
* This source code is licensed under the ISC license.
|
|
3939
3928
|
* See the LICENSE file in the root directory of this source tree.
|
|
3940
3929
|
*/
|
|
3941
|
-
const __iconNode$
|
|
3930
|
+
const __iconNode$9 = [
|
|
3942
3931
|
["path", { d: "M12 13v8", key: "1l5pq0" }],
|
|
3943
3932
|
["path", { d: "M12 3v3", key: "1n5kay" }],
|
|
3944
3933
|
[
|
|
@@ -3949,37 +3938,37 @@ const __iconNode$8 = [
|
|
|
3949
3938
|
}
|
|
3950
3939
|
]
|
|
3951
3940
|
];
|
|
3952
|
-
const Milestone = createLucideIcon("milestone", __iconNode$
|
|
3941
|
+
const Milestone = createLucideIcon("milestone", __iconNode$9);
|
|
3953
3942
|
/**
|
|
3954
3943
|
* @license lucide-react v0.552.0 - ISC
|
|
3955
3944
|
*
|
|
3956
3945
|
* This source code is licensed under the ISC license.
|
|
3957
3946
|
* See the LICENSE file in the root directory of this source tree.
|
|
3958
3947
|
*/
|
|
3959
|
-
const __iconNode$
|
|
3948
|
+
const __iconNode$8 = [
|
|
3960
3949
|
["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
|
|
3961
3950
|
["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
|
|
3962
3951
|
["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
|
|
3963
3952
|
];
|
|
3964
|
-
const Monitor = createLucideIcon("monitor", __iconNode$
|
|
3953
|
+
const Monitor = createLucideIcon("monitor", __iconNode$8);
|
|
3965
3954
|
/**
|
|
3966
3955
|
* @license lucide-react v0.552.0 - ISC
|
|
3967
3956
|
*
|
|
3968
3957
|
* This source code is licensed under the ISC license.
|
|
3969
3958
|
* See the LICENSE file in the root directory of this source tree.
|
|
3970
3959
|
*/
|
|
3971
|
-
const __iconNode$
|
|
3960
|
+
const __iconNode$7 = [
|
|
3972
3961
|
["path", { d: "M18 8L22 12L18 16", key: "1r0oui" }],
|
|
3973
3962
|
["path", { d: "M2 12H22", key: "1m8cig" }]
|
|
3974
3963
|
];
|
|
3975
|
-
const MoveRight = createLucideIcon("move-right", __iconNode$
|
|
3964
|
+
const MoveRight = createLucideIcon("move-right", __iconNode$7);
|
|
3976
3965
|
/**
|
|
3977
3966
|
* @license lucide-react v0.552.0 - ISC
|
|
3978
3967
|
*
|
|
3979
3968
|
* This source code is licensed under the ISC license.
|
|
3980
3969
|
* See the LICENSE file in the root directory of this source tree.
|
|
3981
3970
|
*/
|
|
3982
|
-
const __iconNode$
|
|
3971
|
+
const __iconNode$6 = [
|
|
3983
3972
|
[
|
|
3984
3973
|
"path",
|
|
3985
3974
|
{
|
|
@@ -3988,31 +3977,42 @@ const __iconNode$5 = [
|
|
|
3988
3977
|
}
|
|
3989
3978
|
]
|
|
3990
3979
|
];
|
|
3991
|
-
const Play = createLucideIcon("play", __iconNode$
|
|
3980
|
+
const Play = createLucideIcon("play", __iconNode$6);
|
|
3992
3981
|
/**
|
|
3993
3982
|
* @license lucide-react v0.552.0 - ISC
|
|
3994
3983
|
*
|
|
3995
3984
|
* This source code is licensed under the ISC license.
|
|
3996
3985
|
* See the LICENSE file in the root directory of this source tree.
|
|
3997
3986
|
*/
|
|
3998
|
-
const __iconNode$
|
|
3987
|
+
const __iconNode$5 = [
|
|
3999
3988
|
["path", { d: "M5 12h14", key: "1ays0h" }],
|
|
4000
3989
|
["path", { d: "M12 5v14", key: "s699le" }]
|
|
4001
3990
|
];
|
|
4002
|
-
const Plus = createLucideIcon("plus", __iconNode$
|
|
3991
|
+
const Plus = createLucideIcon("plus", __iconNode$5);
|
|
4003
3992
|
/**
|
|
4004
3993
|
* @license lucide-react v0.552.0 - ISC
|
|
4005
3994
|
*
|
|
4006
3995
|
* This source code is licensed under the ISC license.
|
|
4007
3996
|
* See the LICENSE file in the root directory of this source tree.
|
|
4008
3997
|
*/
|
|
4009
|
-
const __iconNode$
|
|
3998
|
+
const __iconNode$4 = [
|
|
4010
3999
|
["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
|
|
4011
4000
|
["path", { d: "M21 3v5h-5", key: "1q7to0" }],
|
|
4012
4001
|
["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
|
|
4013
4002
|
["path", { d: "M8 16H3v5", key: "1cv678" }]
|
|
4014
4003
|
];
|
|
4015
|
-
const RefreshCw = createLucideIcon("refresh-cw", __iconNode$
|
|
4004
|
+
const RefreshCw = createLucideIcon("refresh-cw", __iconNode$4);
|
|
4005
|
+
/**
|
|
4006
|
+
* @license lucide-react v0.552.0 - ISC
|
|
4007
|
+
*
|
|
4008
|
+
* This source code is licensed under the ISC license.
|
|
4009
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
4010
|
+
*/
|
|
4011
|
+
const __iconNode$3 = [
|
|
4012
|
+
["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
|
|
4013
|
+
["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
|
|
4014
|
+
];
|
|
4015
|
+
const Search = createLucideIcon("search", __iconNode$3);
|
|
4016
4016
|
/**
|
|
4017
4017
|
* @license lucide-react v0.552.0 - ISC
|
|
4018
4018
|
*
|
|
@@ -5866,35 +5866,32 @@ class PanelFileSystemAdapter {
|
|
|
5866
5866
|
const STATUS_DISPLAY_LABELS = {
|
|
5867
5867
|
"todo": "To Do",
|
|
5868
5868
|
"in-progress": "In Progress",
|
|
5869
|
-
"
|
|
5869
|
+
"done": "Done"
|
|
5870
5870
|
};
|
|
5871
5871
|
const COLUMN_TO_STATUS = {
|
|
5872
5872
|
"todo": "To Do",
|
|
5873
5873
|
"in-progress": "In Progress",
|
|
5874
|
-
"
|
|
5874
|
+
"done": "Done"
|
|
5875
5875
|
};
|
|
5876
|
-
const DEFAULT_SOURCES = ["tasks", "completed"];
|
|
5877
5876
|
const DEFAULT_TASKS_LIMIT = 20;
|
|
5878
|
-
const DEFAULT_COMPLETED_LIMIT = 5;
|
|
5879
5877
|
function useKanbanData(options) {
|
|
5880
5878
|
const {
|
|
5881
5879
|
context,
|
|
5882
5880
|
actions,
|
|
5883
|
-
tasksLimit = DEFAULT_TASKS_LIMIT
|
|
5884
|
-
completedLimit = DEFAULT_COMPLETED_LIMIT
|
|
5881
|
+
tasksLimit = DEFAULT_TASKS_LIMIT
|
|
5885
5882
|
} = options || {};
|
|
5886
5883
|
const [tasks, setTasks] = useState([]);
|
|
5887
|
-
const [sources] = useState(DEFAULT_SOURCES);
|
|
5888
5884
|
const [isLoading, setIsLoading] = useState(true);
|
|
5889
5885
|
const [error, setError] = useState(null);
|
|
5890
5886
|
const [isBacklogProject, setIsBacklogProject] = useState(false);
|
|
5891
5887
|
const [canWrite, setCanWrite] = useState(false);
|
|
5892
|
-
const [tasksBySource, setTasksBySource] = useState(
|
|
5893
|
-
/* @__PURE__ */ new Map()
|
|
5894
|
-
);
|
|
5895
5888
|
const [columnStates, setColumnStates] = useState(
|
|
5896
5889
|
/* @__PURE__ */ new Map()
|
|
5897
5890
|
);
|
|
5891
|
+
const [totalLoaded, setTotalLoaded] = useState(0);
|
|
5892
|
+
const [totalCount, setTotalCount] = useState(0);
|
|
5893
|
+
const [hasMore, setHasMore] = useState(false);
|
|
5894
|
+
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
|
5898
5895
|
const coreRef = useRef(null);
|
|
5899
5896
|
const activeFilePathRef = useRef(null);
|
|
5900
5897
|
const contextRef = useRef(context);
|
|
@@ -5924,13 +5921,27 @@ function useKanbanData(options) {
|
|
|
5924
5921
|
}
|
|
5925
5922
|
}, []);
|
|
5926
5923
|
const fileTreeVersionRef = useRef(null);
|
|
5924
|
+
const buildColumnStates = useCallback((allTasks) => {
|
|
5925
|
+
const statusColumns2 = ["todo", "in-progress", "done"];
|
|
5926
|
+
const newColumnStates = /* @__PURE__ */ new Map();
|
|
5927
|
+
for (const column of statusColumns2) {
|
|
5928
|
+
const status = COLUMN_TO_STATUS[column];
|
|
5929
|
+
const columnTasks = allTasks.filter((t) => t.status === status);
|
|
5930
|
+
newColumnStates.set(column, {
|
|
5931
|
+
tasks: columnTasks,
|
|
5932
|
+
total: columnTasks.length,
|
|
5933
|
+
hasMore: false,
|
|
5934
|
+
isLoadingMore: false
|
|
5935
|
+
});
|
|
5936
|
+
}
|
|
5937
|
+
return newColumnStates;
|
|
5938
|
+
}, []);
|
|
5927
5939
|
const loadBacklogData = useCallback(async () => {
|
|
5928
5940
|
var _a, _b, _c;
|
|
5929
5941
|
if (!context || !actions) {
|
|
5930
5942
|
console.log("[useKanbanData] No context provided");
|
|
5931
5943
|
setIsBacklogProject(false);
|
|
5932
5944
|
setTasks([]);
|
|
5933
|
-
setTasksBySource(/* @__PURE__ */ new Map());
|
|
5934
5945
|
setColumnStates(/* @__PURE__ */ new Map());
|
|
5935
5946
|
setIsLoading(false);
|
|
5936
5947
|
coreRef.current = null;
|
|
@@ -5942,7 +5953,6 @@ function useKanbanData(options) {
|
|
|
5942
5953
|
console.log("[useKanbanData] FileTree not available");
|
|
5943
5954
|
setIsBacklogProject(false);
|
|
5944
5955
|
setTasks([]);
|
|
5945
|
-
setTasksBySource(/* @__PURE__ */ new Map());
|
|
5946
5956
|
setColumnStates(/* @__PURE__ */ new Map());
|
|
5947
5957
|
coreRef.current = null;
|
|
5948
5958
|
fileTreeVersionRef.current = null;
|
|
@@ -5973,7 +5983,6 @@ function useKanbanData(options) {
|
|
|
5973
5983
|
console.log("[useKanbanData] Not a Backlog.md project");
|
|
5974
5984
|
setIsBacklogProject(false);
|
|
5975
5985
|
setTasks([]);
|
|
5976
|
-
setTasksBySource(/* @__PURE__ */ new Map());
|
|
5977
5986
|
setColumnStates(/* @__PURE__ */ new Map());
|
|
5978
5987
|
coreRef.current = null;
|
|
5979
5988
|
return;
|
|
@@ -5983,133 +5992,74 @@ function useKanbanData(options) {
|
|
|
5983
5992
|
setCanWrite(fs.canWrite);
|
|
5984
5993
|
await core2.initializeLazy(filePaths);
|
|
5985
5994
|
coreRef.current = core2;
|
|
5986
|
-
const paginatedResult = await core2.
|
|
5987
|
-
tasksLimit,
|
|
5988
|
-
|
|
5989
|
-
offset: 0,
|
|
5990
|
-
tasksSortDirection: "asc",
|
|
5991
|
-
completedSortByIdDesc: true
|
|
5995
|
+
const paginatedResult = await core2.loadMoreForSource("tasks", 0, {
|
|
5996
|
+
limit: tasksLimit,
|
|
5997
|
+
sortDirection: "asc"
|
|
5992
5998
|
});
|
|
5993
|
-
const
|
|
5994
|
-
const
|
|
5995
|
-
let allTasks = [];
|
|
5996
|
-
for (const source2 of paginatedResult.sources) {
|
|
5997
|
-
const columnResult = paginatedResult.bySource.get(source2);
|
|
5998
|
-
if (columnResult) {
|
|
5999
|
-
newTasksBySource.set(source2, columnResult.items);
|
|
6000
|
-
newColumnStates.set(source2, {
|
|
6001
|
-
tasks: columnResult.items,
|
|
6002
|
-
total: columnResult.total,
|
|
6003
|
-
hasMore: columnResult.hasMore,
|
|
6004
|
-
isLoadingMore: false
|
|
6005
|
-
});
|
|
6006
|
-
allTasks = allTasks.concat(columnResult.items);
|
|
6007
|
-
} else {
|
|
6008
|
-
newTasksBySource.set(source2, []);
|
|
6009
|
-
newColumnStates.set(source2, {
|
|
6010
|
-
tasks: [],
|
|
6011
|
-
total: 0,
|
|
6012
|
-
hasMore: false,
|
|
6013
|
-
isLoadingMore: false
|
|
6014
|
-
});
|
|
6015
|
-
}
|
|
6016
|
-
}
|
|
6017
|
-
const totalTasks = Array.from(paginatedResult.bySource.values()).reduce(
|
|
6018
|
-
(sum, col) => sum + col.total,
|
|
6019
|
-
0
|
|
6020
|
-
);
|
|
5999
|
+
const allTasks = paginatedResult.items;
|
|
6000
|
+
const total = paginatedResult.total;
|
|
6021
6001
|
console.log(
|
|
6022
|
-
`[useKanbanData] Loaded ${allTasks.length}/${
|
|
6002
|
+
`[useKanbanData] Loaded ${allTasks.length}/${total} tasks`
|
|
6023
6003
|
);
|
|
6024
6004
|
fileTreeVersionRef.current = currentVersion;
|
|
6005
|
+
const newColumnStates = buildColumnStates(allTasks);
|
|
6025
6006
|
setTasks(allTasks);
|
|
6026
|
-
setTasksBySource(newTasksBySource);
|
|
6027
6007
|
setColumnStates(newColumnStates);
|
|
6008
|
+
setTotalLoaded(allTasks.length);
|
|
6009
|
+
setTotalCount(total);
|
|
6010
|
+
setHasMore(paginatedResult.hasMore);
|
|
6028
6011
|
} catch (err) {
|
|
6029
6012
|
console.error("[useKanbanData] Failed to load Backlog.md data:", err);
|
|
6030
6013
|
setError(err instanceof Error ? err.message : "Failed to load backlog data");
|
|
6031
6014
|
setIsBacklogProject(false);
|
|
6032
6015
|
setTasks([]);
|
|
6033
|
-
setTasksBySource(/* @__PURE__ */ new Map());
|
|
6034
6016
|
setColumnStates(/* @__PURE__ */ new Map());
|
|
6035
6017
|
coreRef.current = null;
|
|
6036
6018
|
fileTreeVersionRef.current = null;
|
|
6037
6019
|
} finally {
|
|
6038
6020
|
setIsLoading(false);
|
|
6039
6021
|
}
|
|
6040
|
-
}, [context, actions, fetchFileContent, tasksLimit,
|
|
6022
|
+
}, [context, actions, fetchFileContent, tasksLimit, buildColumnStates]);
|
|
6041
6023
|
useEffect(() => {
|
|
6042
6024
|
loadBacklogData();
|
|
6043
6025
|
}, [loadBacklogData]);
|
|
6044
|
-
const
|
|
6045
|
-
|
|
6046
|
-
|
|
6047
|
-
|
|
6048
|
-
|
|
6049
|
-
|
|
6050
|
-
|
|
6051
|
-
|
|
6052
|
-
|
|
6053
|
-
|
|
6054
|
-
|
|
6055
|
-
|
|
6056
|
-
|
|
6057
|
-
|
|
6058
|
-
if (state) {
|
|
6059
|
-
newStates.set(source2, { ...state, isLoadingMore: true });
|
|
6060
|
-
}
|
|
6061
|
-
return newStates;
|
|
6026
|
+
const loadMoreTasks = useCallback(async () => {
|
|
6027
|
+
const core2 = coreRef.current;
|
|
6028
|
+
if (!core2) {
|
|
6029
|
+
console.warn("[useKanbanData] Core not available for loadMore");
|
|
6030
|
+
return;
|
|
6031
|
+
}
|
|
6032
|
+
if (!hasMore || isLoadingMore) {
|
|
6033
|
+
return;
|
|
6034
|
+
}
|
|
6035
|
+
setIsLoadingMore(true);
|
|
6036
|
+
try {
|
|
6037
|
+
const result = await core2.loadMoreForSource("tasks", totalLoaded, {
|
|
6038
|
+
limit: tasksLimit,
|
|
6039
|
+
sortDirection: "asc"
|
|
6062
6040
|
});
|
|
6063
|
-
|
|
6064
|
-
|
|
6065
|
-
|
|
6066
|
-
|
|
6067
|
-
|
|
6068
|
-
|
|
6069
|
-
|
|
6070
|
-
|
|
6071
|
-
|
|
6072
|
-
|
|
6073
|
-
|
|
6074
|
-
|
|
6075
|
-
|
|
6076
|
-
|
|
6077
|
-
|
|
6078
|
-
|
|
6079
|
-
|
|
6080
|
-
|
|
6081
|
-
|
|
6082
|
-
|
|
6083
|
-
newStates.set(source2, {
|
|
6084
|
-
tasks: newTasks,
|
|
6085
|
-
total: result.total,
|
|
6086
|
-
hasMore: result.hasMore,
|
|
6087
|
-
isLoadingMore: false
|
|
6088
|
-
});
|
|
6089
|
-
}
|
|
6090
|
-
return newStates;
|
|
6091
|
-
});
|
|
6092
|
-
setTasksBySource((prev) => {
|
|
6093
|
-
const newMap = new Map(prev);
|
|
6094
|
-
const currentTasks = newMap.get(source2) || [];
|
|
6095
|
-
newMap.set(source2, [...currentTasks, ...result.items]);
|
|
6096
|
-
return newMap;
|
|
6097
|
-
});
|
|
6098
|
-
setTasks((prev) => [...prev, ...result.items]);
|
|
6099
|
-
} catch (err) {
|
|
6100
|
-
console.error(`[useKanbanData] Failed to load more for "${source2}":`, err);
|
|
6101
|
-
setError(err instanceof Error ? err.message : "Failed to load more tasks");
|
|
6102
|
-
setColumnStates((prev) => {
|
|
6103
|
-
const newStates = new Map(prev);
|
|
6104
|
-
const state = newStates.get(source2);
|
|
6105
|
-
if (state) {
|
|
6106
|
-
newStates.set(source2, { ...state, isLoadingMore: false });
|
|
6107
|
-
}
|
|
6108
|
-
return newStates;
|
|
6109
|
-
});
|
|
6110
|
-
}
|
|
6041
|
+
console.log(
|
|
6042
|
+
`[useKanbanData] Loaded ${result.items.length} more tasks (${totalLoaded + result.items.length}/${result.total})`
|
|
6043
|
+
);
|
|
6044
|
+
const newTasks = [...tasks, ...result.items];
|
|
6045
|
+
setTasks(newTasks);
|
|
6046
|
+
setTotalLoaded(newTasks.length);
|
|
6047
|
+
setTotalCount(result.total);
|
|
6048
|
+
setHasMore(result.hasMore);
|
|
6049
|
+
const newColumnStates = buildColumnStates(newTasks);
|
|
6050
|
+
setColumnStates(newColumnStates);
|
|
6051
|
+
} catch (err) {
|
|
6052
|
+
console.error("[useKanbanData] Failed to load more tasks:", err);
|
|
6053
|
+
setError(err instanceof Error ? err.message : "Failed to load more tasks");
|
|
6054
|
+
} finally {
|
|
6055
|
+
setIsLoadingMore(false);
|
|
6056
|
+
}
|
|
6057
|
+
}, [tasks, hasMore, isLoadingMore, totalLoaded, tasksLimit, buildColumnStates]);
|
|
6058
|
+
const loadMore = useCallback(
|
|
6059
|
+
async (_status) => {
|
|
6060
|
+
await loadMoreTasks();
|
|
6111
6061
|
},
|
|
6112
|
-
[
|
|
6062
|
+
[loadMoreTasks]
|
|
6113
6063
|
);
|
|
6114
6064
|
const refreshData = useCallback(async () => {
|
|
6115
6065
|
await loadBacklogData();
|
|
@@ -6141,44 +6091,17 @@ function useKanbanData(options) {
|
|
|
6141
6091
|
const moveTaskOptimistic = useCallback(
|
|
6142
6092
|
(taskId, toColumn) => {
|
|
6143
6093
|
const newStatus = COLUMN_TO_STATUS[toColumn];
|
|
6144
|
-
|
|
6145
|
-
|
|
6146
|
-
|
|
6147
|
-
|
|
6148
|
-
const
|
|
6149
|
-
|
|
6150
|
-
const activeIndex = activeTasks.findIndex((t) => t.id === taskId);
|
|
6151
|
-
if (activeIndex !== -1) {
|
|
6152
|
-
taskToMove = activeTasks[activeIndex];
|
|
6153
|
-
activeTasks.splice(activeIndex, 1);
|
|
6154
|
-
}
|
|
6155
|
-
if (!taskToMove) {
|
|
6156
|
-
const completedIndex = completedTasks.findIndex((t) => t.id === taskId);
|
|
6157
|
-
if (completedIndex !== -1) {
|
|
6158
|
-
taskToMove = completedTasks[completedIndex];
|
|
6159
|
-
completedTasks.splice(completedIndex, 1);
|
|
6160
|
-
}
|
|
6161
|
-
}
|
|
6162
|
-
if (!taskToMove) {
|
|
6163
|
-
console.warn(`[useKanbanData] Task ${taskId} not found for move`);
|
|
6164
|
-
return prev;
|
|
6165
|
-
}
|
|
6166
|
-
const updatedTask = { ...taskToMove, status: newStatus };
|
|
6167
|
-
if (isMovingToCompleted) {
|
|
6168
|
-
completedTasks.unshift(updatedTask);
|
|
6169
|
-
} else {
|
|
6170
|
-
activeTasks.push(updatedTask);
|
|
6171
|
-
}
|
|
6172
|
-
newMap.set("tasks", activeTasks);
|
|
6173
|
-
newMap.set("completed", completedTasks);
|
|
6094
|
+
setTasks((prev) => {
|
|
6095
|
+
const newTasks = prev.map(
|
|
6096
|
+
(t) => t.id === taskId ? { ...t, status: newStatus } : t
|
|
6097
|
+
);
|
|
6098
|
+
const newColumnStates = buildColumnStates(newTasks);
|
|
6099
|
+
setColumnStates(newColumnStates);
|
|
6174
6100
|
console.log(`[useKanbanData] Moved task ${taskId} to ${toColumn} (${newStatus})`);
|
|
6175
|
-
return
|
|
6101
|
+
return newTasks;
|
|
6176
6102
|
});
|
|
6177
|
-
setTasks(
|
|
6178
|
-
(prev) => prev.map((t) => t.id === taskId ? { ...t, status: newStatus } : t)
|
|
6179
|
-
);
|
|
6180
6103
|
},
|
|
6181
|
-
[]
|
|
6104
|
+
[buildColumnStates]
|
|
6182
6105
|
);
|
|
6183
6106
|
const getTaskById = useCallback(
|
|
6184
6107
|
(taskId) => {
|
|
@@ -6186,50 +6109,39 @@ function useKanbanData(options) {
|
|
|
6186
6109
|
},
|
|
6187
6110
|
[tasks]
|
|
6188
6111
|
);
|
|
6189
|
-
const statusColumns = ["todo", "in-progress", "
|
|
6112
|
+
const statusColumns = ["todo", "in-progress", "done"];
|
|
6190
6113
|
const tasksByStatus = (() => {
|
|
6191
6114
|
const result = /* @__PURE__ */ new Map();
|
|
6192
|
-
const
|
|
6193
|
-
|
|
6194
|
-
|
|
6195
|
-
|
|
6196
|
-
|
|
6197
|
-
|
|
6198
|
-
|
|
6115
|
+
for (const column of statusColumns) {
|
|
6116
|
+
const state = columnStates.get(column);
|
|
6117
|
+
result.set(column, {
|
|
6118
|
+
tasks: (state == null ? void 0 : state.tasks) || [],
|
|
6119
|
+
count: (state == null ? void 0 : state.total) || 0
|
|
6120
|
+
});
|
|
6121
|
+
}
|
|
6199
6122
|
return result;
|
|
6200
6123
|
})();
|
|
6201
|
-
const
|
|
6202
|
-
|
|
6203
|
-
|
|
6204
|
-
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
isLoadingMore: (activeColumnState == null ? void 0 : activeColumnState.isLoadingMore) || false
|
|
6208
|
-
};
|
|
6209
|
-
})();
|
|
6210
|
-
const loadMoreActive = useCallback(async () => {
|
|
6211
|
-
await loadMore("tasks");
|
|
6212
|
-
}, [loadMore]);
|
|
6124
|
+
const totalTasksState = {
|
|
6125
|
+
total: totalCount,
|
|
6126
|
+
loaded: totalLoaded,
|
|
6127
|
+
hasMore,
|
|
6128
|
+
isLoadingMore
|
|
6129
|
+
};
|
|
6213
6130
|
return {
|
|
6214
6131
|
tasks,
|
|
6215
|
-
sources,
|
|
6216
6132
|
isLoading,
|
|
6217
6133
|
error,
|
|
6218
6134
|
isBacklogProject,
|
|
6219
|
-
tasksBySource,
|
|
6220
6135
|
columnStates,
|
|
6221
6136
|
loadMore,
|
|
6222
6137
|
refreshData,
|
|
6223
6138
|
updateTaskStatus,
|
|
6224
|
-
// New 3-column view exports
|
|
6225
6139
|
statusColumns,
|
|
6226
6140
|
tasksByStatus,
|
|
6227
|
-
|
|
6228
|
-
|
|
6229
|
-
// Drag-and-drop support
|
|
6141
|
+
totalTasksState,
|
|
6142
|
+
loadMoreTasks,
|
|
6230
6143
|
moveTaskOptimistic,
|
|
6231
6144
|
getTaskById,
|
|
6232
|
-
// Write support
|
|
6233
6145
|
canWrite,
|
|
6234
6146
|
core: coreRef.current
|
|
6235
6147
|
};
|
|
@@ -6290,6 +6202,7 @@ const TaskCard = ({
|
|
|
6290
6202
|
onClick(task);
|
|
6291
6203
|
}
|
|
6292
6204
|
};
|
|
6205
|
+
const displayTitle = task.title.replace(/^Task\s+\d+\s*[:\-–—]?\s*/i, "").trim() || task.title;
|
|
6293
6206
|
return /* @__PURE__ */ jsxs(
|
|
6294
6207
|
"div",
|
|
6295
6208
|
{
|
|
@@ -6320,7 +6233,7 @@ const TaskCard = ({
|
|
|
6320
6233
|
color: theme2.colors.text,
|
|
6321
6234
|
fontWeight: theme2.fontWeights.medium
|
|
6322
6235
|
},
|
|
6323
|
-
children:
|
|
6236
|
+
children: displayTitle
|
|
6324
6237
|
}
|
|
6325
6238
|
),
|
|
6326
6239
|
task.description && /* @__PURE__ */ jsx(
|
|
@@ -6430,8 +6343,6 @@ const KanbanColumn = ({
|
|
|
6430
6343
|
flex: fullWidth ? "1 1 auto" : "1 1 0",
|
|
6431
6344
|
// Grow to fill available width equally
|
|
6432
6345
|
minWidth: fullWidth ? void 0 : "280px",
|
|
6433
|
-
maxWidth: fullWidth ? void 0 : "500px",
|
|
6434
|
-
// Cap max width for readability
|
|
6435
6346
|
alignSelf: "stretch",
|
|
6436
6347
|
// Fill parent height via flexbox
|
|
6437
6348
|
minHeight: 0,
|
|
@@ -7351,6 +7262,7 @@ const KanbanPanel = ({
|
|
|
7351
7262
|
const [activeTask, setActiveTask] = useState(null);
|
|
7352
7263
|
const [isTaskModalOpen, setIsTaskModalOpen] = useState(false);
|
|
7353
7264
|
const [editingTask, setEditingTask] = useState(void 0);
|
|
7265
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
7354
7266
|
const sensors = useSensors(
|
|
7355
7267
|
useSensor(PointerSensor, {
|
|
7356
7268
|
activationConstraint: {
|
|
@@ -7378,10 +7290,8 @@ const KanbanPanel = ({
|
|
|
7378
7290
|
const {
|
|
7379
7291
|
statusColumns,
|
|
7380
7292
|
tasksByStatus,
|
|
7381
|
-
|
|
7382
|
-
|
|
7383
|
-
activeTasksState,
|
|
7384
|
-
loadMoreActive,
|
|
7293
|
+
totalTasksState,
|
|
7294
|
+
loadMoreTasks,
|
|
7385
7295
|
error,
|
|
7386
7296
|
isBacklogProject,
|
|
7387
7297
|
refreshData,
|
|
@@ -7392,9 +7302,28 @@ const KanbanPanel = ({
|
|
|
7392
7302
|
} = useKanbanData({
|
|
7393
7303
|
context,
|
|
7394
7304
|
actions,
|
|
7395
|
-
tasksLimit: 20
|
|
7396
|
-
completedLimit: 5
|
|
7305
|
+
tasksLimit: 20
|
|
7397
7306
|
});
|
|
7307
|
+
const filteredTasksByStatus = useMemo(() => {
|
|
7308
|
+
if (!searchQuery.trim()) {
|
|
7309
|
+
return tasksByStatus;
|
|
7310
|
+
}
|
|
7311
|
+
const query = searchQuery.toLowerCase().trim();
|
|
7312
|
+
const filtered = /* @__PURE__ */ new Map();
|
|
7313
|
+
for (const [status, state] of tasksByStatus) {
|
|
7314
|
+
const filteredTasks = state.tasks.filter((task) => {
|
|
7315
|
+
var _a2, _b2, _c, _d;
|
|
7316
|
+
if (task.title.toLowerCase().includes(query)) return true;
|
|
7317
|
+
if ((_a2 = task.description) == null ? void 0 : _a2.toLowerCase().includes(query)) return true;
|
|
7318
|
+
if ((_b2 = task.labels) == null ? void 0 : _b2.some((label) => label.toLowerCase().includes(query))) return true;
|
|
7319
|
+
if ((_c = task.assignee) == null ? void 0 : _c.some((a) => a.toLowerCase().includes(query))) return true;
|
|
7320
|
+
if ((_d = task.milestone) == null ? void 0 : _d.toLowerCase().includes(query)) return true;
|
|
7321
|
+
return false;
|
|
7322
|
+
});
|
|
7323
|
+
filtered.set(status, { tasks: filteredTasks, count: filteredTasks.length });
|
|
7324
|
+
}
|
|
7325
|
+
return filtered;
|
|
7326
|
+
}, [tasksByStatus, searchQuery]);
|
|
7398
7327
|
const handleDragStart = useCallback((event) => {
|
|
7399
7328
|
const { active } = event;
|
|
7400
7329
|
const task = getTaskById(active.id);
|
|
@@ -7413,7 +7342,7 @@ const KanbanPanel = ({
|
|
|
7413
7342
|
const statusToColumn = {
|
|
7414
7343
|
"To Do": "todo",
|
|
7415
7344
|
"In Progress": "in-progress",
|
|
7416
|
-
"Done": "
|
|
7345
|
+
"Done": "done"
|
|
7417
7346
|
};
|
|
7418
7347
|
const currentColumn = statusToColumn[task.status] || "todo";
|
|
7419
7348
|
if (currentColumn !== targetColumn) {
|
|
@@ -7562,32 +7491,77 @@ const KanbanPanel = ({
|
|
|
7562
7491
|
}
|
|
7563
7492
|
)
|
|
7564
7493
|
] }),
|
|
7565
|
-
isBacklogProject && /* @__PURE__ */ jsxs(
|
|
7566
|
-
|
|
7567
|
-
|
|
7568
|
-
|
|
7569
|
-
|
|
7570
|
-
|
|
7571
|
-
|
|
7572
|
-
"
|
|
7573
|
-
|
|
7574
|
-
|
|
7575
|
-
|
|
7494
|
+
isBacklogProject && /* @__PURE__ */ jsxs(
|
|
7495
|
+
"div",
|
|
7496
|
+
{
|
|
7497
|
+
style: {
|
|
7498
|
+
position: "relative",
|
|
7499
|
+
flex: "1 1 200px",
|
|
7500
|
+
maxWidth: "300px",
|
|
7501
|
+
minWidth: "150px"
|
|
7502
|
+
},
|
|
7503
|
+
children: [
|
|
7504
|
+
/* @__PURE__ */ jsx(
|
|
7505
|
+
Search,
|
|
7506
|
+
{
|
|
7507
|
+
size: 16,
|
|
7576
7508
|
color: theme2.colors.textSecondary,
|
|
7577
|
-
|
|
7578
|
-
|
|
7579
|
-
|
|
7580
|
-
|
|
7581
|
-
|
|
7582
|
-
|
|
7583
|
-
|
|
7584
|
-
|
|
7585
|
-
|
|
7586
|
-
|
|
7587
|
-
|
|
7588
|
-
|
|
7589
|
-
|
|
7590
|
-
|
|
7509
|
+
style: {
|
|
7510
|
+
position: "absolute",
|
|
7511
|
+
left: "10px",
|
|
7512
|
+
top: "50%",
|
|
7513
|
+
transform: "translateY(-50%)",
|
|
7514
|
+
pointerEvents: "none"
|
|
7515
|
+
}
|
|
7516
|
+
}
|
|
7517
|
+
),
|
|
7518
|
+
/* @__PURE__ */ jsx(
|
|
7519
|
+
"input",
|
|
7520
|
+
{
|
|
7521
|
+
type: "text",
|
|
7522
|
+
placeholder: "Search tasks...",
|
|
7523
|
+
value: searchQuery,
|
|
7524
|
+
onChange: (e) => setSearchQuery(e.target.value),
|
|
7525
|
+
style: {
|
|
7526
|
+
width: "100%",
|
|
7527
|
+
padding: "8px 32px 8px 32px",
|
|
7528
|
+
fontSize: theme2.fontSizes[1],
|
|
7529
|
+
fontFamily: theme2.fonts.body,
|
|
7530
|
+
border: `1px solid ${theme2.colors.border}`,
|
|
7531
|
+
borderRadius: theme2.radii[2],
|
|
7532
|
+
background: theme2.colors.backgroundSecondary,
|
|
7533
|
+
color: theme2.colors.text,
|
|
7534
|
+
outline: "none",
|
|
7535
|
+
boxSizing: "border-box"
|
|
7536
|
+
}
|
|
7537
|
+
}
|
|
7538
|
+
),
|
|
7539
|
+
searchQuery && /* @__PURE__ */ jsx(
|
|
7540
|
+
"button",
|
|
7541
|
+
{
|
|
7542
|
+
onClick: () => setSearchQuery(""),
|
|
7543
|
+
style: {
|
|
7544
|
+
position: "absolute",
|
|
7545
|
+
right: "6px",
|
|
7546
|
+
top: "50%",
|
|
7547
|
+
transform: "translateY(-50%)",
|
|
7548
|
+
background: "transparent",
|
|
7549
|
+
border: "none",
|
|
7550
|
+
padding: "4px",
|
|
7551
|
+
cursor: "pointer",
|
|
7552
|
+
display: "flex",
|
|
7553
|
+
alignItems: "center",
|
|
7554
|
+
justifyContent: "center",
|
|
7555
|
+
color: theme2.colors.textSecondary
|
|
7556
|
+
},
|
|
7557
|
+
"aria-label": "Clear search",
|
|
7558
|
+
children: /* @__PURE__ */ jsx(X, { size: 14 })
|
|
7559
|
+
}
|
|
7560
|
+
)
|
|
7561
|
+
]
|
|
7562
|
+
}
|
|
7563
|
+
),
|
|
7564
|
+
isBacklogProject && /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "16px", flexWrap: "wrap" }, children: [
|
|
7591
7565
|
canWrite && /* @__PURE__ */ jsxs(
|
|
7592
7566
|
"button",
|
|
7593
7567
|
{
|
|
@@ -7612,11 +7586,11 @@ const KanbanPanel = ({
|
|
|
7612
7586
|
]
|
|
7613
7587
|
}
|
|
7614
7588
|
),
|
|
7615
|
-
|
|
7589
|
+
totalTasksState.hasMore && /* @__PURE__ */ jsx(
|
|
7616
7590
|
"button",
|
|
7617
7591
|
{
|
|
7618
|
-
onClick:
|
|
7619
|
-
disabled:
|
|
7592
|
+
onClick: loadMoreTasks,
|
|
7593
|
+
disabled: totalTasksState.isLoadingMore,
|
|
7620
7594
|
style: {
|
|
7621
7595
|
background: theme2.colors.backgroundSecondary,
|
|
7622
7596
|
color: theme2.colors.text,
|
|
@@ -7625,11 +7599,11 @@ const KanbanPanel = ({
|
|
|
7625
7599
|
padding: "6px 12px",
|
|
7626
7600
|
fontSize: theme2.fontSizes[1],
|
|
7627
7601
|
fontWeight: theme2.fontWeights.medium,
|
|
7628
|
-
cursor:
|
|
7629
|
-
opacity:
|
|
7602
|
+
cursor: totalTasksState.isLoadingMore ? "wait" : "pointer",
|
|
7603
|
+
opacity: totalTasksState.isLoadingMore ? 0.7 : 1,
|
|
7630
7604
|
transition: "opacity 0.2s ease"
|
|
7631
7605
|
},
|
|
7632
|
-
children:
|
|
7606
|
+
children: totalTasksState.isLoadingMore ? "Loading..." : `Load more (${totalTasksState.total - totalTasksState.loaded} remaining)`
|
|
7633
7607
|
}
|
|
7634
7608
|
)
|
|
7635
7609
|
] })
|
|
@@ -7696,7 +7670,7 @@ const KanbanPanel = ({
|
|
|
7696
7670
|
},
|
|
7697
7671
|
children: statusColumns.map((status) => {
|
|
7698
7672
|
const isSelected = status === selectedTab;
|
|
7699
|
-
const statusState =
|
|
7673
|
+
const statusState = filteredTasksByStatus.get(status);
|
|
7700
7674
|
const count = (statusState == null ? void 0 : statusState.count) || 0;
|
|
7701
7675
|
return /* @__PURE__ */ jsxs(
|
|
7702
7676
|
"button",
|
|
@@ -7758,26 +7732,19 @@ const KanbanPanel = ({
|
|
|
7758
7732
|
style: {
|
|
7759
7733
|
display: "flex",
|
|
7760
7734
|
gap: "16px",
|
|
7761
|
-
|
|
7735
|
+
width: "100%",
|
|
7762
7736
|
paddingBottom: "8px",
|
|
7763
|
-
minWidth: "100%",
|
|
7764
7737
|
alignItems: "stretch"
|
|
7765
7738
|
},
|
|
7766
7739
|
children: statusColumns.filter((status) => !isNarrowView || status === selectedTab).map((status) => {
|
|
7767
|
-
const statusState =
|
|
7740
|
+
const statusState = filteredTasksByStatus.get(status);
|
|
7768
7741
|
const columnTasks = (statusState == null ? void 0 : statusState.tasks) || [];
|
|
7769
|
-
const isCompleted = status === "completed";
|
|
7770
|
-
const completedState = columnStates.get("completed");
|
|
7771
7742
|
return /* @__PURE__ */ jsx(
|
|
7772
7743
|
KanbanColumn,
|
|
7773
7744
|
{
|
|
7774
7745
|
columnId: status,
|
|
7775
7746
|
status: STATUS_DISPLAY_LABELS[status],
|
|
7776
7747
|
tasks: columnTasks,
|
|
7777
|
-
total: isCompleted ? completedState == null ? void 0 : completedState.total : void 0,
|
|
7778
|
-
hasMore: isCompleted ? completedState == null ? void 0 : completedState.hasMore : false,
|
|
7779
|
-
isLoadingMore: isCompleted ? completedState == null ? void 0 : completedState.isLoadingMore : false,
|
|
7780
|
-
onLoadMore: isCompleted ? () => loadMore("completed") : void 0,
|
|
7781
7748
|
onTaskClick: handleTaskClick,
|
|
7782
7749
|
fullWidth: isNarrowView
|
|
7783
7750
|
},
|
|
@@ -51972,10 +51939,24 @@ const TaskDetailPanel = ({ context, actions, events: events2 }) => {
|
|
|
51972
51939
|
style: {
|
|
51973
51940
|
display: "flex",
|
|
51974
51941
|
alignItems: "center",
|
|
51975
|
-
|
|
51942
|
+
justifyContent: "space-between",
|
|
51976
51943
|
marginBottom: "12px"
|
|
51977
51944
|
},
|
|
51978
51945
|
children: [
|
|
51946
|
+
/* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [
|
|
51947
|
+
/* @__PURE__ */ jsx(
|
|
51948
|
+
"span",
|
|
51949
|
+
{
|
|
51950
|
+
style: {
|
|
51951
|
+
fontFamily: theme2.fonts.monospace,
|
|
51952
|
+
fontSize: theme2.fontSizes[0],
|
|
51953
|
+
color: theme2.colors.textMuted
|
|
51954
|
+
},
|
|
51955
|
+
children: selectedTask.id
|
|
51956
|
+
}
|
|
51957
|
+
),
|
|
51958
|
+
/* @__PURE__ */ jsx(StatusBadge, { status: selectedTask.status })
|
|
51959
|
+
] }),
|
|
51979
51960
|
/* @__PURE__ */ jsx(
|
|
51980
51961
|
"button",
|
|
51981
51962
|
{
|
|
@@ -52001,22 +51982,10 @@ const TaskDetailPanel = ({ context, actions, events: events2 }) => {
|
|
|
52001
51982
|
e.currentTarget.style.background = theme2.colors.surface;
|
|
52002
51983
|
e.currentTarget.style.color = theme2.colors.textSecondary;
|
|
52003
51984
|
},
|
|
52004
|
-
title: "
|
|
52005
|
-
children: /* @__PURE__ */ jsx(
|
|
52006
|
-
}
|
|
52007
|
-
),
|
|
52008
|
-
/* @__PURE__ */ jsx(
|
|
52009
|
-
"span",
|
|
52010
|
-
{
|
|
52011
|
-
style: {
|
|
52012
|
-
fontFamily: theme2.fonts.monospace,
|
|
52013
|
-
fontSize: theme2.fontSizes[0],
|
|
52014
|
-
color: theme2.colors.textMuted
|
|
52015
|
-
},
|
|
52016
|
-
children: selectedTask.id
|
|
51985
|
+
title: "Close",
|
|
51986
|
+
children: /* @__PURE__ */ jsx(X, { size: 16 })
|
|
52017
51987
|
}
|
|
52018
|
-
)
|
|
52019
|
-
/* @__PURE__ */ jsx(StatusBadge, { status: selectedTask.status })
|
|
51988
|
+
)
|
|
52020
51989
|
]
|
|
52021
51990
|
}
|
|
52022
51991
|
),
|