@addsign/moje-agenda-shared-lib 0.0.71 → 0.0.72

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.
@@ -777,6 +777,9 @@ video {
777
777
  .hidden {
778
778
  display: none;
779
779
  }
780
+ .h-10 {
781
+ height: 2.5rem;
782
+ }
780
783
  .h-11 {
781
784
  height: 2.75rem;
782
785
  }
@@ -828,6 +831,9 @@ video {
828
831
  .h-\[400px\] {
829
832
  height: 400px;
830
833
  }
834
+ .h-\[72px\] {
835
+ height: 72px;
836
+ }
831
837
  .h-full {
832
838
  height: 100%;
833
839
  }
@@ -894,6 +900,9 @@ video {
894
900
  .w-96 {
895
901
  width: 24rem;
896
902
  }
903
+ .w-\[20px\] {
904
+ width: 20px;
905
+ }
897
906
  .w-\[calc\(100\%-40px\)\] {
898
907
  width: calc(100% - 40px);
899
908
  }
@@ -958,6 +967,9 @@ video {
958
967
  .cursor-no-drop {
959
968
  cursor: no-drop;
960
969
  }
970
+ .cursor-not-allowed {
971
+ cursor: not-allowed;
972
+ }
961
973
  .cursor-pointer {
962
974
  cursor: pointer;
963
975
  }
@@ -1558,6 +1570,10 @@ video {
1558
1570
  padding-left: 0.375rem;
1559
1571
  padding-right: 0.375rem;
1560
1572
  }
1573
+ .px-10 {
1574
+ padding-left: 2.5rem;
1575
+ padding-right: 2.5rem;
1576
+ }
1561
1577
  .px-2 {
1562
1578
  padding-left: 0.5rem;
1563
1579
  padding-right: 0.5rem;
@@ -1578,10 +1594,6 @@ video {
1578
1594
  padding-left: 1.5rem;
1579
1595
  padding-right: 1.5rem;
1580
1596
  }
1581
- .px-8 {
1582
- padding-left: 2rem;
1583
- padding-right: 2rem;
1584
- }
1585
1597
  .py-0 {
1586
1598
  padding-top: 0px;
1587
1599
  padding-bottom: 0px;
@@ -101,7 +101,7 @@ const Calendar = ({
101
101
  "div",
102
102
  {
103
103
  onClick: goToPreviousMonth,
104
- className: "mr-5 px-8 py-4 cursor-pointer hover:bg-gray-100 rounded-xl text-sm",
104
+ className: "mr-5 px-10 py-4 cursor-pointer hover:bg-gray-150 rounded-lg text-sm",
105
105
  children: /* @__PURE__ */ jsx(FaChevronLeft, {})
106
106
  }
107
107
  ),
@@ -114,7 +114,7 @@ const Calendar = ({
114
114
  "div",
115
115
  {
116
116
  onClick: goToNextMonth,
117
- className: "px-8 py-4 cursor-pointer hover:bg-gray-100 rounded-xl text-sm",
117
+ className: "px-10 py-4 cursor-pointer hover:bg-gray-150 rounded-lg text-sm",
118
118
  children: /* @__PURE__ */ jsx(FaChevronRight, {})
119
119
  }
120
120
  )
@@ -141,7 +141,7 @@ const Calendar = ({
141
141
  return /* @__PURE__ */ jsxs(
142
142
  "div",
143
143
  {
144
- className: "p-0 align-middle justify-center text-center border-t hover:bg-gray-150 " + (dayIndex > 4 ? "bg-gray-100 col-span-1 " : " col-span-2 ") + (isPublicHoliday ? " bg-gray-150 " : "") + (dayIndex !== 0 ? " border-l " : ""),
144
+ className: "p-0 align-middle justify-center text-center border-t cursor-not-allowed " + (dayIndex > 4 ? "bg-gray-100 col-span-1 " : " col-span-2 ") + (isPublicHoliday ? " bg-gray-150 " : "") + (dayIndex !== 0 ? " border-l " : ""),
145
145
  children: [
146
146
  day && /* @__PURE__ */ jsxs("div", { className: "py-1", children: [
147
147
  day,
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.js","sources":["../../lib/components/Calendar.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\r\nimport { FaChevronLeft, FaChevronRight } from \"react-icons/fa\";\r\n\r\nexport interface ICalendarItem {\r\n id: number;\r\n label?: string;\r\n from: Date;\r\n to: Date;\r\n background?: string;\r\n color?: string;\r\n tooltip?: string;\r\n}\r\n\r\ntype ICalendarProps = {\r\n items: ICalendarItem[];\r\n startingDate?: Date;\r\n publicHolidays?: string[];\r\n};\r\n\r\n// Check if a day is within any item's date range\r\n\r\nconst Calendar: React.FunctionComponent<ICalendarProps> = ({\r\n items,\r\n startingDate,\r\n publicHolidays,\r\n}) => {\r\n const [currentMonth, setCurrentMonth] = useState(\r\n startingDate ? startingDate.getMonth() : new Date().getMonth()\r\n );\r\n\r\n const [currentYear, setCurrentYear] = useState(\r\n startingDate ? startingDate.getFullYear() : new Date().getFullYear()\r\n );\r\n\r\n useEffect(() => {\r\n if (startingDate) {\r\n setCurrentMonth(startingDate.getMonth());\r\n setCurrentYear(startingDate.getFullYear());\r\n }\r\n }, [startingDate]);\r\n const [calendarData, setCalendarData] = useState<\r\n (string | number | JSX.Element)[][]\r\n >([]);\r\n\r\n const monthNames: string[] = [\r\n \"Leden\",\r\n \"Únor\",\r\n \"Březen\",\r\n \"Duben\",\r\n \"Květen\",\r\n \"Červen\",\r\n \"Červenec\",\r\n \"Srpen\",\r\n \"Září\",\r\n \"Říjen\",\r\n \"Listopad\",\r\n \"Prosinec\",\r\n ];\r\n const dayNames: string[] = [\r\n \"Pondělí\",\r\n \"Úterý\",\r\n \"Středa\",\r\n \"Čtvrtek\",\r\n \"Pátek\",\r\n \"So\",\r\n \"Ne\",\r\n ];\r\n\r\n // Leap year check\r\n const isLeapYear = (year: number) =>\r\n (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\r\n\r\n // Days in each month\r\n const daysInMonth = useCallback((month: number, year: number) => {\r\n if (month === 1) {\r\n // February\r\n return isLeapYear(year) ? 29 : 28;\r\n }\r\n if ([0, 2, 4, 6, 7, 9, 11].includes(month)) {\r\n // Months with 31 days\r\n\r\n return 31;\r\n }\r\n\r\n return 30; // Months with 30 days\r\n }, []);\r\n\r\n // Generate days for a month\r\n const generateMonthDays = useCallback(\r\n (month: number, year: number) => {\r\n const days = [];\r\n // const firstDayOfMonth = new Date(year, month, 1).getDay()\r\n\r\n // Adjusted to make week start from Monday\r\n let firstDayOfMonth = new Date(year, month, 1).getDay() - 1;\r\n if (firstDayOfMonth === -1) firstDayOfMonth = 6; // Sunday becomes 6 instead of -1\r\n\r\n let dayCounter = 1;\r\n\r\n for (let week = 0; week < 6; week++) {\r\n const weekDays = [];\r\n for (let day = 0; day < 7; day++) {\r\n if (week === 0 && day < firstDayOfMonth) {\r\n weekDays.push(\"\");\r\n } else if (dayCounter > daysInMonth(month, year)) {\r\n weekDays.push(\"\");\r\n } else {\r\n weekDays.push(dayCounter++);\r\n }\r\n }\r\n days.push(weekDays);\r\n }\r\n return days;\r\n },\r\n [daysInMonth]\r\n );\r\n\r\n useEffect(() => {\r\n setCalendarData(generateMonthDays(currentMonth, currentYear));\r\n }, [currentMonth, currentYear, generateMonthDays]);\r\n\r\n // Navigation handlers\r\n const goToNextMonth = () => {\r\n setCurrentMonth((prev) => (prev === 11 ? 0 : prev + 1));\r\n if (currentMonth === 11) {\r\n setCurrentYear((prev) => prev + 1);\r\n }\r\n };\r\n\r\n const goToPreviousMonth = () => {\r\n setCurrentMonth((prev) => (prev === 0 ? 11 : prev - 1));\r\n if (currentMonth === 0) {\r\n setCurrentYear((prev) => prev - 1);\r\n }\r\n };\r\n const findItemsForDay = (\r\n day: number,\r\n month: number,\r\n year: number\r\n ): ICalendarItem[] => {\r\n const date = new Date(year, month, day);\r\n\r\n return items.filter((item) => date >= item.from && date <= item.to);\r\n };\r\n return (\r\n <div className=\"flex flex-col bg-white shadow-lg flex-grow text-xs rounded-lg border overflow-hidden \">\r\n <div className=\"flex justify-between items-center text-black p-2\">\r\n <div\r\n onClick={goToPreviousMonth}\r\n className=\"mr-5 px-8 py-4 cursor-pointer hover:bg-gray-100 rounded-xl text-sm\"\r\n >\r\n <FaChevronLeft />\r\n </div>\r\n <h2 className=\"font-semibold text-base\">\r\n {monthNames[currentMonth]} {currentYear}\r\n </h2>\r\n\r\n <div\r\n onClick={goToNextMonth}\r\n className=\"px-8 py-4 cursor-pointer hover:bg-gray-100 rounded-xl text-sm\"\r\n >\r\n <FaChevronRight />\r\n </div>\r\n </div>\r\n <div className=\"grid grid-cols-12 pb-0 \">\r\n {dayNames.map((day, index) => (\r\n <div\r\n key={index}\r\n className={\r\n \"py-1 px-4 text-center font-semibold border-t \" +\r\n (index > 4 ? \" bg-gray-100 col-span-1 \" : \" col-span-2 \")\r\n }\r\n >\r\n {day}\r\n </div>\r\n ))}\r\n {calendarData.map((week, weekIndex) => (\r\n <React.Fragment key={weekIndex}>\r\n {week.map((day, dayIndex) => {\r\n const itemsForDay = day\r\n ? findItemsForDay(day as number, currentMonth, currentYear)\r\n : [];\r\n\r\n const date = new Date(\r\n currentYear,\r\n currentMonth,\r\n (day as number) + 1\r\n );\r\n const isPublicHoliday = publicHolidays?.includes(\r\n date.toISOString().split(\"T\")[0]\r\n );\r\n\r\n return (\r\n <div\r\n key={dayIndex}\r\n className={\r\n \"p-0 align-middle justify-center text-center border-t hover:bg-gray-150 \" +\r\n (dayIndex > 4\r\n ? \"bg-gray-100 col-span-1 \"\r\n : \" col-span-2 \") +\r\n (isPublicHoliday ? \" bg-gray-150 \" : \"\") +\r\n (dayIndex !== 0 ? \" border-l \" : \"\")\r\n }\r\n >\r\n {day && <div className=\"py-1\">{day} </div>}\r\n {itemsForDay.map((item, itemIndex) => (\r\n <div\r\n key={itemIndex}\r\n className={\r\n \"dataItem w-full py-1 text-white text-center mt-0 -pr-1 \"\r\n }\r\n style={{\r\n backgroundColor:\r\n isPublicHoliday || dayIndex > 4\r\n ? \"gray\"\r\n : item.background,\r\n color:\r\n isPublicHoliday || dayIndex > 4\r\n ? \"white\"\r\n : item.color,\r\n }}\r\n data-tooltip-target={\"tooltip-\" + item.id}\r\n title={item.tooltip}\r\n >\r\n {item.label}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n })}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Calendar;\r\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"Calendar.js","sources":["../../lib/components/Calendar.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\r\nimport { FaChevronLeft, FaChevronRight } from \"react-icons/fa\";\r\n\r\nexport interface ICalendarItem {\r\n id: number;\r\n label?: string;\r\n from: Date;\r\n to: Date;\r\n background?: string;\r\n color?: string;\r\n tooltip?: string;\r\n}\r\n\r\ntype ICalendarProps = {\r\n items: ICalendarItem[];\r\n startingDate?: Date;\r\n publicHolidays?: string[];\r\n};\r\n\r\n// Check if a day is within any item's date range\r\n\r\nconst Calendar: React.FunctionComponent<ICalendarProps> = ({\r\n items,\r\n startingDate,\r\n publicHolidays,\r\n}) => {\r\n const [currentMonth, setCurrentMonth] = useState(\r\n startingDate ? startingDate.getMonth() : new Date().getMonth()\r\n );\r\n\r\n const [currentYear, setCurrentYear] = useState(\r\n startingDate ? startingDate.getFullYear() : new Date().getFullYear()\r\n );\r\n\r\n useEffect(() => {\r\n if (startingDate) {\r\n setCurrentMonth(startingDate.getMonth());\r\n setCurrentYear(startingDate.getFullYear());\r\n }\r\n }, [startingDate]);\r\n const [calendarData, setCalendarData] = useState<\r\n (string | number | JSX.Element)[][]\r\n >([]);\r\n\r\n const monthNames: string[] = [\r\n \"Leden\",\r\n \"Únor\",\r\n \"Březen\",\r\n \"Duben\",\r\n \"Květen\",\r\n \"Červen\",\r\n \"Červenec\",\r\n \"Srpen\",\r\n \"Září\",\r\n \"Říjen\",\r\n \"Listopad\",\r\n \"Prosinec\",\r\n ];\r\n const dayNames: string[] = [\r\n \"Pondělí\",\r\n \"Úterý\",\r\n \"Středa\",\r\n \"Čtvrtek\",\r\n \"Pátek\",\r\n \"So\",\r\n \"Ne\",\r\n ];\r\n\r\n // Leap year check\r\n const isLeapYear = (year: number) =>\r\n (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\r\n\r\n // Days in each month\r\n const daysInMonth = useCallback((month: number, year: number) => {\r\n if (month === 1) {\r\n // February\r\n return isLeapYear(year) ? 29 : 28;\r\n }\r\n if ([0, 2, 4, 6, 7, 9, 11].includes(month)) {\r\n // Months with 31 days\r\n\r\n return 31;\r\n }\r\n\r\n return 30; // Months with 30 days\r\n }, []);\r\n\r\n // Generate days for a month\r\n const generateMonthDays = useCallback(\r\n (month: number, year: number) => {\r\n const days = [];\r\n // const firstDayOfMonth = new Date(year, month, 1).getDay()\r\n\r\n // Adjusted to make week start from Monday\r\n let firstDayOfMonth = new Date(year, month, 1).getDay() - 1;\r\n if (firstDayOfMonth === -1) firstDayOfMonth = 6; // Sunday becomes 6 instead of -1\r\n\r\n let dayCounter = 1;\r\n\r\n for (let week = 0; week < 6; week++) {\r\n const weekDays = [];\r\n for (let day = 0; day < 7; day++) {\r\n if (week === 0 && day < firstDayOfMonth) {\r\n weekDays.push(\"\");\r\n } else if (dayCounter > daysInMonth(month, year)) {\r\n weekDays.push(\"\");\r\n } else {\r\n weekDays.push(dayCounter++);\r\n }\r\n }\r\n days.push(weekDays);\r\n }\r\n return days;\r\n },\r\n [daysInMonth]\r\n );\r\n\r\n useEffect(() => {\r\n setCalendarData(generateMonthDays(currentMonth, currentYear));\r\n }, [currentMonth, currentYear, generateMonthDays]);\r\n\r\n // Navigation handlers\r\n const goToNextMonth = () => {\r\n setCurrentMonth((prev) => (prev === 11 ? 0 : prev + 1));\r\n if (currentMonth === 11) {\r\n setCurrentYear((prev) => prev + 1);\r\n }\r\n };\r\n\r\n const goToPreviousMonth = () => {\r\n setCurrentMonth((prev) => (prev === 0 ? 11 : prev - 1));\r\n if (currentMonth === 0) {\r\n setCurrentYear((prev) => prev - 1);\r\n }\r\n };\r\n const findItemsForDay = (\r\n day: number,\r\n month: number,\r\n year: number\r\n ): ICalendarItem[] => {\r\n const date = new Date(year, month, day);\r\n\r\n return items.filter((item) => date >= item.from && date <= item.to);\r\n };\r\n return (\r\n <div className=\"flex flex-col bg-white shadow-lg flex-grow text-xs rounded-lg border overflow-hidden \">\r\n <div className=\"flex justify-between items-center text-black p-2\">\r\n <div\r\n onClick={goToPreviousMonth}\r\n className=\"mr-5 px-10 py-4 cursor-pointer hover:bg-gray-150 rounded-lg text-sm\"\r\n >\r\n <FaChevronLeft />\r\n </div>\r\n <h2 className=\"font-semibold text-base\">\r\n {monthNames[currentMonth]} {currentYear}\r\n </h2>\r\n\r\n <div\r\n onClick={goToNextMonth}\r\n className=\"px-10 py-4 cursor-pointer hover:bg-gray-150 rounded-lg text-sm\"\r\n >\r\n <FaChevronRight />\r\n </div>\r\n </div>\r\n <div className=\"grid grid-cols-12 pb-0 \">\r\n {dayNames.map((day, index) => (\r\n <div\r\n key={index}\r\n className={\r\n \"py-1 px-4 text-center font-semibold border-t \" +\r\n (index > 4 ? \" bg-gray-100 col-span-1 \" : \" col-span-2 \")\r\n }\r\n >\r\n {day}\r\n </div>\r\n ))}\r\n {calendarData.map((week, weekIndex) => (\r\n <React.Fragment key={weekIndex}>\r\n {week.map((day, dayIndex) => {\r\n const itemsForDay = day\r\n ? findItemsForDay(day as number, currentMonth, currentYear)\r\n : [];\r\n\r\n const date = new Date(\r\n currentYear,\r\n currentMonth,\r\n (day as number) + 1\r\n );\r\n const isPublicHoliday = publicHolidays?.includes(\r\n date.toISOString().split(\"T\")[0]\r\n );\r\n\r\n return (\r\n <div\r\n key={dayIndex}\r\n className={\r\n \"p-0 align-middle justify-center text-center border-t cursor-not-allowed \" +\r\n (dayIndex > 4\r\n ? \"bg-gray-100 col-span-1 \"\r\n : \" col-span-2 \") +\r\n (isPublicHoliday ? \" bg-gray-150 \" : \"\") +\r\n (dayIndex !== 0 ? \" border-l \" : \"\")\r\n }\r\n >\r\n {day && <div className=\"py-1\">{day} </div>}\r\n {itemsForDay.map((item, itemIndex) => (\r\n <div\r\n key={itemIndex}\r\n className={\r\n \"dataItem w-full py-1 text-white text-center mt-0 -pr-1 \"\r\n }\r\n style={{\r\n backgroundColor:\r\n isPublicHoliday || dayIndex > 4\r\n ? \"gray\"\r\n : item.background,\r\n color:\r\n isPublicHoliday || dayIndex > 4\r\n ? \"white\"\r\n : item.color,\r\n }}\r\n data-tooltip-target={\"tooltip-\" + item.id}\r\n title={item.tooltip}\r\n >\r\n {item.label}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n })}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Calendar;\r\n"],"names":["React"],"mappings":";;;AAqBA,MAAM,WAAoD,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACE,QAAA,CAAC,cAAc,eAAe,IAAI;AAAA,IACtC,eAAe,aAAa,SAAA,KAAiB,oBAAA,QAAO,SAAS;AAAA,EAAA;AAGzD,QAAA,CAAC,aAAa,cAAc,IAAI;AAAA,IACpC,eAAe,aAAa,YAAA,KAAoB,oBAAA,QAAO,YAAY;AAAA,EAAA;AAGrE,YAAU,MAAM;AACd,QAAI,cAAc;AACA,sBAAA,aAAa,UAAU;AACxB,qBAAA,aAAa,aAAa;AAAA,IAC3C;AAAA,EAAA,GACC,CAAC,YAAY,CAAC;AACjB,QAAM,CAAC,cAAc,eAAe,IAAI,SAEtC,CAAE,CAAA;AAEJ,QAAM,aAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,WAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAII,QAAA,aAAa,CAAC,SACjB,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ;AAGzD,QAAM,cAAc,YAAY,CAAC,OAAe,SAAiB;AAC/D,QAAI,UAAU,GAAG;AAER,aAAA,WAAW,IAAI,IAAI,KAAK;AAAA,IACjC;AACI,QAAA,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,SAAS,KAAK,GAAG;AAGnC,aAAA;AAAA,IACT;AAEO,WAAA;AAAA,EACT,GAAG,CAAE,CAAA;AAGL,QAAM,oBAAoB;AAAA,IACxB,CAAC,OAAe,SAAiB;AAC/B,YAAM,OAAO,CAAA;AAIT,UAAA,kBAAkB,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,OAAW,IAAA;AAC1D,UAAI,oBAAoB;AAAsB,0BAAA;AAE9C,UAAI,aAAa;AAEjB,eAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,cAAM,WAAW,CAAA;AACjB,iBAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAC5B,cAAA,SAAS,KAAK,MAAM,iBAAiB;AACvC,qBAAS,KAAK,EAAE;AAAA,UACP,WAAA,aAAa,YAAY,OAAO,IAAI,GAAG;AAChD,qBAAS,KAAK,EAAE;AAAA,UAAA,OACX;AACL,qBAAS,KAAK,YAAY;AAAA,UAC5B;AAAA,QACF;AACA,aAAK,KAAK,QAAQ;AAAA,MACpB;AACO,aAAA;AAAA,IACT;AAAA,IACA,CAAC,WAAW;AAAA,EAAA;AAGd,YAAU,MAAM;AACE,oBAAA,kBAAkB,cAAc,WAAW,CAAC;AAAA,EAC3D,GAAA,CAAC,cAAc,aAAa,iBAAiB,CAAC;AAGjD,QAAM,gBAAgB,MAAM;AAC1B,oBAAgB,CAAC,SAAU,SAAS,KAAK,IAAI,OAAO,CAAE;AACtD,QAAI,iBAAiB,IAAI;AACR,qBAAA,CAAC,SAAS,OAAO,CAAC;AAAA,IACnC;AAAA,EAAA;AAGF,QAAM,oBAAoB,MAAM;AAC9B,oBAAgB,CAAC,SAAU,SAAS,IAAI,KAAK,OAAO,CAAE;AACtD,QAAI,iBAAiB,GAAG;AACP,qBAAA,CAAC,SAAS,OAAO,CAAC;AAAA,IACnC;AAAA,EAAA;AAEF,QAAM,kBAAkB,CACtB,KACA,OACA,SACoB;AACpB,UAAM,OAAO,IAAI,KAAK,MAAM,OAAO,GAAG;AAE/B,WAAA,MAAM,OAAO,CAAC,SAAS,QAAQ,KAAK,QAAQ,QAAQ,KAAK,EAAE;AAAA,EAAA;AAGlE,SAAA,qBAAC,OAAI,EAAA,WAAU,6FACb,UAAA;AAAA,IAAC,qBAAA,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UAEV,8BAAC,eAAc,EAAA;AAAA,QAAA;AAAA,MACjB;AAAA,MACA,qBAAC,MAAG,EAAA,WAAU,2BACX,UAAA;AAAA,QAAA,WAAW,YAAY;AAAA,QAAE;AAAA,QAAE;AAAA,MAAA,GAC9B;AAAA,MAEA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UAEV,8BAAC,gBAAe,EAAA;AAAA,QAAA;AAAA,MAClB;AAAA,IAAA,GACF;AAAA,IACA,qBAAC,OAAI,EAAA,WAAU,2BACZ,UAAA;AAAA,MAAS,SAAA,IAAI,CAAC,KAAK,UAClB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WACE,qDACC,QAAQ,IAAI,+BAA+B;AAAA,UAG7C,UAAA;AAAA,QAAA;AAAA,QANI;AAAA,MAAA,CAQR;AAAA,MACA,aAAa,IAAI,CAAC,MAAM,cACvB,oBAACA,eAAM,UAAN,EACE,UAAA,KAAK,IAAI,CAAC,KAAK,aAAa;AAC3B,cAAM,cAAc,MAChB,gBAAgB,KAAe,cAAc,WAAW,IACxD;AAEJ,cAAM,OAAO,IAAI;AAAA,UACf;AAAA,UACA;AAAA,UACC,MAAiB;AAAA,QAAA;AAEpB,cAAM,kBAAkB,iDAAgB;AAAA,UACtC,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA;AAI/B,eAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WACE,+EACC,WAAW,IACR,+BACA,oBACH,kBAAkB,kBAAkB,OACpC,aAAa,IAAI,eAAe;AAAA,YAGlC,UAAA;AAAA,cAAO,OAAA,qBAAC,OAAI,EAAA,WAAU,QAAQ,UAAA;AAAA,gBAAA;AAAA,gBAAI;AAAA,cAAA,GAAC;AAAA,cACnC,YAAY,IAAI,CAAC,MAAM,cACtB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WACE;AAAA,kBAEF,OAAO;AAAA,oBACL,iBACE,mBAAmB,WAAW,IAC1B,SACA,KAAK;AAAA,oBACX,OACE,mBAAmB,WAAW,IAC1B,UACA,KAAK;AAAA,kBACb;AAAA,kBACA,uBAAqB,aAAa,KAAK;AAAA,kBACvC,OAAO,KAAK;AAAA,kBAEX,UAAK,KAAA;AAAA,gBAAA;AAAA,gBAjBD;AAAA,cAAA,CAmBR;AAAA,YAAA;AAAA,UAAA;AAAA,UAhCI;AAAA,QAAA;AAAA,MAiCP,CAEH,EApDkB,GAAA,SAqDrB,CACD;AAAA,IAAA,GACH;AAAA,EACF,EAAA,CAAA;AAEJ;"}
@@ -1,5 +1,10 @@
1
1
  import { DataTableColumn } from '../../main';
2
2
 
3
+ interface BulkAction<T> {
4
+ name: string;
5
+ action: (items: T[]) => void;
6
+ icon?: any;
7
+ }
3
8
  interface DataTableServerProps<T> {
4
9
  url: string;
5
10
  columns: DataTableColumn<T | "actions">[];
@@ -7,9 +12,12 @@ interface DataTableServerProps<T> {
7
12
  title?: string;
8
13
  subtitle?: string;
9
14
  allowSearch?: boolean;
15
+ rowAction?: (item: T) => void;
16
+ bulkActions?: BulkAction<T>[];
10
17
  }
11
18
  type DataTableInternalItems = {
12
19
  _isHighlighted?: boolean;
20
+ id: string;
13
21
  };
14
- declare function DataTableServer<T extends DataTableInternalItems>({ url, columns, itemsPerPage, title, subtitle, allowSearch, }: DataTableServerProps<T>): import("react/jsx-runtime").JSX.Element;
22
+ declare function DataTableServer<T extends DataTableInternalItems>({ url, columns, itemsPerPage, title, subtitle, allowSearch, rowAction, bulkActions, }: DataTableServerProps<T>): import("react/jsx-runtime").JSX.Element;
15
23
  export default DataTableServer;
@@ -18,13 +18,16 @@ function DataTableServer({
18
18
  itemsPerPage = 10,
19
19
  title,
20
20
  subtitle,
21
- allowSearch = true
21
+ allowSearch = true,
22
+ rowAction,
23
+ bulkActions
22
24
  }) {
23
25
  var _a;
24
26
  const federationContext = useFederationContext();
25
27
  const [data, setData] = useState();
26
28
  const [isLoading, setIsLoading] = useState(false);
27
29
  const [currentPage, setCurrentPage] = useState(0);
30
+ const [selectedItems, setSelectedItems] = useState([]);
28
31
  const [fulltextSearch, setFulltextSearch] = useState("");
29
32
  const [filterOptions, setFilterOptions] = useState({});
30
33
  const [columnFilters, setColumnFilters] = useState(
@@ -62,20 +65,18 @@ function DataTableServer({
62
65
  useEffect(() => {
63
66
  const fetchFilterOptions = async (column) => {
64
67
  if (column.filterSource) {
65
- {
66
- try {
67
- const response = await federationContext.apiClient.get(
68
- column.filterSource
69
- );
70
- const options = response.data.map((item) => ({
71
- value: item[column.filterValueKey],
72
- label: item[column.filterLabelKey]
73
- }));
74
- return options;
75
- } catch (error) {
76
- console.error("Error fetching filter options:", error);
77
- return [];
78
- }
68
+ try {
69
+ const response = await federationContext.apiClient.get(
70
+ column.filterSource
71
+ );
72
+ const options = response.data.map((item) => ({
73
+ value: item[column.filterValueKey],
74
+ label: item[column.filterLabelKey]
75
+ }));
76
+ return options;
77
+ } catch (error) {
78
+ console.error("Error fetching filter options:", error);
79
+ return [];
79
80
  }
80
81
  }
81
82
  };
@@ -123,6 +124,27 @@ function DataTableServer({
123
124
  }
124
125
  );
125
126
  };
127
+ const handleSelectItem = (item) => {
128
+ setSelectedItems((prevSelectedItems) => {
129
+ if (prevSelectedItems.find((selectedItem) => selectedItem.id === item.id)) {
130
+ return prevSelectedItems.filter(
131
+ (selectedItem) => selectedItem.id !== item.id
132
+ );
133
+ } else {
134
+ return [...prevSelectedItems, item];
135
+ }
136
+ });
137
+ };
138
+ const handleSelectAll = () => {
139
+ if (data && selectedItems.length === data.content.length) {
140
+ setSelectedItems([]);
141
+ } else if (data) {
142
+ setSelectedItems(data.content);
143
+ }
144
+ };
145
+ const isSelected = (item) => {
146
+ return selectedItems.some((selectedItem) => selectedItem.id === item.id);
147
+ };
126
148
  const nextPage = () => {
127
149
  setCurrentPage(currentPage + 1);
128
150
  };
@@ -153,18 +175,35 @@ function DataTableServer({
153
175
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
154
176
  "div",
155
177
  {
156
- className: "shadow-lg border border-gray-200 rounded-xl overflow-x-auto",
178
+ className: "shadow-lg border border-gray-200 rounded-xl overflow-x-auto",
157
179
  style: { overflowY: "visible" },
158
180
  children: [
159
- (title || subtitle || allowSearch) && /* @__PURE__ */ jsxs("div", { className: "p-5 leading-9 flex ", children: [
181
+ (title || subtitle || allowSearch) && /* @__PURE__ */ jsxs("div", { className: "p-5 leading-9 flex", children: [
160
182
  /* @__PURE__ */ jsxs("div", { className: "flex-grow", children: [
161
- title && /* @__PURE__ */ jsx("h1", { className: "font-semibold text-xl leading-[42px] ", children: title }),
183
+ title && /* @__PURE__ */ jsx("h1", { className: "font-semibold text-xl leading-[42px]", children: title }),
162
184
  subtitle && /* @__PURE__ */ jsx("p", { className: "font-normal text-gray-600", children: subtitle })
163
185
  ] }),
186
+ bulkActions && selectedItems.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end text-gray-800", children: [
187
+ "Hromadná akce (",
188
+ selectedItems.length,
189
+ " ",
190
+ selectedItems.length == 1 ? "položka" : selectedItems.length < 5 ? "položky" : "položek",
191
+ ") :",
192
+ bulkActions.map((bulkAction) => /* @__PURE__ */ jsx(
193
+ Button,
194
+ {
195
+ variant: "primary",
196
+ className: "ml-2",
197
+ onClick: () => bulkAction.action(selectedItems),
198
+ children: bulkAction.name
199
+ },
200
+ bulkAction.name
201
+ ))
202
+ ] }),
164
203
  /* @__PURE__ */ jsxs(
165
204
  "div",
166
205
  {
167
- className: "flex items-center text-xl h-full p-3 cursor-pointer text-gray-500 ",
206
+ className: "flex items-center text-xl h-full p-3 cursor-pointer text-gray-500",
168
207
  onClick: handleToggleShowColFilters,
169
208
  children: [
170
209
  !showColFilters && /* @__PURE__ */ jsx(MdOutlineFilterAlt, {}),
@@ -197,8 +236,7 @@ function DataTableServer({
197
236
  "th",
198
237
  {
199
238
  id: String(key) + "_filter",
200
- className: ` font-medium leading-9 text-xs text-left p-0 pb-5 text-gray-600 overflow-ellipsis
201
- whitespace-nowrap ${!title && !subtitle ? "border-t-0" : ""}`,
239
+ className: `font-medium leading-9 text-xs text-left p-0 pb-5 text-gray-600 overflow-ellipsis whitespace-nowrap ${!title && !subtitle ? "border-t-0" : ""}`,
202
240
  style: { width },
203
241
  children: [
204
242
  filterType && filterType === "select" && /* @__PURE__ */ jsx(
@@ -214,7 +252,7 @@ function DataTableServer({
214
252
  options: filterOptions[String(filterParam)] || [],
215
253
  value: columnFilters[String(filterParam)],
216
254
  clearable: true,
217
- className: "pl-3 "
255
+ className: "pl-3"
218
256
  }
219
257
  ),
220
258
  filterType && filterType !== "select" && /* @__PURE__ */ jsx(
@@ -229,7 +267,7 @@ function DataTableServer({
229
267
  type: filterType,
230
268
  value: columnFilters[String(filterParam)],
231
269
  clearable: true,
232
- className: "max-w-[300px] min-w-[100px] pl-3 "
270
+ className: "max-w-[300px] min-w-[100px] pl-3"
233
271
  }
234
272
  )
235
273
  ]
@@ -237,121 +275,137 @@ function DataTableServer({
237
275
  String(key) + "_filter"
238
276
  )
239
277
  ) }),
240
- /* @__PURE__ */ jsx("tr", { children: columns.map(({ key, header, actions, sortParam, width }) => /* @__PURE__ */ jsx(
241
- "th",
242
- {
243
- className: `group font-medium leading-9 text-xs text-left px-3 text-gray-600 bg bg-gray-50 border-t border-b border-gray-200 ${!title && !subtitle ? "border-t-0" : ""} ${sortParam ? " cursor-pointer " : ""}`,
244
- onClick: () => sortParam ? requestSort(sortParam) : () => {
278
+ /* @__PURE__ */ jsxs("tr", { children: [
279
+ data && bulkActions && /* @__PURE__ */ jsx("th", { className: "w-[20px] h-10 hover:bg-gray-200 font-medium text-xs text-center text-gray-600 cursor-pointer border-t border-b border-gray-200", children: /* @__PURE__ */ jsx("label", { className: "w-full h-full flex items-center justify-center cursor-pointer px-2", children: /* @__PURE__ */ jsx(
280
+ "input",
281
+ {
282
+ id: "selectAll",
283
+ type: "checkbox",
284
+ className: "w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-indigo-200 focus:ring-4",
285
+ onChange: handleSelectAll,
286
+ checked: data && selectedItems.length === data.content.length
287
+ }
288
+ ) }) }),
289
+ columns.map(({ key, header, actions, sortParam, width }) => /* @__PURE__ */ jsx(
290
+ "th",
291
+ {
292
+ className: `group font-medium leading-9 text-xs text-left px-3 text-gray-600 bg-gray-50 border-t border-b border-gray-200 ${!title && !subtitle ? "border-t-0" : ""} ${sortParam ? " cursor-pointer " : ""}`,
293
+ onClick: () => sortParam ? requestSort(sortParam) : void 0,
294
+ style: { width },
295
+ children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2", children: [
296
+ header,
297
+ " ",
298
+ !actions && sortParam ? getSortIcon(sortParam) : ""
299
+ ] })
245
300
  },
246
- style: { width },
247
- children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2", children: [
248
- header,
249
- " ",
250
- !actions && sortParam ? getSortIcon(sortParam) : ""
251
- ] })
252
- },
253
- String(key)
254
- )) })
301
+ String(key)
302
+ ))
303
+ ] })
255
304
  ] }),
256
305
  data && (data == null ? void 0 : data.content) && (data == null ? void 0 : data.content.length) > 0 && /* @__PURE__ */ jsxs("tbody", { className: "relative", children: [
257
306
  isLoading && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gray-300 opacity-50 z-50", children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx(Spinner, {}) }) }) }) }),
258
- data.content.map((item, rowIndex) => /* @__PURE__ */ jsx(
307
+ data.content.map((item, rowIndex) => /* @__PURE__ */ jsxs(
259
308
  "tr",
260
309
  {
261
- className: `${item._isHighlighted ? " bg-gray-200 " : " "} hover:bg-gray-50 border-gray-200 border-b text-sm `,
262
- children: columns.map(
263
- ({ render, actions, classes, width }, colIndex) => /* @__PURE__ */ jsxs(
264
- "td",
310
+ className: `${item._isHighlighted ? "bg-gray-200" : ""} hover:bg-gray-100 border-gray-200 border-b text-sm`,
311
+ children: [
312
+ bulkActions && /* @__PURE__ */ jsx("td", { className: "w-[20px] h-[72px] hover:bg-gray-200 font-medium text-xs text-center text-gray-600 cursor-pointer", children: /* @__PURE__ */ jsx("label", { className: "w-full h-full flex items-center justify-center cursor-pointer px-2", children: /* @__PURE__ */ jsx(
313
+ "input",
265
314
  {
266
- style: { width },
267
- className: `px-3 py-2
268
- ${colIndex == 0 ? " font-medium text-gray-900" : " text-gray-700"} ${classes || ""}`,
269
- children: [
270
- render ? render(item) : "",
271
- actions && actions.filter((it) => {
272
- if (it.visible) {
273
- return it.visible(item);
274
- }
275
- }).map((action, actionIndex) => /* @__PURE__ */ jsxs(
276
- "div",
277
- {
278
- className: "flex inline-flex align-middle",
279
- children: [
280
- action.icon && /* @__PURE__ */ jsxs(
281
- Button,
282
- {
283
- variant: "icon",
284
- onClick: () => action.onClick(item),
285
- children: [
286
- " ",
287
- action.icon
288
- ]
289
- }
290
- ),
291
- !action.icon && /* @__PURE__ */ jsxs(
292
- Button,
293
- {
294
- variant: "transparent",
295
- onClick: () => action.onClick(item),
296
- children: [
297
- " ",
298
- action.label
299
- ]
300
- }
301
- )
302
- ]
303
- },
304
- `${rowIndex}-${colIndex}-${actionIndex}`
305
- ))
306
- ]
307
- },
308
- `${rowIndex}-${colIndex}`
315
+ type: "checkbox",
316
+ className: "w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-indigo-200 focus:ring-4",
317
+ checked: isSelected(item) || false,
318
+ onChange: () => handleSelectItem(item)
319
+ }
320
+ ) }) }),
321
+ columns.map(
322
+ ({ render, actions, classes, width }, colIndex) => /* @__PURE__ */ jsxs(
323
+ "td",
324
+ {
325
+ onClick: rowAction ? () => rowAction(item) : void 0,
326
+ style: { width },
327
+ className: `px-3 py-2 cursor-pointer ${colIndex === 0 ? "font-medium text-gray-900" : "text-gray-700"} ${classes || ""}`,
328
+ children: [
329
+ render ? render(item) : "",
330
+ actions && actions.filter((it) => {
331
+ if (it.rowAction)
332
+ return false;
333
+ if (it.visible) {
334
+ return it.visible(item);
335
+ } else
336
+ return true;
337
+ }).map((action, actionIndex) => /* @__PURE__ */ jsxs(
338
+ "div",
339
+ {
340
+ className: "flex inline-flex align-middle",
341
+ children: [
342
+ action.icon && /* @__PURE__ */ jsx(
343
+ Button,
344
+ {
345
+ variant: "icon",
346
+ onClick: () => action.onClick(item),
347
+ children: action.icon
348
+ }
349
+ ),
350
+ !action.icon && /* @__PURE__ */ jsx(
351
+ Button,
352
+ {
353
+ variant: "transparent",
354
+ onClick: () => action.onClick(item),
355
+ children: action.label
356
+ }
357
+ )
358
+ ]
359
+ },
360
+ `${rowIndex}-${colIndex}-${actionIndex}`
361
+ ))
362
+ ]
363
+ },
364
+ `${rowIndex}-${colIndex}`
365
+ )
309
366
  )
310
- )
367
+ ]
311
368
  },
312
369
  rowIndex
313
370
  )),
314
- ((_a = data == null ? void 0 : data.content) == null ? void 0 : _a.length) == 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
371
+ ((_a = data == null ? void 0 : data.content) == null ? void 0 : _a.length) === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
315
372
  "td",
316
373
  {
317
374
  className: "px-5 py-3 border-b border-gray-200 bg-white text-sm items-center justify-center align-middle",
318
375
  colSpan: columns.length,
319
- children: "Žádná data"
376
+ children: "No data"
320
377
  },
321
378
  "td-nodata"
322
- ) }, "tr-nodata ")
379
+ ) }, "tr-nodata")
323
380
  ] })
324
381
  ] }) }),
325
- /* @__PURE__ */ jsxs("div", { className: "w-full p-5 grid grid-cols-3", children: [
326
- /* @__PURE__ */ jsx("div", { className: "text-left items-start justify-start", children: data && !data.first && /* @__PURE__ */ jsxs(
382
+ /* @__PURE__ */ jsx("div", { className: "w-full p-5 flex gap-5 justify-between", children: /* @__PURE__ */ jsxs("div", { className: "flex gap-5", children: [
383
+ data && !data.first && /* @__PURE__ */ jsxs(
327
384
  Button,
328
385
  {
329
386
  variant: "secondary",
330
387
  onClick: prevPage,
331
- className: "flex items-center float-left",
388
+ className: "flex items-center",
332
389
  children: [
333
390
  /* @__PURE__ */ jsx(MdArrowBack, { className: "mr-1.5" }),
334
- " Předchozí"
391
+ " Previous"
335
392
  ]
336
393
  }
337
- ) }),
338
- /* @__PURE__ */ jsxs("div", { className: " text-center text-xs text-gray-800", children: [
339
- paginationDisplay,
340
- " "
341
- ] }),
342
- /* @__PURE__ */ jsx("div", { className: "text-right items-end justify-end", children: data && !data.last && /* @__PURE__ */ jsxs(
394
+ ),
395
+ data && !data.last && /* @__PURE__ */ jsxs(
343
396
  Button,
344
397
  {
345
398
  variant: "secondary",
346
399
  onClick: nextPage,
347
- className: "flex items-center float-right",
400
+ className: "flex items-center",
348
401
  children: [
349
- "Následující ",
402
+ "Next ",
350
403
  /* @__PURE__ */ jsx(MdArrowForward, { className: "ml-2", size: 20 })
351
404
  ]
352
405
  }
353
- ) })
354
- ] })
406
+ ),
407
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-end text-xs text-gray-800", children: paginationDisplay })
408
+ ] }) })
355
409
  ]
356
410
  }
357
411
  ) });
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableServer.js","sources":["../../../lib/components/datatable/DataTableServer.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\r\n\r\nimport {\r\n Button,\r\n DataTableColumn,\r\n FormField,\r\n IPageable,\r\n Spinner,\r\n handleErrors,\r\n useFederationContext,\r\n} from \"../../main\";\r\nimport {\r\n MdArrowBack,\r\n MdArrowDownward,\r\n MdArrowForward,\r\n MdArrowUpward,\r\n MdClose,\r\n MdOutlineFilterAlt,\r\n MdOutlineFilterAltOff,\r\n MdSearch,\r\n} from \"react-icons/md\";\r\nimport SelectField from \"../form/SelectField\";\r\nimport InputField from \"../form/InputField\";\r\n\r\ninterface DataTableServerProps<T> {\r\n url: string;\r\n columns: DataTableColumn<T | \"actions\">[];\r\n itemsPerPage?: number;\r\n title?: string;\r\n subtitle?: string;\r\n allowSearch?: boolean;\r\n}\r\n\r\ntype DataTableInternalItems = {\r\n _isHighlighted?: boolean;\r\n};\r\n\r\nfunction DataTableServer<T extends DataTableInternalItems>({\r\n url,\r\n columns,\r\n itemsPerPage = 10,\r\n title,\r\n subtitle,\r\n allowSearch = true,\r\n}: DataTableServerProps<T>) {\r\n const federationContext = useFederationContext();\r\n const [data, setData] = useState<IPageable<T>>();\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const [currentPage, setCurrentPage] = useState(0);\r\n const [fulltextSearch, setFulltextSearch] = useState(\"\");\r\n const [filterOptions, setFilterOptions] = useState<Record<string, any[]>>({});\r\n const [columnFilters, setColumnFilters] = useState<Record<string, string>>(\r\n {}\r\n );\r\n\r\n const [showColFilters, setShowColFilters] = useState(false);\r\n\r\n const [sortConfig, setSortConfig] = useState<{\r\n sortParam: string;\r\n direction: \"asc\" | \"desc\" | null;\r\n } | null>(null);\r\n useEffect(() => {\r\n setIsLoading(true);\r\n federationContext.apiClient\r\n .get(url, {\r\n params: {\r\n ...columnFilters,\r\n pageSize: itemsPerPage,\r\n page: currentPage,\r\n sortBy: sortConfig?.sortParam,\r\n sortDirection: sortConfig?.direction,\r\n },\r\n })\r\n .then((response) => {\r\n setData(response.data);\r\n setIsLoading(false);\r\n })\r\n .catch((error) => {\r\n console.error(\"Error fetching data:\", error);\r\n handleErrors(error, federationContext.emitter);\r\n setIsLoading(false);\r\n });\r\n }, [\r\n url,\r\n columnFilters,\r\n itemsPerPage,\r\n currentPage,\r\n sortConfig,\r\n federationContext.apiClient,\r\n federationContext.emitter,\r\n ]);\r\n\r\n useEffect(() => {\r\n const fetchFilterOptions = async (column: DataTableColumn<T>) => {\r\n if (column.filterSource) {\r\n {\r\n try {\r\n const response = await federationContext.apiClient.get(\r\n column.filterSource\r\n );\r\n\r\n const options = response.data.map((item: any) => ({\r\n value: item[column.filterValueKey as keyof typeof item],\r\n label: item[column.filterLabelKey as keyof typeof item],\r\n }));\r\n return options;\r\n } catch (error) {\r\n console.error(\"Error fetching filter options:\", error);\r\n return [];\r\n }\r\n }\r\n }\r\n };\r\n const updateFilterOptions = async () => {\r\n const newFilterOptions: Record<string, any[]> = {};\r\n\r\n for (const column of columns) {\r\n if (\r\n column.filterType &&\r\n column.filterSource &&\r\n column.filterValueKey &&\r\n column.filterLabelKey &&\r\n column.filterParam\r\n ) {\r\n const options = await fetchFilterOptions(column);\r\n\r\n if (options) {\r\n newFilterOptions[column.filterParam as string] = [\r\n { value: \"\", label: \"\" },\r\n ...options,\r\n ];\r\n }\r\n }\r\n }\r\n\r\n setFilterOptions(newFilterOptions);\r\n };\r\n\r\n updateFilterOptions();\r\n }, [columns, federationContext.apiClient]);\r\n\r\n const requestSort = (sortParam: string) => {\r\n setSortConfig((prevSortConfig) => {\r\n if (\r\n prevSortConfig?.sortParam === sortParam &&\r\n prevSortConfig.direction !== null\r\n ) {\r\n return prevSortConfig.direction === \"asc\"\r\n ? { sortParam, direction: \"desc\" }\r\n : null;\r\n } else {\r\n return { sortParam, direction: \"asc\" };\r\n }\r\n });\r\n };\r\n\r\n const getSortIcon = (sortParam: string) => {\r\n if (sortConfig?.sortParam === sortParam) {\r\n return sortConfig.direction === \"asc\" ? (\r\n <MdArrowUpward fontSize=\"small\" />\r\n ) : sortConfig.direction === \"desc\" ? (\r\n <MdArrowDownward fontSize=\"small\" />\r\n ) : (\r\n <MdArrowUpward\r\n fontSize=\"small\"\r\n className=\"text-gray-300 invisible group-hover:visible \"\r\n />\r\n );\r\n }\r\n return (\r\n <MdArrowUpward\r\n fontSize=\"small\"\r\n className=\"text-gray-300 invisible group-hover:visible \"\r\n />\r\n );\r\n };\r\n\r\n const nextPage = () => {\r\n setCurrentPage(currentPage + 1);\r\n };\r\n\r\n const prevPage = () => {\r\n setCurrentPage(currentPage - 1);\r\n };\r\n const handleSearchChanged = (\r\n e: React.ChangeEvent<\r\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\r\n >\r\n ) => {\r\n console.log(\r\n \"%clibcomponentsdatatableDataTable.tsx:238 e\",\r\n \"color: #007acc;\",\r\n e\r\n );\r\n setFulltextSearch(e.target?.value);\r\n setCurrentPage(0);\r\n };\r\n\r\n // Pagination display logic\r\n const paginationDisplay = `Strana ${currentPage + 1} z ${data?.totalPages}`;\r\n\r\n const filterHandler = (filterParam: keyof T, value: string) => {\r\n setColumnFilters((prev) => ({ ...prev, [filterParam]: value }));\r\n setCurrentPage(0);\r\n };\r\n const handleToggleShowColFilters = () => {\r\n if (showColFilters) {\r\n setColumnFilters({});\r\n }\r\n setShowColFilters(!showColFilters);\r\n };\r\n\r\n //if (isLoading) return <Spinner />;\r\n return (\r\n <>\r\n <div\r\n className=\"shadow-lg border border-gray-200 rounded-xl overflow-x-auto\"\r\n style={{ overflowY: \"visible\" }}\r\n >\r\n {(title || subtitle || allowSearch) && (\r\n <div className=\"p-5 leading-9 flex \">\r\n <div className=\"flex-grow\">\r\n {title && (\r\n <h1 className=\"font-semibold text-xl leading-[42px] \">\r\n {title}\r\n </h1>\r\n )}\r\n {subtitle && (\r\n <p className=\"font-normal text-gray-600\">{subtitle}</p>\r\n )}\r\n </div>\r\n\r\n <div\r\n className=\"flex items-center text-xl h-full p-3 cursor-pointer text-gray-500 \"\r\n onClick={handleToggleShowColFilters}\r\n >\r\n {!showColFilters && <MdOutlineFilterAlt />}\r\n {showColFilters && <MdOutlineFilterAltOff />}\r\n </div>\r\n {allowSearch && (\r\n <div className=\"ml-5\">\r\n <FormField\r\n placeholder=\"Vyhledávání\"\r\n name=\"search\"\r\n onInputChange={handleSearchChanged}\r\n type=\"text\"\r\n value={fulltextSearch}\r\n >\r\n {\" \"}\r\n <div className=\" text-gray-500 leading-5 flex items-center h-full\">\r\n {!fulltextSearch && <MdSearch></MdSearch>}\r\n {fulltextSearch && (\r\n <MdClose onClick={() => setFulltextSearch(\"\")}></MdClose>\r\n )}\r\n </div>\r\n </FormField>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"\">\r\n <table className=\"w-full leading-normal \">\r\n <thead>\r\n {showColFilters &&\r\n columns.findIndex((it) => it.filterType) > -1 && (\r\n <tr>\r\n {columns.map(\r\n ({ key, header, filterType, filterParam, width }) => (\r\n <th\r\n key={String(key) + \"_filter\"}\r\n id={String(key) + \"_filter\"}\r\n className={` font-medium leading-9 text-xs text-left p-0 pb-5 text-gray-600 overflow-ellipsis \r\n whitespace-nowrap ${\r\n !title && !subtitle ? \"border-t-0\" : \"\"\r\n }`}\r\n style={{ width: width }}\r\n >\r\n {filterType && filterType === \"select\" && (\r\n <SelectField\r\n label={header}\r\n name={String(key) + \"_filter\"}\r\n onInputChange={(e) =>\r\n filterHandler(\r\n filterParam as keyof T,\r\n e.target.value\r\n )\r\n }\r\n type={filterType}\r\n options={filterOptions[String(filterParam)] || []}\r\n value={columnFilters[String(filterParam)]}\r\n clearable\r\n className=\"pl-3 \"\r\n ></SelectField>\r\n )}\r\n {filterType && filterType !== \"select\" && (\r\n <InputField\r\n label={header}\r\n name={String(key) + \"_filter\"}\r\n onInputChange={(e) =>\r\n filterHandler(\r\n filterParam as keyof T,\r\n e.target.value\r\n )\r\n }\r\n type={filterType}\r\n value={columnFilters[String(filterParam)]}\r\n clearable\r\n className=\"max-w-[300px] min-w-[100px] pl-3 \"\r\n ></InputField>\r\n )}\r\n </th>\r\n )\r\n )}\r\n </tr>\r\n )}\r\n <tr>\r\n {columns.map(({ key, header, actions, sortParam, width }) => (\r\n <th\r\n key={String(key)}\r\n className={`group font-medium leading-9 text-xs text-left px-3 text-gray-600 bg bg-gray-50 border-t border-b border-gray-200 ${\r\n !title && !subtitle ? \"border-t-0\" : \"\"\r\n } ${sortParam ? \" cursor-pointer \" : \"\"}`}\r\n onClick={() =>\r\n sortParam ? requestSort(sortParam) : () => {}\r\n }\r\n style={{ width: width }}\r\n >\r\n <span className=\"inline-flex items-center gap-2\">\r\n {header}{\" \"}\r\n {!actions && sortParam ? getSortIcon(sortParam) : \"\"}\r\n </span>\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n {data && data?.content && data?.content.length > 0 && (\r\n <tbody className=\"relative\">\r\n {isLoading && (\r\n <tr>\r\n <td>\r\n <div className=\"absolute inset-0 bg-gray-300 opacity-50 z-50\">\r\n <div className=\"flex items-center justify-center h-full\">\r\n <Spinner />\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {data.content.map((item, rowIndex) => (\r\n <tr\r\n key={rowIndex}\r\n className={`${\r\n item._isHighlighted ? \" bg-gray-200 \" : \" \"\r\n } hover:bg-gray-50 border-gray-200 border-b text-sm `}\r\n >\r\n {columns.map(\r\n ({ render, actions, classes, width }, colIndex) => (\r\n <td\r\n key={`${rowIndex}-${colIndex}`}\r\n style={{ width: width }}\r\n className={`px-3 py-2\r\n ${\r\n colIndex == 0\r\n ? \" font-medium text-gray-900\"\r\n : \" text-gray-700\"\r\n } ${classes || \"\"}`}\r\n >\r\n {render ? render(item) : \"\"}\r\n {actions &&\r\n actions\r\n .filter((it) => {\r\n if (it.visible) {\r\n return it.visible(item);\r\n } else true;\r\n })\r\n .map((action, actionIndex) => (\r\n <div\r\n key={`${rowIndex}-${colIndex}-${actionIndex}`}\r\n className=\"flex inline-flex align-middle\"\r\n >\r\n {action.icon && (\r\n <Button\r\n variant=\"icon\"\r\n onClick={() => action.onClick(item)}\r\n >\r\n {\" \"}\r\n {action.icon}\r\n </Button>\r\n )}\r\n {!action.icon && (\r\n <Button\r\n variant=\"transparent\"\r\n onClick={() => action.onClick(item)}\r\n >\r\n {\" \"}\r\n {action.label}\r\n </Button>\r\n )}\r\n </div>\r\n ))}\r\n </td>\r\n )\r\n )}\r\n </tr>\r\n ))}\r\n {data?.content?.length == 0 && (\r\n <tr key=\"tr-nodata \">\r\n <td\r\n key=\"td-nodata\"\r\n className=\"px-5 py-3 border-b border-gray-200 bg-white text-sm items-center justify-center align-middle\"\r\n colSpan={columns.length}\r\n >\r\n Žádná data\r\n </td>\r\n </tr>\r\n )}\r\n </tbody>\r\n )}\r\n </table>\r\n </div>\r\n <div className=\"w-full p-5 grid grid-cols-3\">\r\n <div className=\"text-left items-start justify-start\">\r\n {data && !data.first && (\r\n <Button\r\n variant=\"secondary\"\r\n onClick={prevPage}\r\n className=\"flex items-center float-left\"\r\n >\r\n <MdArrowBack className=\"mr-1.5\" /> Předchozí\r\n </Button>\r\n )}\r\n </div>\r\n <div className=\" text-center text-xs text-gray-800\">\r\n {paginationDisplay} {/* Updated to use dynamic page numbers */}\r\n </div>\r\n <div className=\"text-right items-end justify-end\">\r\n {data && !data.last && (\r\n <Button\r\n variant=\"secondary\"\r\n onClick={nextPage}\r\n className=\"flex items-center float-right\"\r\n >\r\n Následující <MdArrowForward className=\"ml-2\" size={20} />\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default DataTableServer;\r\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"DataTableServer.js","sources":["../../../lib/components/datatable/DataTableServer.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\r\n\r\nimport {\r\n Button,\r\n DataTableColumn,\r\n FormField,\r\n IPageable,\r\n Spinner,\r\n handleErrors,\r\n useFederationContext,\r\n} from \"../../main\";\r\nimport {\r\n MdArrowBack,\r\n MdArrowDownward,\r\n MdArrowForward,\r\n MdArrowUpward,\r\n MdClose,\r\n MdOutlineFilterAlt,\r\n MdOutlineFilterAltOff,\r\n MdSearch,\r\n} from \"react-icons/md\";\r\nimport SelectField from \"../form/SelectField\";\r\nimport InputField from \"../form/InputField\";\r\n\r\ninterface BulkAction<T> {\r\n name: string;\r\n action: (items: T[]) => void;\r\n icon?: any;\r\n}\r\n\r\ninterface DataTableServerProps<T> {\r\n url: string;\r\n columns: DataTableColumn<T | \"actions\">[];\r\n itemsPerPage?: number;\r\n title?: string;\r\n subtitle?: string;\r\n allowSearch?: boolean;\r\n rowAction?: (item: T) => void;\r\n bulkActions?: BulkAction<T>[];\r\n}\r\n\r\ntype DataTableInternalItems = {\r\n _isHighlighted?: boolean;\r\n id: string; // Assuming items have an `id` field for identification\r\n};\r\n\r\nfunction DataTableServer<T extends DataTableInternalItems>({\r\n url,\r\n columns,\r\n itemsPerPage = 10,\r\n title,\r\n subtitle,\r\n allowSearch = true,\r\n rowAction,\r\n bulkActions,\r\n}: DataTableServerProps<T>) {\r\n const federationContext = useFederationContext();\r\n const [data, setData] = useState<IPageable<T>>();\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const [currentPage, setCurrentPage] = useState(0);\r\n const [selectedItems, setSelectedItems] = useState<T[]>([]);\r\n const [fulltextSearch, setFulltextSearch] = useState(\"\");\r\n const [filterOptions, setFilterOptions] = useState<Record<string, any[]>>({});\r\n const [columnFilters, setColumnFilters] = useState<Record<string, string>>(\r\n {}\r\n );\r\n const [showColFilters, setShowColFilters] = useState(false);\r\n const [sortConfig, setSortConfig] = useState<{\r\n sortParam: string;\r\n direction: \"asc\" | \"desc\" | null;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n federationContext.apiClient\r\n .get(url, {\r\n params: {\r\n ...columnFilters,\r\n pageSize: itemsPerPage,\r\n page: currentPage,\r\n sortBy: sortConfig?.sortParam,\r\n sortDirection: sortConfig?.direction,\r\n },\r\n })\r\n .then((response) => {\r\n setData(response.data);\r\n setIsLoading(false);\r\n })\r\n .catch((error) => {\r\n console.error(\"Error fetching data:\", error);\r\n handleErrors(error, federationContext.emitter);\r\n setIsLoading(false);\r\n });\r\n }, [\r\n url,\r\n columnFilters,\r\n itemsPerPage,\r\n currentPage,\r\n sortConfig,\r\n federationContext.apiClient,\r\n federationContext.emitter,\r\n ]);\r\n\r\n useEffect(() => {\r\n const fetchFilterOptions = async (column: DataTableColumn<T>) => {\r\n if (column.filterSource) {\r\n try {\r\n const response = await federationContext.apiClient.get(\r\n column.filterSource\r\n );\r\n\r\n const options = response.data.map((item: any) => ({\r\n value: item[column.filterValueKey as keyof typeof item],\r\n label: item[column.filterLabelKey as keyof typeof item],\r\n }));\r\n return options;\r\n } catch (error) {\r\n console.error(\"Error fetching filter options:\", error);\r\n return [];\r\n }\r\n }\r\n };\r\n const updateFilterOptions = async () => {\r\n const newFilterOptions: Record<string, any[]> = {};\r\n\r\n for (const column of columns) {\r\n if (\r\n column.filterType &&\r\n column.filterSource &&\r\n column.filterValueKey &&\r\n column.filterLabelKey &&\r\n column.filterParam\r\n ) {\r\n const options = await fetchFilterOptions(column);\r\n\r\n if (options) {\r\n newFilterOptions[column.filterParam as string] = [\r\n { value: \"\", label: \"\" },\r\n ...options,\r\n ];\r\n }\r\n }\r\n }\r\n\r\n setFilterOptions(newFilterOptions);\r\n };\r\n\r\n updateFilterOptions();\r\n }, [columns, federationContext.apiClient]);\r\n\r\n const requestSort = (sortParam: string) => {\r\n setSortConfig((prevSortConfig) => {\r\n if (\r\n prevSortConfig?.sortParam === sortParam &&\r\n prevSortConfig.direction !== null\r\n ) {\r\n return prevSortConfig.direction === \"asc\"\r\n ? { sortParam, direction: \"desc\" }\r\n : null;\r\n } else {\r\n return { sortParam, direction: \"asc\" };\r\n }\r\n });\r\n };\r\n\r\n const getSortIcon = (sortParam: string) => {\r\n if (sortConfig?.sortParam === sortParam) {\r\n return sortConfig.direction === \"asc\" ? (\r\n <MdArrowUpward fontSize=\"small\" />\r\n ) : sortConfig.direction === \"desc\" ? (\r\n <MdArrowDownward fontSize=\"small\" />\r\n ) : (\r\n <MdArrowUpward\r\n fontSize=\"small\"\r\n className=\"text-gray-300 invisible group-hover:visible \"\r\n />\r\n );\r\n }\r\n return (\r\n <MdArrowUpward\r\n fontSize=\"small\"\r\n className=\"text-gray-300 invisible group-hover:visible \"\r\n />\r\n );\r\n };\r\n\r\n const handleSelectItem = (item: T) => {\r\n setSelectedItems((prevSelectedItems) => {\r\n if (\r\n prevSelectedItems.find((selectedItem) => selectedItem.id === item.id)\r\n ) {\r\n return prevSelectedItems.filter(\r\n (selectedItem) => selectedItem.id !== item.id\r\n );\r\n } else {\r\n return [...prevSelectedItems, item];\r\n }\r\n });\r\n };\r\n\r\n const handleSelectAll = () => {\r\n if (data && selectedItems.length === data.content.length) {\r\n setSelectedItems([]);\r\n } else if (data) {\r\n setSelectedItems(data.content);\r\n }\r\n };\r\n\r\n const isSelected = (item: T) => {\r\n return selectedItems.some((selectedItem) => selectedItem.id === item.id);\r\n };\r\n\r\n const nextPage = () => {\r\n setCurrentPage(currentPage + 1);\r\n };\r\n\r\n const prevPage = () => {\r\n setCurrentPage(currentPage - 1);\r\n };\r\n\r\n const handleSearchChanged = (\r\n e: React.ChangeEvent<\r\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\r\n >\r\n ) => {\r\n console.log(\r\n \"%clibcomponentsdatatableDataTable.tsx:238 e\",\r\n \"color: #007acc;\",\r\n e\r\n );\r\n setFulltextSearch(e.target?.value);\r\n setCurrentPage(0);\r\n };\r\n\r\n // Pagination display logic\r\n const paginationDisplay = `Strana ${currentPage + 1} z ${data?.totalPages}`;\r\n\r\n const filterHandler = (filterParam: keyof T, value: string) => {\r\n setColumnFilters((prev) => ({ ...prev, [filterParam]: value }));\r\n setCurrentPage(0);\r\n };\r\n const handleToggleShowColFilters = () => {\r\n if (showColFilters) {\r\n setColumnFilters({});\r\n }\r\n setShowColFilters(!showColFilters);\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n className=\"shadow-lg border border-gray-200 rounded-xl overflow-x-auto\"\r\n style={{ overflowY: \"visible\" }}\r\n >\r\n {(title || subtitle || allowSearch) && (\r\n <div className=\"p-5 leading-9 flex\">\r\n <div className=\"flex-grow\">\r\n {title && (\r\n <h1 className=\"font-semibold text-xl leading-[42px]\">\r\n {title}\r\n </h1>\r\n )}\r\n {subtitle && (\r\n <p className=\"font-normal text-gray-600\">{subtitle}</p>\r\n )}\r\n </div>\r\n {bulkActions && selectedItems.length > 0 && (\r\n <div className=\"flex items-center justify-end text-gray-800\">\r\n Hromadná akce ({selectedItems.length}{\" \"}\r\n {selectedItems.length == 1\r\n ? \"položka\"\r\n : selectedItems.length < 5\r\n ? \"položky\"\r\n : \"položek\"}\r\n ) :\r\n {bulkActions.map((bulkAction) => (\r\n <Button\r\n key={bulkAction.name}\r\n variant=\"primary\"\r\n className=\"ml-2\"\r\n onClick={() => bulkAction.action(selectedItems)}\r\n >\r\n {bulkAction.name}\r\n </Button>\r\n ))}\r\n </div>\r\n )}\r\n <div\r\n className=\"flex items-center text-xl h-full p-3 cursor-pointer text-gray-500\"\r\n onClick={handleToggleShowColFilters}\r\n >\r\n {!showColFilters && <MdOutlineFilterAlt />}\r\n {showColFilters && <MdOutlineFilterAltOff />}\r\n </div>\r\n {allowSearch && (\r\n <div className=\"ml-5\">\r\n <FormField\r\n placeholder=\"Vyhledávání\"\r\n name=\"search\"\r\n onInputChange={handleSearchChanged}\r\n type=\"text\"\r\n value={fulltextSearch}\r\n >\r\n {\" \"}\r\n <div className=\" text-gray-500 leading-5 flex items-center h-full\">\r\n {!fulltextSearch && <MdSearch></MdSearch>}\r\n {fulltextSearch && (\r\n <MdClose onClick={() => setFulltextSearch(\"\")} />\r\n )}\r\n </div>\r\n </FormField>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"\">\r\n <table className=\"w-full leading-normal \">\r\n <thead>\r\n {showColFilters &&\r\n columns.findIndex((it) => it.filterType) > -1 && (\r\n <tr>\r\n {columns.map(\r\n ({ key, header, filterType, filterParam, width }) => (\r\n <th\r\n key={String(key) + \"_filter\"}\r\n id={String(key) + \"_filter\"}\r\n className={`font-medium leading-9 text-xs text-left p-0 pb-5 text-gray-600 overflow-ellipsis whitespace-nowrap ${\r\n !title && !subtitle ? \"border-t-0\" : \"\"\r\n }`}\r\n style={{ width: width }}\r\n >\r\n {filterType && filterType === \"select\" && (\r\n <SelectField\r\n label={header}\r\n name={String(key) + \"_filter\"}\r\n onInputChange={(e) =>\r\n filterHandler(\r\n filterParam as keyof T,\r\n e.target.value\r\n )\r\n }\r\n type={filterType}\r\n options={filterOptions[String(filterParam)] || []}\r\n value={columnFilters[String(filterParam)]}\r\n clearable\r\n className=\"pl-3\"\r\n />\r\n )}\r\n {filterType && filterType !== \"select\" && (\r\n <InputField\r\n label={header}\r\n name={String(key) + \"_filter\"}\r\n onInputChange={(e) =>\r\n filterHandler(\r\n filterParam as keyof T,\r\n e.target.value\r\n )\r\n }\r\n type={filterType}\r\n value={columnFilters[String(filterParam)]}\r\n clearable\r\n className=\"max-w-[300px] min-w-[100px] pl-3\"\r\n />\r\n )}\r\n </th>\r\n )\r\n )}\r\n </tr>\r\n )}\r\n <tr>\r\n {data && bulkActions && (\r\n <th className=\"w-[20px] h-10 hover:bg-gray-200 font-medium text-xs text-center text-gray-600 cursor-pointer border-t border-b border-gray-200\">\r\n <label className=\"w-full h-full flex items-center justify-center cursor-pointer px-2\">\r\n <input\r\n id=\"selectAll\"\r\n type=\"checkbox\"\r\n className=\"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-indigo-200 focus:ring-4\"\r\n onChange={handleSelectAll}\r\n checked={\r\n data && selectedItems.length === data.content.length\r\n }\r\n />\r\n </label>\r\n </th>\r\n )}\r\n {columns.map(({ key, header, actions, sortParam, width }) => (\r\n <th\r\n key={String(key)}\r\n className={`group font-medium leading-9 text-xs text-left px-3 text-gray-600 bg-gray-50 border-t border-b border-gray-200 ${\r\n !title && !subtitle ? \"border-t-0\" : \"\"\r\n } ${sortParam ? \" cursor-pointer \" : \"\"}`}\r\n onClick={() =>\r\n sortParam ? requestSort(sortParam) : undefined\r\n }\r\n style={{ width: width }}\r\n >\r\n <span className=\"inline-flex items-center gap-2\">\r\n {header}{\" \"}\r\n {!actions && sortParam ? getSortIcon(sortParam) : \"\"}\r\n </span>\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n {data && data?.content && data?.content.length > 0 && (\r\n <tbody className=\"relative\">\r\n {isLoading && (\r\n <tr>\r\n <td>\r\n <div className=\"absolute inset-0 bg-gray-300 opacity-50 z-50\">\r\n <div className=\"flex items-center justify-center h-full\">\r\n <Spinner />\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n {data.content.map((item, rowIndex) => (\r\n <tr\r\n key={rowIndex}\r\n className={`${\r\n item._isHighlighted ? \"bg-gray-200\" : \"\"\r\n } hover:bg-gray-100 border-gray-200 border-b text-sm`}\r\n >\r\n {bulkActions && (\r\n <td className=\"w-[20px] h-[72px] hover:bg-gray-200 font-medium text-xs text-center text-gray-600 cursor-pointer\">\r\n <label className=\"w-full h-full flex items-center justify-center cursor-pointer px-2\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-indigo-200 focus:ring-4\"\r\n checked={isSelected(item) || false}\r\n onChange={() => handleSelectItem(item)}\r\n />\r\n </label>\r\n </td>\r\n )}\r\n {columns.map(\r\n ({ render, actions, classes, width }, colIndex) => (\r\n <td\r\n key={`${rowIndex}-${colIndex}`}\r\n onClick={\r\n rowAction ? () => rowAction(item) : undefined\r\n }\r\n style={{ width: width }}\r\n className={`px-3 py-2 cursor-pointer ${\r\n colIndex === 0\r\n ? \"font-medium text-gray-900\"\r\n : \"text-gray-700\"\r\n } ${classes || \"\"}`}\r\n >\r\n {render ? render(item) : \"\"}\r\n {actions &&\r\n actions\r\n .filter((it) => {\r\n if (it.rowAction) return false;\r\n if (it.visible) {\r\n return it.visible(item);\r\n } else return true;\r\n })\r\n .map((action, actionIndex) => (\r\n <div\r\n key={`${rowIndex}-${colIndex}-${actionIndex}`}\r\n className=\"flex inline-flex align-middle\"\r\n >\r\n {action.icon && (\r\n <Button\r\n variant=\"icon\"\r\n onClick={() => action.onClick(item)}\r\n >\r\n {action.icon}\r\n </Button>\r\n )}\r\n {!action.icon && (\r\n <Button\r\n variant=\"transparent\"\r\n onClick={() => action.onClick(item)}\r\n >\r\n {action.label}\r\n </Button>\r\n )}\r\n </div>\r\n ))}\r\n </td>\r\n )\r\n )}\r\n </tr>\r\n ))}\r\n {data?.content?.length === 0 && (\r\n <tr key=\"tr-nodata\">\r\n <td\r\n key=\"td-nodata\"\r\n className=\"px-5 py-3 border-b border-gray-200 bg-white text-sm items-center justify-center align-middle\"\r\n colSpan={columns.length}\r\n >\r\n No data\r\n </td>\r\n </tr>\r\n )}\r\n </tbody>\r\n )}\r\n </table>\r\n </div>\r\n <div className=\"w-full p-5 flex gap-5 justify-between\">\r\n <div className=\"flex gap-5\">\r\n {data && !data.first && (\r\n <Button\r\n variant=\"secondary\"\r\n onClick={prevPage}\r\n className=\"flex items-center\"\r\n >\r\n <MdArrowBack className=\"mr-1.5\" /> Previous\r\n </Button>\r\n )}\r\n {data && !data.last && (\r\n <Button\r\n variant=\"secondary\"\r\n onClick={nextPage}\r\n className=\"flex items-center\"\r\n >\r\n Next <MdArrowForward className=\"ml-2\" size={20} />\r\n </Button>\r\n )}\r\n <div className=\"flex items-center justify-end text-xs text-gray-800\">\r\n {paginationDisplay}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default DataTableServer;\r\n"],"names":["_a"],"mappings":"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"}
@@ -18,6 +18,7 @@ export interface DataTableColumn<T> {
18
18
  }
19
19
  export interface DataTableAction<T> {
20
20
  label: string;
21
+ rowAction?: boolean;
21
22
  onClick: (item: T) => void;
22
23
  visible?: (item: T) => boolean;
23
24
  icon?: React.ReactNode;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@addsign/moje-agenda-shared-lib",
3
3
  "private": false,
4
- "version": "0.0.71",
4
+ "version": "0.0.72",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
7
7
  "types": "dist/main.d.ts",