design-system-next 2.17.8 → 2.19.3
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/design-system-next.es.js +7252 -7106
- package/dist/design-system-next.es.js.gz +0 -0
- package/dist/design-system-next.umd.js +12 -13
- package/dist/design-system-next.umd.js.gz +0 -0
- package/dist/main.css +1 -1
- package/dist/main.css.gz +0 -0
- package/dist/package.json.d.ts +1 -1
- package/package.json +1 -1
- package/src/App.vue +1 -51
- package/src/assets/styles/tailwind.css +105 -44
- package/src/components/attribute-filter/attribute-filter.vue +1 -1
- package/src/components/audit-trail/audit-trail.ts +28 -0
- package/src/components/audit-trail/audit-trail.vue +104 -0
- package/src/components/audit-trail/use-audit-trail.ts +82 -0
- package/src/components/chips/chips.vue +4 -1
- package/src/components/date-picker/{reusable-calendar/reusable-calendar.ts → date-calendar-picker/date-calendar-picker.ts} +4 -4
- package/src/components/date-picker/{reusable-calendar/reusable-calendar.vue → date-calendar-picker/date-calendar-picker.vue} +10 -10
- package/src/components/date-picker/{reusable-calendar/use-reusable-calendar.ts → date-calendar-picker/use-date-calendar-picker.ts} +4 -4
- package/src/components/list/ladderized-list/use-ladderized-list.ts +19 -8
- package/src/components/lozenge/use-lozenge.ts +55 -23
- package/src/components/select/select-ladderized/select-ladderized.ts +5 -1
- package/src/components/select/select-ladderized/select-ladderized.vue +3 -1
- package/src/components/select/select-ladderized/use-select-ladderized.ts +17 -4
- package/src/components/table/table.vue +3 -4
|
@@ -587,7 +587,7 @@
|
|
|
587
587
|
}
|
|
588
588
|
|
|
589
589
|
.spr-text-color-supporting {
|
|
590
|
-
@apply spr-text-mushroom-
|
|
590
|
+
@apply spr-text-mushroom-500;
|
|
591
591
|
}
|
|
592
592
|
|
|
593
593
|
.spr-text-color-base {
|
|
@@ -595,15 +595,15 @@
|
|
|
595
595
|
}
|
|
596
596
|
|
|
597
597
|
.spr-text-color-weak {
|
|
598
|
-
@apply spr-text-mushroom-
|
|
598
|
+
@apply spr-text-mushroom-400;
|
|
599
599
|
}
|
|
600
600
|
|
|
601
601
|
.spr-text-color-disabled {
|
|
602
|
-
@apply spr-text-white-
|
|
602
|
+
@apply spr-text-white-400;
|
|
603
603
|
}
|
|
604
604
|
|
|
605
605
|
.spr-text-color-on-fill-disabled {
|
|
606
|
-
@apply spr-text-white-
|
|
606
|
+
@apply spr-text-white-500;
|
|
607
607
|
}
|
|
608
608
|
|
|
609
609
|
.spr-text-color-inverted-strong {
|
|
@@ -647,51 +647,51 @@
|
|
|
647
647
|
}
|
|
648
648
|
|
|
649
649
|
.spr-text-color-information-base {
|
|
650
|
-
@apply spr-text-blueberry-
|
|
650
|
+
@apply spr-text-blueberry-800;
|
|
651
651
|
}
|
|
652
652
|
|
|
653
653
|
.spr-text-color-information-hover {
|
|
654
|
-
@apply spr-text-blueberry-
|
|
654
|
+
@apply spr-text-blueberry-900;
|
|
655
655
|
}
|
|
656
656
|
|
|
657
657
|
.spr-text-color-information-pressed {
|
|
658
|
-
@apply spr-text-blueberry-
|
|
658
|
+
@apply spr-text-blueberry-950;
|
|
659
659
|
}
|
|
660
660
|
|
|
661
661
|
.spr-text-color-danger-base {
|
|
662
|
-
@apply spr-text-tomato-
|
|
662
|
+
@apply spr-text-tomato-700;
|
|
663
663
|
}
|
|
664
664
|
|
|
665
665
|
.spr-text-color-danger-hover {
|
|
666
|
-
@apply spr-text-tomato-
|
|
666
|
+
@apply spr-text-tomato-800;
|
|
667
667
|
}
|
|
668
668
|
|
|
669
669
|
.spr-text-color-danger-pressed {
|
|
670
|
-
@apply spr-text-tomato-
|
|
670
|
+
@apply spr-text-tomato-900;
|
|
671
671
|
}
|
|
672
672
|
|
|
673
673
|
.spr-text-color-pending-base {
|
|
674
|
-
@apply spr-text-mango-
|
|
674
|
+
@apply spr-text-mango-800;
|
|
675
675
|
}
|
|
676
676
|
|
|
677
677
|
.spr-text-color-pending-hover {
|
|
678
|
-
@apply spr-text-mango-
|
|
678
|
+
@apply spr-text-mango-900;
|
|
679
679
|
}
|
|
680
680
|
|
|
681
681
|
.spr-text-color-pending-pressed {
|
|
682
|
-
@apply spr-text-mango-
|
|
682
|
+
@apply spr-text-mango-950;
|
|
683
683
|
}
|
|
684
684
|
|
|
685
685
|
.spr-text-color-caution-base {
|
|
686
|
-
@apply spr-text-carrot-
|
|
686
|
+
@apply spr-text-carrot-800;
|
|
687
687
|
}
|
|
688
688
|
|
|
689
689
|
.spr-text-color-caution-hover {
|
|
690
|
-
@apply spr-text-carrot-
|
|
690
|
+
@apply spr-text-carrot-900;
|
|
691
691
|
}
|
|
692
692
|
|
|
693
693
|
.spr-text-color-caution-pressed {
|
|
694
|
-
@apply spr-text-carrot-
|
|
694
|
+
@apply spr-text-carrot-950;
|
|
695
695
|
}
|
|
696
696
|
|
|
697
697
|
.spr-text-color-accent-base {
|
|
@@ -713,6 +713,25 @@
|
|
|
713
713
|
}
|
|
714
714
|
|
|
715
715
|
.spr-background-color-surface {
|
|
716
|
+
@apply spr-bg-mushroom-50;
|
|
717
|
+
}
|
|
718
|
+
.spr-background-color-surface-adaptive {
|
|
719
|
+
@apply spr-bg-mushroom-950/[0.05];
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
.spr-background-color-base {
|
|
723
|
+
@apply spr-bg-mushroom-100;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
.spr-background-color-hover {
|
|
727
|
+
@apply spr-bg-mushroom-950/[0.08];
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
.spr-background-color-pressed {
|
|
731
|
+
@apply spr-bg-mushroom-950/[0.12];
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
.spr-background-color-disabled {
|
|
716
735
|
@apply spr-bg-white-100;
|
|
717
736
|
}
|
|
718
737
|
|
|
@@ -728,10 +747,6 @@
|
|
|
728
747
|
@apply spr-bg-mushroom-800;
|
|
729
748
|
}
|
|
730
749
|
|
|
731
|
-
.spr-background-color-base {
|
|
732
|
-
@apply spr-bg-mushroom-50;
|
|
733
|
-
}
|
|
734
|
-
|
|
735
750
|
.spr-background-color-single-active {
|
|
736
751
|
@apply spr-bg-kangkong-100;
|
|
737
752
|
}
|
|
@@ -740,18 +755,7 @@
|
|
|
740
755
|
@apply spr-bg-kangkong-50;
|
|
741
756
|
}
|
|
742
757
|
|
|
743
|
-
|
|
744
|
-
@apply spr-bg-mushroom-50;
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
.spr-background-color-pressed {
|
|
748
|
-
@apply spr-bg-mushroom-100;
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
.spr-background-color-disabled {
|
|
752
|
-
@apply spr-bg-white-100;
|
|
753
|
-
}
|
|
754
|
-
|
|
758
|
+
/* BRAND COLORS */
|
|
755
759
|
.spr-background-color-brand-base {
|
|
756
760
|
@apply spr-bg-kangkong-700;
|
|
757
761
|
}
|
|
@@ -768,10 +772,18 @@
|
|
|
768
772
|
@apply spr-bg-kangkong-100;
|
|
769
773
|
}
|
|
770
774
|
|
|
775
|
+
.spr-background-color-brand-weak-hover {
|
|
776
|
+
@apply spr-bg-kangkong-200;
|
|
777
|
+
}
|
|
778
|
+
.spr-background-color-brand-weak-pressed {
|
|
779
|
+
@apply spr-bg-kangkong-300;
|
|
780
|
+
}
|
|
781
|
+
|
|
771
782
|
.spr-background-color-success-base {
|
|
772
783
|
@apply spr-bg-kangkong-600;
|
|
773
784
|
}
|
|
774
785
|
|
|
786
|
+
/* SUCCESS COLORS */
|
|
775
787
|
.spr-background-color-success-hover {
|
|
776
788
|
@apply spr-bg-kangkong-700;
|
|
777
789
|
}
|
|
@@ -784,6 +796,14 @@
|
|
|
784
796
|
@apply spr-bg-kangkong-100;
|
|
785
797
|
}
|
|
786
798
|
|
|
799
|
+
.spr-background-color-success-weak-hover {
|
|
800
|
+
@apply spr-bg-kangkong-200;
|
|
801
|
+
}
|
|
802
|
+
.spr-background-color-success-weak-pressed {
|
|
803
|
+
@apply spr-bg-kangkong-300;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/* INFORMATION COLORS */
|
|
787
807
|
.spr-background-color-information-base {
|
|
788
808
|
@apply spr-bg-blueberry-600;
|
|
789
809
|
}
|
|
@@ -799,7 +819,14 @@
|
|
|
799
819
|
.spr-background-color-information-weak {
|
|
800
820
|
@apply spr-bg-blueberry-100;
|
|
801
821
|
}
|
|
822
|
+
.spr-background-color-information-weak-hover {
|
|
823
|
+
@apply spr-bg-blueberry-200;
|
|
824
|
+
}
|
|
825
|
+
.spr-background-color-information-weak-pressed {
|
|
826
|
+
@apply spr-bg-blueberry-300;
|
|
827
|
+
}
|
|
802
828
|
|
|
829
|
+
/* PENDING COLORS */
|
|
803
830
|
.spr-background-color-pending-base {
|
|
804
831
|
@apply spr-bg-mango-500;
|
|
805
832
|
}
|
|
@@ -815,7 +842,14 @@
|
|
|
815
842
|
.spr-background-color-pending-weak {
|
|
816
843
|
@apply spr-bg-mango-100;
|
|
817
844
|
}
|
|
845
|
+
.spr-background-color-pending-weak-hover {
|
|
846
|
+
@apply spr-bg-mango-200;
|
|
847
|
+
}
|
|
848
|
+
.spr-background-color-pending-weak-pressed {
|
|
849
|
+
@apply spr-bg-mango-300;
|
|
850
|
+
}
|
|
818
851
|
|
|
852
|
+
/* CAUTION COLORS */
|
|
819
853
|
.spr-background-color-caution-base {
|
|
820
854
|
@apply spr-bg-carrot-500;
|
|
821
855
|
}
|
|
@@ -831,7 +865,14 @@
|
|
|
831
865
|
.spr-background-color-caution-weak {
|
|
832
866
|
@apply spr-bg-carrot-100;
|
|
833
867
|
}
|
|
868
|
+
.spr-background-color-caution-weak-hover {
|
|
869
|
+
@apply spr-bg-carrot-200;
|
|
870
|
+
}
|
|
871
|
+
.spr-background-color-caution-weak-pressed {
|
|
872
|
+
@apply spr-bg-carrot-300;
|
|
873
|
+
}
|
|
834
874
|
|
|
875
|
+
/* ACCENT COLORS */
|
|
835
876
|
.spr-background-color-accent-base {
|
|
836
877
|
@apply spr-bg-wintermelon-600;
|
|
837
878
|
}
|
|
@@ -847,7 +888,14 @@
|
|
|
847
888
|
.spr-background-color-accent-weak {
|
|
848
889
|
@apply spr-bg-wintermelon-100;
|
|
849
890
|
}
|
|
891
|
+
.spr-background-color-accent-weak-hover {
|
|
892
|
+
@apply spr-bg-wintermelon-200;
|
|
893
|
+
}
|
|
894
|
+
.spr-background-color-accent-weak-pressed {
|
|
895
|
+
@apply spr-bg-wintermelon-300;
|
|
896
|
+
}
|
|
850
897
|
|
|
898
|
+
/* DANGER COLORS */
|
|
851
899
|
.spr-background-color-danger-base {
|
|
852
900
|
@apply spr-bg-tomato-600;
|
|
853
901
|
}
|
|
@@ -863,6 +911,12 @@
|
|
|
863
911
|
.spr-background-color-danger-weak {
|
|
864
912
|
@apply spr-bg-tomato-100;
|
|
865
913
|
}
|
|
914
|
+
.spr-background-color-danger-weak-hover {
|
|
915
|
+
@apply spr-bg-tomato-200;
|
|
916
|
+
}
|
|
917
|
+
.spr-background-color-danger-weak-pressed {
|
|
918
|
+
@apply spr-bg-tomato-300;
|
|
919
|
+
}
|
|
866
920
|
|
|
867
921
|
.spr-switch-background-default {
|
|
868
922
|
@apply spr-bg-mushroom-200;
|
|
@@ -910,6 +964,7 @@
|
|
|
910
964
|
@apply spr-border-white-200;
|
|
911
965
|
}
|
|
912
966
|
|
|
967
|
+
/* BRAND COLORS */
|
|
913
968
|
.spr-border-color-brand-base {
|
|
914
969
|
@apply spr-border-kangkong-700;
|
|
915
970
|
}
|
|
@@ -922,6 +977,7 @@
|
|
|
922
977
|
@apply spr-border-kangkong-900;
|
|
923
978
|
}
|
|
924
979
|
|
|
980
|
+
/* SUCCESS COLORS */
|
|
925
981
|
.spr-border-color-success-base {
|
|
926
982
|
@apply spr-border-kangkong-700;
|
|
927
983
|
}
|
|
@@ -934,54 +990,59 @@
|
|
|
934
990
|
@apply spr-border-kangkong-900;
|
|
935
991
|
}
|
|
936
992
|
|
|
993
|
+
/* INFORMATION COLORS */
|
|
937
994
|
.spr-border-color-information-base {
|
|
938
|
-
@apply spr-border-blueberry-
|
|
995
|
+
@apply spr-border-blueberry-800;
|
|
939
996
|
}
|
|
940
997
|
|
|
941
998
|
.spr-border-color-information-hover {
|
|
942
|
-
@apply spr-border-blueberry-
|
|
999
|
+
@apply spr-border-blueberry-900;
|
|
943
1000
|
}
|
|
944
1001
|
|
|
945
1002
|
.spr-border-color-information-pressed {
|
|
946
|
-
@apply spr-border-blueberry-
|
|
1003
|
+
@apply spr-border-blueberry-950;
|
|
947
1004
|
}
|
|
948
1005
|
|
|
1006
|
+
/* DANGER COLORS */
|
|
949
1007
|
.spr-border-color-danger-base {
|
|
950
|
-
@apply spr-border-tomato-
|
|
1008
|
+
@apply spr-border-tomato-700;
|
|
951
1009
|
}
|
|
952
1010
|
|
|
953
1011
|
.spr-border-color-danger-hover {
|
|
954
|
-
@apply spr-border-tomato-
|
|
1012
|
+
@apply spr-border-tomato-800;
|
|
955
1013
|
}
|
|
956
1014
|
|
|
957
1015
|
.spr-border-color-danger-pressed {
|
|
958
|
-
@apply spr-border-tomato-
|
|
1016
|
+
@apply spr-border-tomato-900;
|
|
959
1017
|
}
|
|
960
1018
|
|
|
1019
|
+
/* PENDING COLORS */
|
|
961
1020
|
.spr-border-color-pending-base {
|
|
962
|
-
@apply spr-border-mango-
|
|
1021
|
+
@apply spr-border-mango-800;
|
|
963
1022
|
}
|
|
964
1023
|
|
|
965
1024
|
.spr-border-color-pending-hover {
|
|
966
|
-
@apply spr-border-mango-
|
|
1025
|
+
@apply spr-border-mango-900;
|
|
967
1026
|
}
|
|
968
1027
|
|
|
969
1028
|
.spr-border-color-pending-pressed {
|
|
970
|
-
@apply spr-border-mango-
|
|
1029
|
+
@apply spr-border-mango-950;
|
|
971
1030
|
}
|
|
972
1031
|
|
|
1032
|
+
/* CAUTION COLORS */
|
|
973
1033
|
.spr-border-color-caution-base {
|
|
974
|
-
@apply spr-border-carrot-
|
|
1034
|
+
@apply spr-border-carrot-800;
|
|
975
1035
|
}
|
|
976
1036
|
|
|
977
1037
|
.spr-border-color-caution-hover {
|
|
978
|
-
@apply spr-border-carrot-
|
|
1038
|
+
@apply spr-border-carrot-900;
|
|
979
1039
|
}
|
|
980
1040
|
|
|
981
1041
|
.spr-border-color-caution-pressed {
|
|
982
|
-
@apply spr-border-carrot-
|
|
1042
|
+
@apply spr-border-carrot-950;
|
|
983
1043
|
}
|
|
984
1044
|
|
|
1045
|
+
/* ACCENT COLORS */
|
|
985
1046
|
.spr-border-color-accent-base {
|
|
986
1047
|
@apply spr-border-wintermelon-700;
|
|
987
1048
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
+
|
|
3
|
+
export const definePropType = <T>(val: unknown): PropType<T> => val as PropType<T>;
|
|
4
|
+
export interface AuditTrailLog {
|
|
5
|
+
userName: string;
|
|
6
|
+
avatarUrl?: string;
|
|
7
|
+
title: string;
|
|
8
|
+
logs: LogEntry[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface LogEntry {
|
|
12
|
+
label: string[];
|
|
13
|
+
oldValue: string;
|
|
14
|
+
newValue: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const auditTrailPropTypes = {
|
|
18
|
+
auditTrailLogs: {
|
|
19
|
+
type: Array as PropType<AuditTrailLog[]>,
|
|
20
|
+
default: () => [],
|
|
21
|
+
},
|
|
22
|
+
alwaysOpen: {
|
|
23
|
+
type: Boolean,
|
|
24
|
+
default: true,
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type AuditTrailPropTypes = ExtractPropTypes<typeof auditTrailPropTypes>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div id="audit_trail_wrapper" ref="auditTrailWrapperRef" class="spr-flex spr-flex-col spr-gap-size-spacing-2xs">
|
|
3
|
+
<div v-for="(entry, index) in auditTrailLogs" id="audit_trail_entry" :key="index" class="spr-relative spr-h-fit">
|
|
4
|
+
<div class="spr-absolute spr-h-full spr-py-[6px]">
|
|
5
|
+
<div
|
|
6
|
+
:class="[
|
|
7
|
+
'spr-h-[6px] spr-w-[6px] spr-rounded-full',
|
|
8
|
+
index === 0 ? 'spr-bg-kangkong-600' : 'spr-bg-mushroom-200',
|
|
9
|
+
]"
|
|
10
|
+
/>
|
|
11
|
+
<div
|
|
12
|
+
:class="[
|
|
13
|
+
'spr-relative spr-left-1/2 spr-mt-size-spacing-5xs spr-h-[calc(100%-18px)] spr-w-[1px] spr-translate-x-[-50%]',
|
|
14
|
+
index === 0 ? 'spr-bg-kangkong-600' : 'spr-bg-mushroom-200',
|
|
15
|
+
collapsedState[index] ? 'spr-h-[calc(100%-12px)]' : 'spr-h-[calc(100%-22px)]',
|
|
16
|
+
]"
|
|
17
|
+
/>
|
|
18
|
+
</div>
|
|
19
|
+
<div
|
|
20
|
+
id="audit_trail_header"
|
|
21
|
+
class="hover:spr-background-color-hover spr-ml-[10px] spr-flex spr-w-full spr-items-center spr-justify-between spr-gap-size-spacing-3xs spr-self-start spr-px-2 spr-py-[6px] hover:spr-cursor-pointer hover:spr-rounded-lg"
|
|
22
|
+
@click="toggleCollapse(index)"
|
|
23
|
+
>
|
|
24
|
+
<div id="audit_trail_avatar" :class="[{ 'spr-self-start': isMultiLine[index] }]">
|
|
25
|
+
<SprAvatar v-if="!!entry.avatarUrl" variant="image" :src="entry.avatarUrl" size="sm" />
|
|
26
|
+
<SprAvatar v-else :initial="entry.userName" size="sm" />
|
|
27
|
+
</div>
|
|
28
|
+
<span
|
|
29
|
+
id="audit_trail_title"
|
|
30
|
+
:ref="(el) => setTitleRef(el, index)"
|
|
31
|
+
class="spr-text-color-strong spr-text-200 spr-font-normal"
|
|
32
|
+
>
|
|
33
|
+
{{ entry.title }}
|
|
34
|
+
</span>
|
|
35
|
+
<div :class="['spr-h-4 spr-w-4', { 'spr-self-start': isMultiLine[index] }]">
|
|
36
|
+
<Icon
|
|
37
|
+
:icon="collapsedState[index] ? 'ph:caret-up' : 'ph:caret-down'"
|
|
38
|
+
width="16px"
|
|
39
|
+
height="16px"
|
|
40
|
+
class="spr-text-color-strong"
|
|
41
|
+
/>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
<div id="audit_trail_logs_wrapper" class="spr-pl-[18px]">
|
|
45
|
+
<SprCollapsible v-model="collapsedState[index]">
|
|
46
|
+
<div
|
|
47
|
+
v-for="(log, logIndex) in entry.logs"
|
|
48
|
+
id="audit_trail_log_entries"
|
|
49
|
+
:key="logIndex"
|
|
50
|
+
:class="[
|
|
51
|
+
'spr-flex spr-flex-col spr-gap-size-spacing-3xs',
|
|
52
|
+
{ 'spr-pb-size-spacing-3xs': logIndex !== entry.logs.length - 1 },
|
|
53
|
+
]"
|
|
54
|
+
>
|
|
55
|
+
<div id="log_label">
|
|
56
|
+
<SprTooltip
|
|
57
|
+
:text="log.label.join(' > ')"
|
|
58
|
+
placement="bottom"
|
|
59
|
+
:show-triggers="log.label.length > 2 ? 'hover' : []"
|
|
60
|
+
>
|
|
61
|
+
<div id="entry_label" class="spr-text-color-strong spr-text-200 spr-font-normal">
|
|
62
|
+
<template v-if="log.label.length === 1">
|
|
63
|
+
{{ log.label[0] }}
|
|
64
|
+
</template>
|
|
65
|
+
<template v-else-if="log.label.length === 2">
|
|
66
|
+
{{ log.label.join(' > ') }}
|
|
67
|
+
</template>
|
|
68
|
+
<template v-else> {{ log.label[0] }} > ... > {{ log.label[log.label.length - 1] }} </template>
|
|
69
|
+
</div>
|
|
70
|
+
</SprTooltip>
|
|
71
|
+
</div>
|
|
72
|
+
<div id="log_values" class="spr-flex spr-items-center spr-gap-size-spacing-3xs">
|
|
73
|
+
<div
|
|
74
|
+
id="old_value"
|
|
75
|
+
class="spr-border-color-weak spr-text-color-supporting spr-rounded-border-radius-xs spr-border spr-border-solid spr-px-size-spacing-5xs spr-py-size-spacing-6xs spr-text-200 spr-font-normal"
|
|
76
|
+
>
|
|
77
|
+
{{ log.oldValue }}
|
|
78
|
+
</div>
|
|
79
|
+
<span class="spr-text-200 spr-font-medium"> → </span>
|
|
80
|
+
<div
|
|
81
|
+
id="new_value"
|
|
82
|
+
class="spr-border-color-weak spr-text-color-strong spr-rounded-border-radius-xs spr-border spr-border-solid spr-px-size-spacing-5xs spr-py-size-spacing-6xs spr-text-200 spr-font-normal"
|
|
83
|
+
>
|
|
84
|
+
{{ log.newValue }}
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
</SprCollapsible>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</template>
|
|
93
|
+
<script lang="ts" setup>
|
|
94
|
+
import SprAvatar from '../avatar/avatar.vue';
|
|
95
|
+
import { useAuditTrail } from './use-audit-trail';
|
|
96
|
+
import { auditTrailPropTypes } from './audit-trail';
|
|
97
|
+
import { Icon } from '@iconify/vue';
|
|
98
|
+
import SprCollapsible from '../collapsible/collapsible.vue';
|
|
99
|
+
import SprTooltip from '../tooltip/tooltip.vue';
|
|
100
|
+
|
|
101
|
+
const props = defineProps(auditTrailPropTypes);
|
|
102
|
+
const { auditTrailLogs, collapsedState, toggleCollapse, setTitleRef, isMultiLine, auditTrailWrapperRef } =
|
|
103
|
+
useAuditTrail(props);
|
|
104
|
+
</script>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { AuditTrailPropTypes } from './audit-trail';
|
|
2
|
+
import { toRefs, reactive, nextTick, onMounted, onUnmounted, ref } from 'vue';
|
|
3
|
+
export const useAuditTrail = (props: AuditTrailPropTypes) => {
|
|
4
|
+
const { auditTrailLogs, alwaysOpen } = toRefs(props);
|
|
5
|
+
|
|
6
|
+
const collapsedState = reactive(auditTrailLogs.value.map((_, index) => index === 0));
|
|
7
|
+
|
|
8
|
+
const toggleCollapse = (index: number) => {
|
|
9
|
+
if (index < 0 || index >= collapsedState.length) return;
|
|
10
|
+
|
|
11
|
+
collapsedState[index] = !collapsedState[index];
|
|
12
|
+
if (!alwaysOpen.value) {
|
|
13
|
+
collapsedState.forEach((_, i) => {
|
|
14
|
+
if (i !== index) {
|
|
15
|
+
collapsedState[i] = false;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const auditTrailWrapperRef = ref<HTMLElement | null>(null);
|
|
21
|
+
const titleRefs = reactive<{ [key: number]: HTMLElement | null }>({});
|
|
22
|
+
const isMultiLine = reactive<{ [key: number]: boolean }>({});
|
|
23
|
+
const resizeObserver = ref<ResizeObserver | null>(null);
|
|
24
|
+
|
|
25
|
+
const setTitleRef = (el: unknown, index: number) => {
|
|
26
|
+
const element = el as HTMLElement;
|
|
27
|
+
titleRefs[index] = element;
|
|
28
|
+
if (element) {
|
|
29
|
+
checkIfMultiLine(element, index);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const checkIfMultiLine = (element: HTMLElement, index: number) => {
|
|
34
|
+
nextTick(() => {
|
|
35
|
+
const computedStyle = getComputedStyle(element);
|
|
36
|
+
const lineHeight = parseFloat(computedStyle.lineHeight);
|
|
37
|
+
const elementHeight = element.offsetHeight;
|
|
38
|
+
|
|
39
|
+
// If lineHeight is 'normal', calculate it based on font size
|
|
40
|
+
const actualLineHeight = isNaN(lineHeight) ? parseFloat(computedStyle.fontSize) * 1.2 : lineHeight;
|
|
41
|
+
|
|
42
|
+
isMultiLine[index] = elementHeight > actualLineHeight * 1.1;
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const checkAllMultiLine = (): void => {
|
|
47
|
+
Object.entries(titleRefs).forEach(([indexStr, el]) => {
|
|
48
|
+
if (el) {
|
|
49
|
+
const index = parseInt(indexStr, 10);
|
|
50
|
+
checkIfMultiLine(el, index);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
onMounted(() => {
|
|
56
|
+
nextTick(() => {
|
|
57
|
+
if (!auditTrailWrapperRef.value) return;
|
|
58
|
+
resizeObserver.value = new ResizeObserver((entries) => {
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
if (entry.target.id === auditTrailWrapperRef.value?.id) {
|
|
61
|
+
checkAllMultiLine();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
resizeObserver.value.observe(auditTrailWrapperRef.value);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
onUnmounted(() => {
|
|
71
|
+
resizeObserver.value?.disconnect();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
auditTrailLogs,
|
|
76
|
+
collapsedState,
|
|
77
|
+
toggleCollapse,
|
|
78
|
+
setTitleRef,
|
|
79
|
+
isMultiLine,
|
|
80
|
+
auditTrailWrapperRef,
|
|
81
|
+
};
|
|
82
|
+
};
|
|
@@ -8,7 +8,10 @@
|
|
|
8
8
|
@click="handleClick"
|
|
9
9
|
@keyup.enter="handleClick"
|
|
10
10
|
>
|
|
11
|
-
<template v-if="
|
|
11
|
+
<template v-if="slots.default">
|
|
12
|
+
<slot />
|
|
13
|
+
</template>
|
|
14
|
+
<template v-else-if="variant === 'tag'">
|
|
12
15
|
<span v-if="hasIcon" class="chips-icon spr-inline-flex spr-items-center spr-leading-[0]">
|
|
13
16
|
<slot name="icon">
|
|
14
17
|
<Icon :icon="getIcon" class="spr-font-size-300" />
|
|
@@ -27,7 +27,7 @@ export type RestDayType = 'su' | 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa';
|
|
|
27
27
|
export type DatePickerMode = typeof DATE_PICKER_MODES[number];
|
|
28
28
|
|
|
29
29
|
// Define props with JSDoc comments for documentation
|
|
30
|
-
export const
|
|
30
|
+
export const dateCalendarPickerPropTypes = {
|
|
31
31
|
/**
|
|
32
32
|
* @description The selected date value (v-model)
|
|
33
33
|
*/
|
|
@@ -109,7 +109,7 @@ export const reusableCalendarPropTypes = {
|
|
|
109
109
|
};
|
|
110
110
|
|
|
111
111
|
// Define emits with type validation
|
|
112
|
-
export const
|
|
112
|
+
export const dateCalendarPickerEmitTypes = {
|
|
113
113
|
'update:modelValue': (value: string): value is string => typeof value === 'string',
|
|
114
114
|
'update:month': (month: number): month is number => typeof month === 'number',
|
|
115
115
|
'update:year': (year: number): year is number => typeof year === 'number',
|
|
@@ -117,5 +117,5 @@ export const reusableCalendarEmitTypes = {
|
|
|
117
117
|
};
|
|
118
118
|
|
|
119
119
|
// Export types for use in other files
|
|
120
|
-
export type
|
|
121
|
-
export type
|
|
120
|
+
export type DateCalendarPickerPropTypes = ExtractPropTypes<typeof dateCalendarPickerPropTypes>;
|
|
121
|
+
export type DateCalendarPickerEmitTypes = typeof dateCalendarPickerEmitTypes;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
|
-
ref="
|
|
4
|
-
:class="
|
|
3
|
+
ref="dateCalendarPickerRef"
|
|
4
|
+
:class="dateCalendarPickerClasses"
|
|
5
5
|
>
|
|
6
6
|
<div
|
|
7
7
|
:class="[
|
|
@@ -132,13 +132,13 @@ import DatePickerCalendarTab from '../tabs/DatePickerCalendarTab.vue';
|
|
|
132
132
|
import DatePickerMonthTab from '../tabs/DatePickerMonthTab.vue';
|
|
133
133
|
import DatePickerYearTab from '../tabs/DatePickerYearTab.vue';
|
|
134
134
|
|
|
135
|
-
import {
|
|
136
|
-
import {
|
|
135
|
+
import { useDateCalendarPicker } from './use-date-calendar-picker';
|
|
136
|
+
import { dateCalendarPickerEmitTypes, dateCalendarPickerPropTypes } from './date-calendar-picker';
|
|
137
137
|
|
|
138
|
-
const props = defineProps(
|
|
139
|
-
const emit = defineEmits(
|
|
138
|
+
const props = defineProps(dateCalendarPickerPropTypes);
|
|
139
|
+
const emit = defineEmits(dateCalendarPickerEmitTypes);
|
|
140
140
|
|
|
141
|
-
const
|
|
141
|
+
const dateCalendarPickerRef = ref<HTMLElement | null>(null);
|
|
142
142
|
|
|
143
143
|
// Use the composable for all logic
|
|
144
144
|
const {
|
|
@@ -176,12 +176,12 @@ const {
|
|
|
176
176
|
handleMonthTabMonthUpdateWrapper,
|
|
177
177
|
handleYearTabYearUpdateWrapper,
|
|
178
178
|
handleYearTabCurrentPageUpdateWrapper,
|
|
179
|
-
} =
|
|
179
|
+
} = useDateCalendarPicker(props, emit);
|
|
180
180
|
|
|
181
181
|
// Compute CSS classes using classNames utility
|
|
182
|
-
const
|
|
182
|
+
const dateCalendarPickerClasses = computed(() => {
|
|
183
183
|
return classNames(
|
|
184
|
-
'
|
|
184
|
+
'date-calendar-picker-container spr-bg-white spr-rounded-lg spr-shadow-lg spr-border spr-border-solid spr-border-mushroom-200 min-w-[320px]',
|
|
185
185
|
{
|
|
186
186
|
'spr-disabled': props.disabled,
|
|
187
187
|
'spr-readonly': props.readonly,
|
|
@@ -3,11 +3,11 @@ import { toRefs } from 'vue';
|
|
|
3
3
|
import dayjs from 'dayjs';
|
|
4
4
|
|
|
5
5
|
import type { SetupContext } from 'vue';
|
|
6
|
-
import type {
|
|
6
|
+
import type { DateCalendarPickerEmitTypes, DateCalendarPickerPropTypes } from './date-calendar-picker';
|
|
7
7
|
|
|
8
|
-
export const
|
|
9
|
-
props:
|
|
10
|
-
emit: SetupContext<
|
|
8
|
+
export const useDateCalendarPicker = (
|
|
9
|
+
props: DateCalendarPickerPropTypes,
|
|
10
|
+
emit: SetupContext<DateCalendarPickerEmitTypes>['emit']
|
|
11
11
|
) => {
|
|
12
12
|
// Extract reactive props
|
|
13
13
|
const {
|