@herca/r-kit 0.0.49 → 0.0.51

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/clients.cjs CHANGED
@@ -829,10 +829,10 @@ var ChipGroup = ({
829
829
  }, [selected, internalSelected]);
830
830
  const toggleSelection = (value) => {
831
831
  let newSelected;
832
- if (multiple || !multiple && internalSelected.length === 0) {
832
+ if (multiple) {
833
833
  newSelected = internalSelected.includes(value) ? internalSelected.filter((v3) => v3 !== value) : [...internalSelected, value];
834
834
  } else {
835
- newSelected = [value];
835
+ newSelected = internalSelected.includes(value) ? [] : [value];
836
836
  }
837
837
  setInternalSelected(newSelected);
838
838
  onSelect?.(newSelected);
@@ -12985,10 +12985,17 @@ var createCalendarHelpers = ({
12985
12985
  value,
12986
12986
  rangeValue,
12987
12987
  disabledDates,
12988
- dayConfigs
12988
+ dayConfigs,
12989
+ disabled
12989
12990
  }) => {
12990
12991
  const isDateDisabled = (day) => {
12991
- return disabledDates.some((d) => d.getTime() === day.fullDate.getTime());
12992
+ if (disabledDates.some((d) => d.getTime() === day.fullDate.getTime())) {
12993
+ return true;
12994
+ }
12995
+ if (disabled?.(day.fullDate) === true) {
12996
+ return true;
12997
+ }
12998
+ return false;
12992
12999
  };
12993
13000
  const getDayConfig = (day) => {
12994
13001
  return dayConfigs.find((c) => c.date.getTime() === day.fullDate.getTime());
@@ -13266,7 +13273,8 @@ function CalendarDayItem({
13266
13273
  onClick,
13267
13274
  variant,
13268
13275
  events,
13269
- backdropOnClick
13276
+ backdropOnClick,
13277
+ disabledDateClassName
13270
13278
  }) {
13271
13279
  const dayConfig = helpers.getDayConfig(day);
13272
13280
  const isSelected = helpers.isDateSelected(day);
@@ -13302,8 +13310,9 @@ function CalendarDayItem({
13302
13310
  mode === "single" && variant === "compact" && styleHelpers.getBackgroundClass(),
13303
13311
  //prettier-ignore
13304
13312
  mode === "range" && !isDisabled && helpers.getRangeBackgroundClass(day),
13305
- variant === "default" && "h-28 md:h-36 w-full rounded-none flex items-start justify-start group p-1 md:p-3 border-r border-gray-300"
13313
+ variant === "default" && "h-28 md:h-36 w-full rounded-none flex items-start justify-start group p-1 md:p-3 border-r border-gray-300",
13306
13314
  //prettier-ignore
13315
+ isDisabled && disabledDateClassName
13307
13316
  ),
13308
13317
  children: [
13309
13318
  /* @__PURE__ */ (0, import_jsx_runtime382.jsx)(
@@ -13482,7 +13491,8 @@ function CalendarGrid({
13482
13491
  showCalendarTooltip = true,
13483
13492
  backdropOnClick,
13484
13493
  onEventClick,
13485
- useLimitEvent = true
13494
+ useLimitEvent = true,
13495
+ disabledDateClassName
13486
13496
  }) {
13487
13497
  const isMobile = useIsMobile();
13488
13498
  const weeks = Array.from(
@@ -13610,7 +13620,8 @@ function CalendarGrid({
13610
13620
  onClick,
13611
13621
  variant,
13612
13622
  events,
13613
- backdropOnClick: variant === "default" && backdropOnClick ? (day2) => backdropOnClick?.(day2) : void 0
13623
+ backdropOnClick: variant === "default" && backdropOnClick ? (day2) => backdropOnClick?.(day2) : void 0,
13624
+ disabledDateClassName
13614
13625
  },
13615
13626
  dayIndex
13616
13627
  ))
@@ -13995,7 +14006,9 @@ var Calendar2 = ({
13995
14006
  onMonthChange,
13996
14007
  onYearChange,
13997
14008
  showDefaultController = false,
13998
- useLimitEvent = true
14009
+ useLimitEvent = true,
14010
+ disabled,
14011
+ disabledDateClassName
13999
14012
  }) => {
14000
14013
  const currentDate = /* @__PURE__ */ new Date();
14001
14014
  const [currentMonth, setCurrentMonth] = (0, import_react367.useState)(defaultMonth ?? currentDate.getMonth());
@@ -14020,7 +14033,8 @@ var Calendar2 = ({
14020
14033
  dayConfigs,
14021
14034
  rangeValue,
14022
14035
  mode,
14023
- value
14036
+ value,
14037
+ disabled
14024
14038
  });
14025
14039
  const calendarState = {
14026
14040
  currentMonth,
@@ -14036,8 +14050,8 @@ var Calendar2 = ({
14036
14050
  };
14037
14051
  const handleDateClick = (day) => {
14038
14052
  const dayConfig = calendarHelpers.getDayConfig(day);
14039
- const disabled = (dayConfig?.disabled ?? false) || calendarHelpers.isDateDisabled(day);
14040
- if (disabled) {
14053
+ const disabled2 = (dayConfig?.disabled ?? false) || calendarHelpers.isDateDisabled(day);
14054
+ if (disabled2) {
14041
14055
  return;
14042
14056
  }
14043
14057
  onChange?.(day.fullDate);
@@ -14252,7 +14266,8 @@ var Calendar2 = ({
14252
14266
  showCalendarTooltip,
14253
14267
  useLimitEvent,
14254
14268
  onEventClick,
14255
- backdropOnClick
14269
+ backdropOnClick,
14270
+ disabledDateClassName
14256
14271
  }
14257
14272
  )
14258
14273
  ] })
@@ -14394,6 +14409,9 @@ var DatePicker = ({
14394
14409
  trigger,
14395
14410
  open,
14396
14411
  onOpenChange,
14412
+ minDate,
14413
+ maxDate,
14414
+ disabledDateClassName,
14397
14415
  calendarProps,
14398
14416
  endDateCalendarProps,
14399
14417
  startDateCalendarProps,
@@ -14674,6 +14692,12 @@ var DatePicker = ({
14674
14692
  dayWrapperClassname: "justify-between",
14675
14693
  onChange: handleCalendarChange,
14676
14694
  value: selectedDate,
14695
+ disabled: (date) => {
14696
+ if (minDate !== void 0 && date < minDate) return true;
14697
+ if (maxDate !== void 0 && date > maxDate) return true;
14698
+ return false;
14699
+ },
14700
+ disabledDateClassName,
14677
14701
  ...calendarProps
14678
14702
  }
14679
14703
  ) : /* @__PURE__ */ (0, import_jsx_runtime389.jsxs)("div", { className: "flex", children: [
@@ -14785,6 +14809,16 @@ var DatePicker = ({
14785
14809
  value: dateRange.start,
14786
14810
  rangeValue: dateRange,
14787
14811
  mode: "range",
14812
+ disabled: (date) => {
14813
+ if (minDate !== void 0 && date < minDate) {
14814
+ return true;
14815
+ }
14816
+ if (maxDate !== void 0 && date > maxDate) {
14817
+ return true;
14818
+ }
14819
+ return false;
14820
+ },
14821
+ disabledDateClassName,
14788
14822
  ...startDateCalendarProps
14789
14823
  }
14790
14824
  ),
@@ -14802,6 +14836,16 @@ var DatePicker = ({
14802
14836
  mode: "range",
14803
14837
  defaultMonth: nextMonthData.month,
14804
14838
  defaultYear: nextMonthData.year,
14839
+ disabled: (date) => {
14840
+ if (minDate !== void 0 && date < minDate) {
14841
+ return true;
14842
+ }
14843
+ if (maxDate !== void 0 && date > maxDate) {
14844
+ return true;
14845
+ }
14846
+ return false;
14847
+ },
14848
+ disabledDateClassName,
14805
14849
  ...endDateCalendarProps
14806
14850
  }
14807
14851
  )
@@ -26718,6 +26762,11 @@ var FontSize = Extension.create({
26718
26762
 
26719
26763
  // src/components/text-editor/extension/image-node.ts
26720
26764
  var import_extension_image = __toESM(require("@tiptap/extension-image"), 1);
26765
+ var getJustify = (align) => {
26766
+ if (align === "right") return "flex-end";
26767
+ if (align === "center") return "center";
26768
+ return "flex-start";
26769
+ };
26721
26770
  var ImageNode = import_extension_image.default.extend({
26722
26771
  // jadikan block supaya bisa di-align
26723
26772
  inline: false,
@@ -26756,9 +26805,10 @@ var ImageNode = import_extension_image.default.extend({
26756
26805
  },
26757
26806
  textAlign: {
26758
26807
  default: "left",
26759
- parseHTML: (el) => el.closest("[data-image-wrapper]")?.getAttribute("data-align") ?? "left",
26760
- renderHTML: () => ({})
26761
- // dihandle di nodeView
26808
+ parseHTML: (el) => el.getAttribute("data-text-align") ?? el.closest("[data-image-wrapper]")?.getAttribute("data-align") ?? "left",
26809
+ renderHTML: (attrs) => ({
26810
+ "data-text-align": attrs["textAlign"]
26811
+ })
26762
26812
  },
26763
26813
  url: {
26764
26814
  default: null,
@@ -26776,26 +26826,23 @@ var ImageNode = import_extension_image.default.extend({
26776
26826
  },
26777
26827
  renderHTML({ HTMLAttributes }) {
26778
26828
  const {
26779
- textAlign,
26780
26829
  objectFit,
26781
26830
  url,
26782
26831
  urlTarget,
26832
+ "data-text-align": dataTextAlign,
26783
26833
  "data-url": dataUrl,
26784
- // ← ambil dari sini
26785
26834
  "data-url-target": dataUrlTarget,
26786
26835
  ...rest
26787
26836
  } = HTMLAttributes;
26788
- const align = textAlign ?? "left";
26789
- const getJustify2 = (a) => a === "right" ? "flex-end" : a === "center" ? "center" : "flex-start";
26837
+ const align = typeof dataTextAlign === "string" && dataTextAlign.length > 0 ? dataTextAlign : "left";
26790
26838
  const resolvedUrl = url ?? dataUrl ?? null;
26791
26839
  const resolvedTarget = urlTarget ?? dataUrlTarget ?? "_self";
26792
26840
  const img = [
26793
26841
  "img",
26794
26842
  mergeAttributes(rest, {
26795
26843
  style: `object-fit: ${objectFit ?? "contain"}`,
26796
- // tambahkan data-* ke <img> supaya parseHTML bisa baca saat load HTML
26797
- ...url !== null ? { "data-url": url } : {},
26798
- ...urlTarget == null ? { "data-url-target": urlTarget } : {}
26844
+ ...resolvedUrl !== null ? { "data-url": resolvedUrl } : {},
26845
+ ...resolvedTarget != null ? { "data-url-target": resolvedTarget } : {}
26799
26846
  })
26800
26847
  ];
26801
26848
  const content = resolvedUrl != null ? ["a", { href: resolvedUrl, target: resolvedTarget }, img] : img;
@@ -26804,7 +26851,7 @@ var ImageNode = import_extension_image.default.extend({
26804
26851
  {
26805
26852
  "data-image-wrapper": "",
26806
26853
  "data-align": align,
26807
- "style": `display:flex;justify-content:${getJustify2(align)};`
26854
+ "style": `display:flex;justify-content:${getJustify(align)};`
26808
26855
  },
26809
26856
  content
26810
26857
  ];
@@ -26820,8 +26867,7 @@ var ImageNode = import_extension_image.default.extend({
26820
26867
  const align = n.attrs["textAlign"] ?? "left";
26821
26868
  const url = n.attrs["url"];
26822
26869
  const urlTarget = n.attrs["urlTarget"] ?? "_self";
26823
- const getJustify2 = (a) => a === "right" ? "flex-end" : a === "center" ? "center" : "flex-start";
26824
- wrapper.style.cssText = `display: flex; justify-content: ${getJustify2(align)};`;
26870
+ wrapper.style.cssText = `display: flex; justify-content: ${getJustify(align)};`;
26825
26871
  wrapper.setAttribute("data-align", align);
26826
26872
  if (n.attrs["src"])
26827
26873
  img.setAttribute("src", n.attrs["src"]);
@@ -26831,6 +26877,17 @@ var ImageNode = import_extension_image.default.extend({
26831
26877
  img.setAttribute("width", String(n.attrs["width"]));
26832
26878
  if (n.attrs["height"])
26833
26879
  img.setAttribute("height", String(n.attrs["height"]));
26880
+ img.setAttribute("data-text-align", align);
26881
+ if (url !== null) {
26882
+ img.setAttribute("data-url", url);
26883
+ } else {
26884
+ img.removeAttribute("data-url");
26885
+ }
26886
+ if (urlTarget !== null) {
26887
+ img.setAttribute("data-url-target", urlTarget);
26888
+ } else {
26889
+ img.removeAttribute("data-url-target");
26890
+ }
26834
26891
  img.style.objectFit = n.attrs["objectFit"] ?? "contain";
26835
26892
  wrapper.innerHTML = "";
26836
26893
  if (url !== null) {
@@ -27124,7 +27181,7 @@ var TableNode = import_extension_table.Table.extend({
27124
27181
  var table_node_default = TableNode;
27125
27182
 
27126
27183
  // src/components/text-editor/extension/youtube-node.ts
27127
- var getJustify = (align) => {
27184
+ var getJustify2 = (align) => {
27128
27185
  switch (align) {
27129
27186
  case "left":
27130
27187
  return "flex-start";
@@ -27190,7 +27247,7 @@ var YoutubeNode = Node3.create({
27190
27247
  const wrapper = document.createElement("div");
27191
27248
  wrapper.style.cssText = "display: flex; justify-content: center; margin: 0.5rem 0;";
27192
27249
  const updateAlignment = (align) => {
27193
- wrapper.style.justifyContent = getJustify(align);
27250
+ wrapper.style.justifyContent = getJustify2(align);
27194
27251
  };
27195
27252
  const iframe = document.createElement("iframe");
27196
27253
  iframe.setAttribute("src", node.attrs["src"]);
@@ -33748,6 +33805,16 @@ var target_link_options_default = targetOptions;
33748
33805
 
33749
33806
  // src/components/text-editor/partials/modal-insert-image.tsx
33750
33807
  var import_jsx_runtime407 = require("react/jsx-runtime");
33808
+ var createDefaultImageForm = () => ({
33809
+ url: null,
33810
+ image: {
33811
+ objectFit: object_fit_options_default[0],
33812
+ source: "",
33813
+ altText: "",
33814
+ width: "200",
33815
+ height: "200"
33816
+ }
33817
+ });
33751
33818
  function ModalInsertImage({
33752
33819
  isOpen,
33753
33820
  onClose,
@@ -33766,22 +33833,25 @@ function ModalInsertImage({
33766
33833
  altText: data[0].uploadedData?.data.name ?? ""
33767
33834
  };
33768
33835
  }
33769
- }
33836
+ },
33837
+ onDownload
33770
33838
  }) {
33771
33839
  const [currentTabImage, setCurrentTabImage] = (0, import_react388.useState)("0");
33840
+ const [uploadInputKey, setUploadInputKey] = (0, import_react388.useState)(0);
33841
+ const [uploadFiles, setUploadFiles] = (0, import_react388.useState)([]);
33772
33842
  const [errors, setErrors] = (0, import_react388.useState)(
33773
33843
  {}
33774
33844
  );
33775
- const [imageForm, setImageForm] = (0, import_react388.useState)({
33776
- url: null,
33777
- image: {
33778
- objectFit: object_fit_options_default[0],
33779
- source: "",
33780
- altText: "",
33781
- width: "200",
33782
- height: "200"
33783
- }
33784
- });
33845
+ const [imageForm, setImageForm] = (0, import_react388.useState)(
33846
+ createDefaultImageForm()
33847
+ );
33848
+ const resetFormState = () => {
33849
+ setCurrentTabImage("0");
33850
+ setErrors({});
33851
+ setImageForm(createDefaultImageForm());
33852
+ setUploadFiles([]);
33853
+ setUploadInputKey((prev) => prev + 1);
33854
+ };
33785
33855
  const validate = () => {
33786
33856
  const newErrors = {};
33787
33857
  if (imageForm?.image?.source === "" || imageForm?.image?.source === null || imageForm?.image?.source === void 0) {
@@ -33800,9 +33870,16 @@ function ModalInsertImage({
33800
33870
  return Object.keys(newErrors).length === 0;
33801
33871
  };
33802
33872
  (0, import_react388.useEffect)(() => {
33803
- if (isOpen && initialValues !== void 0) {
33873
+ if (!isOpen) return;
33874
+ setErrors({});
33875
+ setCurrentTabImage("0");
33876
+ setUploadFiles([]);
33877
+ setUploadInputKey((prev) => prev + 1);
33878
+ if (initialValues !== void 0) {
33804
33879
  setImageForm(initialValues);
33880
+ return;
33805
33881
  }
33882
+ setImageForm(createDefaultImageForm());
33806
33883
  }, [isOpen, initialValues]);
33807
33884
  return /* @__PURE__ */ (0, import_jsx_runtime407.jsxs)(Modal, { isOpen, onClose: () => onClose(false), closable: false, children: [
33808
33885
  /* @__PURE__ */ (0, import_jsx_runtime407.jsxs)(ModalHeader, { className: "flex-row! items-center justify-between border-b border-gray-200", children: [
@@ -33826,7 +33903,7 @@ function ModalInsertImage({
33826
33903
  if (!validate()) return;
33827
33904
  onSubmit(imageForm);
33828
33905
  onClose(false);
33829
- setImageForm(null);
33906
+ resetFormState();
33830
33907
  },
33831
33908
  className: "overflow-auto",
33832
33909
  children: [
@@ -34007,8 +34084,11 @@ function ModalInsertImage({
34007
34084
  maxSize: (attachmentField?.maxSize ?? 0) * 1024 * 1024,
34008
34085
  variant: attachmentField?.variant ?? "medium",
34009
34086
  uploadConfig: attachmentField?.uploadConfig,
34010
- onChange: attachmentField?.onChange ? (files) => attachmentField?.onChange?.(files) : void 0,
34011
- value: attachmentField?.value,
34087
+ onChange: (files) => {
34088
+ setUploadFiles(files);
34089
+ attachmentField?.onChange?.(files);
34090
+ },
34091
+ value: uploadFiles,
34012
34092
  onUploadSuccess: (results) => {
34013
34093
  const { url, altText } = attachmentField.extractUploadResult(results);
34014
34094
  setCurrentTabImage("0");
@@ -34024,8 +34104,10 @@ function ModalInsertImage({
34024
34104
  };
34025
34105
  });
34026
34106
  attachmentField?.onUploadSuccess?.(results);
34027
- }
34028
- }
34107
+ },
34108
+ onDownload
34109
+ },
34110
+ uploadInputKey
34029
34111
  ) })
34030
34112
  ]
34031
34113
  }
@@ -34039,7 +34121,7 @@ function ModalInsertImage({
34039
34121
  type: "button",
34040
34122
  onClick: () => {
34041
34123
  onClose(false);
34042
- setImageForm(null);
34124
+ resetFormState();
34043
34125
  },
34044
34126
  children: "Cancel"
34045
34127
  }
@@ -34255,7 +34337,8 @@ var import_jsx_runtime409 = require("react/jsx-runtime");
34255
34337
  function InsertGroup({
34256
34338
  editor,
34257
34339
  disabled = false,
34258
- attachmentField
34340
+ attachmentField,
34341
+ onDownload
34259
34342
  }) {
34260
34343
  const [isModalImageOpen, setIsModalImageOpen] = (0, import_react392.useState)(false);
34261
34344
  const [isModalYoutubeOpen, setIsModalYoutubeOpen] = (0, import_react392.useState)(false);
@@ -34412,7 +34495,8 @@ function InsertGroup({
34412
34495
  url: form.url?.source ?? null,
34413
34496
  urlTarget: form.url?.target?.value ?? "_self"
34414
34497
  }).run();
34415
- }
34498
+ },
34499
+ onDownload
34416
34500
  }
34417
34501
  )
34418
34502
  ] });
@@ -34625,7 +34709,8 @@ function TextEditor({
34625
34709
  ui: ui3,
34626
34710
  field,
34627
34711
  toolbar,
34628
- editor: editorProps
34712
+ editor: editorProps,
34713
+ onDownload
34629
34714
  }) {
34630
34715
  const {
34631
34716
  disabled = false,
@@ -34764,7 +34849,8 @@ function TextEditor({
34764
34849
  {
34765
34850
  disabled: isHtmlMode,
34766
34851
  editor,
34767
- attachmentField
34852
+ attachmentField,
34853
+ onDownload
34768
34854
  }
34769
34855
  ),
34770
34856
  table && /* @__PURE__ */ (0, import_jsx_runtime411.jsx)(TableGroup, { disabled: isHtmlMode, editor }),