@apexcura/ui-components 0.0.14-Beta21 → 0.0.14-Beta210

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/index.js CHANGED
@@ -31,20 +31,27 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  AddMoreTable: () => AddMoreTable,
34
+ BarChart: () => BarChart,
34
35
  ButtonElement: () => ButtonElement,
35
36
  CheckboxElement: () => CheckboxElement,
37
+ CircleDonut: () => CircleDonut,
36
38
  CkEditor: () => CkEditor,
37
39
  DatePickerElement: () => DatePickerElement,
38
40
  DateRangePickerElement: () => DateRangePickerElement,
41
+ DoubleBarChart: () => DoubleBarChart,
39
42
  DropDownGroup: () => DropDownGroup,
40
43
  FileUpload: () => FileUpload,
44
+ HorizontalBarChart: () => HorizontalBarChart,
41
45
  Image: () => Image,
46
+ LineChart: () => LineChart,
42
47
  MultipleSelectElement: () => MultipleSelectElement,
43
48
  Navbar: () => Navbar,
44
49
  NumberElement: () => NumberElement,
50
+ OtpElement: () => OtpElement,
45
51
  PasswordElement: () => PasswordElement,
46
52
  RadioElement: () => RadioElement,
47
53
  SelectElement: () => SelectElement,
54
+ SemiCircleDonut: () => SemiCircleDonut,
48
55
  Sidebar: () => Sidebar,
49
56
  SingleCheckbox: () => SingleCheckbox,
50
57
  SingleSelectElement: () => SingleSelectElement,
@@ -52,7 +59,8 @@ __export(src_exports, {
52
59
  TableElement: () => TableElement,
53
60
  TabsElement: () => TabsElement,
54
61
  TextElement: () => TextElement,
55
- TextareaElement: () => TextareaElement
62
+ TextareaElement: () => TextareaElement,
63
+ Upload: () => Upload2
56
64
  });
57
65
  module.exports = __toCommonJS(src_exports);
58
66
 
@@ -71,6 +79,7 @@ var TextElement = (props) => {
71
79
  placeholder: props.placeholder,
72
80
  allowClear: true,
73
81
  id: props.name,
82
+ value: props.value,
74
83
  prefix: props.prefix,
75
84
  type: props.type,
76
85
  status: props.status,
@@ -130,8 +139,7 @@ var NumberElement = (props) => {
130
139
  {
131
140
  placeholder: props.placeholder,
132
141
  addonBefore: props.addonBefore,
133
- allowClear: true,
134
- defaultValue: props.defaultValue,
142
+ value: props.value,
135
143
  disabled: props.disabled,
136
144
  id: props.name,
137
145
  prefix: props.prefix,
@@ -379,11 +387,14 @@ var ButtonElement = (props) => {
379
387
  return /* @__PURE__ */ import_react11.default.createElement(
380
388
  "button",
381
389
  {
382
- onClick: () => props.onClick && props.onClick(),
383
- className: `${props.className ? props.className : ""}`
390
+ onClick: props.onClick,
391
+ className: `${props.className ? props.className : ""}`,
392
+ disabled: props.loading,
393
+ style: {
394
+ cursor: props.loading ? "no-drop" : "pointer"
395
+ }
384
396
  },
385
- props.icon && /* @__PURE__ */ import_react11.default.createElement("img", { className: props.iconsClassName, src: props.icon }),
386
- props.label
397
+ /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement("span", { className: props.iconsClassName }, /* @__PURE__ */ import_react11.default.createElement("img", { src: props.icon, className: "icon-active" })), props.label)
387
398
  );
388
399
  };
389
400
 
@@ -525,10 +536,19 @@ var Sidebar = (props) => {
525
536
  props.onChange(item);
526
537
  }
527
538
  };
528
- return /* @__PURE__ */ import_react13.default.createElement("div", { className: props.className, key: props.name }, /* @__PURE__ */ import_react13.default.createElement("div", null, /* @__PURE__ */ import_react13.default.createElement("img", { src: props.img, alt: "logo" })), /* @__PURE__ */ import_react13.default.createElement("ul", { className: props.listClassName }, props.items?.map((item) => {
529
- return /* @__PURE__ */ import_react13.default.createElement("li", { onClick: () => {
530
- handleChange(item);
531
- }, key: item.label, className: `${props.listItemClassName} ${item.active && props.activeClassName}` }, /* @__PURE__ */ import_react13.default.createElement("img", { src: item.icon, className: props.className }), /* @__PURE__ */ import_react13.default.createElement("p", null, item.label));
539
+ return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, { key: props.name }, /* @__PURE__ */ import_react13.default.createElement("div", { className: props.imgClassName }, /* @__PURE__ */ import_react13.default.createElement("img", { src: props.img, alt: "logo" })), /* @__PURE__ */ import_react13.default.createElement("div", { className: props.listClassName }, props.items?.map((item) => {
540
+ return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, { key: item.label }, /* @__PURE__ */ import_react13.default.createElement(
541
+ ButtonElement,
542
+ {
543
+ ...item,
544
+ className: item.active ? props.activeClassName : props.className,
545
+ iconsClassName: props.iconsClassName,
546
+ onClick: (e) => {
547
+ e.preventDefault();
548
+ handleChange(item);
549
+ }
550
+ }
551
+ ));
532
552
  })));
533
553
  };
534
554
 
@@ -602,18 +622,48 @@ var import_antd13 = require("antd");
602
622
 
603
623
  // src/Components/ModelBody.tsx
604
624
  var import_react18 = __toESM(require("react"));
625
+ var import_moment = __toESM(require("moment"));
605
626
  var ModelBody = (props) => {
606
- return /* @__PURE__ */ import_react18.default.createElement("div", { className: props.modalContent && props.modalContent.className }, props.modalContent && props.modalContent.fields.map((eachField) => {
607
- if (eachField.element === "div") {
608
- return /* @__PURE__ */ import_react18.default.createElement("div", { className: eachField.className }, eachField.label);
609
- } else if (eachField.element === "input-radio") {
610
- return /* @__PURE__ */ import_react18.default.createElement("div", { className: eachField.className }, /* @__PURE__ */ import_react18.default.createElement(RadioElement, { ...eachField }));
611
- } else if (eachField.element === "button") {
612
- return /* @__PURE__ */ import_react18.default.createElement("div", { className: eachField.className }, /* @__PURE__ */ import_react18.default.createElement(ButtonElement, { ...eachField }));
613
- } else {
614
- return null;
627
+ return /* @__PURE__ */ import_react18.default.createElement("div", { className: props.modalContent && props.modalContent.className }, props.modalContent && props.modalContent.fields.map(
628
+ (eachField) => {
629
+ if (eachField.element === "div") {
630
+ return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: eachField.className }, eachField.label), eachField.dateTime ? /* @__PURE__ */ import_react18.default.createElement(
631
+ "p",
632
+ {
633
+ style: {
634
+ fontSize: "10px",
635
+ textAlign: eachField.source === "bot" ? "left" : "right"
636
+ }
637
+ },
638
+ (0, import_moment.default)(eachField.dateTime).format("LT")
639
+ ) : "");
640
+ } else if (eachField.element === "input-radio") {
641
+ return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: eachField.className }, /* @__PURE__ */ import_react18.default.createElement(RadioElement, { ...eachField })), eachField.dateTime ? /* @__PURE__ */ import_react18.default.createElement(
642
+ "p",
643
+ {
644
+ style: {
645
+ fontSize: "10px",
646
+ textAlign: eachField.source === "bot" ? "left" : "right"
647
+ }
648
+ },
649
+ (0, import_moment.default)(eachField.dateTime).format("LT")
650
+ ) : "");
651
+ } else if (eachField.element === "button") {
652
+ return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: eachField.className }, /* @__PURE__ */ import_react18.default.createElement(ButtonElement, { ...eachField })), eachField.dateTime ? /* @__PURE__ */ import_react18.default.createElement(
653
+ "p",
654
+ {
655
+ style: {
656
+ fontSize: "10px",
657
+ textAlign: eachField.source === "bot" ? "left" : "right"
658
+ }
659
+ },
660
+ (0, import_moment.default)(eachField.dateTime).format("LT")
661
+ ) : "");
662
+ } else {
663
+ return null;
664
+ }
615
665
  }
616
- }));
666
+ ));
617
667
  };
618
668
 
619
669
  // src/Components/Model.tsx
@@ -638,9 +688,22 @@ var ModelElement = (props) => {
638
688
  margin: "-10px"
639
689
  }
640
690
  },
641
- Object.entries(selectedRecord).map(([key, value]) => {
642
- const record = columns.filter((eachColumn) => eachColumn.key === key);
643
- return record.length > 0 ? /* @__PURE__ */ import_react19.default.createElement("p", { style: { fontWeight: "500", padding: "10px" }, key }, /* @__PURE__ */ import_react19.default.createElement("span", { style: { fontWeight: "200", color: "gray", paddingRight: "10px" } }, record[0].title), String(value)) : "";
691
+ columns.map((eachColumn) => {
692
+ if (!["index", "View"].includes(eachColumn.key) && eachColumn?.["is_detail"] !== false) {
693
+ return /* @__PURE__ */ import_react19.default.createElement("p", { style: { fontWeight: "500", padding: "10px" } }, /* @__PURE__ */ import_react19.default.createElement(
694
+ "span",
695
+ {
696
+ style: {
697
+ fontWeight: "200",
698
+ color: "gray",
699
+ paddingRight: "10px"
700
+ }
701
+ },
702
+ eachColumn.title
703
+ ), selectedRecord[eachColumn.key] !== "" ? selectedRecord[eachColumn.key] : "--");
704
+ } else {
705
+ return null;
706
+ }
644
707
  })
645
708
  )
646
709
  },
@@ -649,15 +712,30 @@ var ModelElement = (props) => {
649
712
  };
650
713
 
651
714
  // src/Components/TableElement.tsx
715
+ var import_icons4 = require("@ant-design/icons");
652
716
  var TableElement = (props) => {
653
717
  const { thead, tbody } = props;
654
718
  const [selectedRecord, setSelectedRecord] = (0, import_react20.useState)({});
655
719
  const [model, setModel] = (0, import_react20.useState)(false);
656
- const [selectedRowKeys, setSelectedRowKeys] = (0, import_react20.useState)([]);
720
+ const [dataSource, setDataSource] = (0, import_react20.useState)([]);
721
+ console.log(props.value);
722
+ const defaultVal = props.value;
723
+ (0, import_react20.useEffect)(() => {
724
+ if (tbody) {
725
+ setDataSource(
726
+ tbody.map((row, index) => ({
727
+ ...row,
728
+ key: index,
729
+ index: index + 1
730
+ }))
731
+ );
732
+ }
733
+ }, [tbody]);
657
734
  const handleChange = (record) => {
658
- console.log("record", record);
659
- if (props.onChange) {
660
- props.onChange(record);
735
+ if (record) {
736
+ props.onChange && props.onChange(record);
737
+ } else {
738
+ props.onChange && props.onChange(defaultVal);
661
739
  }
662
740
  };
663
741
  let columns = [];
@@ -665,106 +743,153 @@ var TableElement = (props) => {
665
743
  columns = [
666
744
  {
667
745
  title: "#",
668
- dataIndex: "#",
669
- key: "#"
746
+ dataIndex: "index",
747
+ key: "index",
748
+ fixed: "left"
670
749
  },
671
750
  ...thead.map((col, ind) => ({
672
751
  title: col.label,
673
752
  dataIndex: col.name,
674
753
  key: col.key,
754
+ ellipsis: col.ellipsis,
675
755
  render: col.render,
676
756
  sorter: {
677
757
  compare: (a, b) => {
678
- if (typeof a[col.key] === "number" && typeof a[col.key] === "number") {
758
+ if (typeof a[col.key] === "number" && typeof b[col.key] === "number") {
679
759
  return a[col.key] - b[col.key];
680
- } else if (typeof a[col.key] === "string" && typeof a[col.key] === "string") {
760
+ } else if (typeof a[col.key] === "string" && typeof b[col.key] === "string") {
681
761
  return a[col.key].localeCompare(b[col.key]);
682
762
  }
683
763
  }
684
764
  }
685
- })),
686
- {
765
+ }))
766
+ ];
767
+ if (props.view) {
768
+ columns.push({
687
769
  title: "View",
688
770
  dataIndex: "View",
689
771
  key: "View",
690
- render: (_, record) => /* @__PURE__ */ import_react20.default.createElement(
691
- "a",
692
- {
693
- onClick: () => {
694
- setSelectedRecord(record);
695
- handleChange(record);
696
- setModel(true);
697
- }
698
- },
699
- "View"
700
- )
701
- }
702
- ];
772
+ render: (_, record) => {
773
+ return /* @__PURE__ */ import_react20.default.createElement(
774
+ "a",
775
+ {
776
+ onClick: () => {
777
+ if (props.view) {
778
+ setSelectedRecord(record);
779
+ handleChange(record);
780
+ setModel(true);
781
+ }
782
+ }
783
+ },
784
+ /* @__PURE__ */ import_react20.default.createElement(import_icons4.EyeOutlined, null)
785
+ );
786
+ }
787
+ });
788
+ }
703
789
  }
704
- const dataSource = tbody && tbody.map((row, index) => ({
705
- ...row,
706
- [columns[0].key]: index + 1
707
- }));
708
- const count = dataSource ? dataSource.length : 0;
790
+ const onChangeTable = (pagination, filters, sorter, extra) => {
791
+ if (extra && extra.currentDataSource) {
792
+ setDataSource(
793
+ extra.currentDataSource.map((row, index) => ({
794
+ ...row,
795
+ index: index + 1
796
+ }))
797
+ );
798
+ }
799
+ };
709
800
  const onChangePage = (page, pageSize) => {
710
801
  if (props.onChange) {
711
802
  props.onChange({ name: "pagination", page, pageSize });
712
803
  }
713
804
  };
714
- const onSelectChange = (newSelectedRowKeys) => {
715
- console.log("selectedRowKeys changed: ", newSelectedRowKeys);
716
- setSelectedRowKeys(newSelectedRowKeys);
717
- };
718
805
  const rowSelectionConfig = props.rowSelection ? {
719
- selectedRowKeys,
720
- onChange: onSelectChange
806
+ onChange: (selectedRowKeys, selectedRows) => {
807
+ console.log(
808
+ `selectedRowKeys: ${selectedRowKeys}`,
809
+ "selectedRows: ",
810
+ selectedRows
811
+ );
812
+ if (props.onChange) {
813
+ props.onChange(selectedRows);
814
+ }
815
+ }
721
816
  } : void 0;
722
817
  return /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement(
723
818
  import_antd14.Table,
724
819
  {
725
- pagination: {
820
+ loading: props.loading,
821
+ className: props.className,
822
+ pagination: props.pagination ? {
823
+ defaultCurrent: props.value && props.value.page,
726
824
  showTotal: (total) => `Total: ${total} items`,
727
- total: count,
728
- showSizeChanger: count > 10,
825
+ total: props.count,
826
+ showSizeChanger: props.count ? props.count > 10 : 0 > 10,
729
827
  onChange: onChangePage
828
+ } : false,
829
+ onRow: (record) => {
830
+ return {
831
+ onClick: () => {
832
+ if (props.view) {
833
+ setSelectedRecord(record);
834
+ handleChange(record);
835
+ setModel(true);
836
+ }
837
+ },
838
+ style: { cursor: "pointer" }
839
+ };
730
840
  },
841
+ rowSelection: rowSelectionConfig,
731
842
  dataSource,
732
843
  columns,
844
+ size: props.size,
733
845
  bordered: true,
734
- rowSelection: rowSelectionConfig,
735
- size: props.size && props.size
846
+ onChange: onChangeTable
847
+ }
848
+ ), model && /* @__PURE__ */ import_react20.default.createElement(
849
+ ModelElement,
850
+ {
851
+ selectedRecord,
852
+ ...props,
853
+ columns,
854
+ model,
855
+ onCancel: () => setModel(false)
736
856
  }
737
- ), model && /* @__PURE__ */ import_react20.default.createElement(ModelElement, { selectedRecord, ...props, columns, model, onCancel: () => setModel(false) }));
857
+ ));
738
858
  };
739
859
 
740
860
  // src/Components/DatePicker.tsx
741
861
  var import_react21 = __toESM(require("react"));
742
862
  var import_antd15 = require("antd");
863
+ var import_dayjs = __toESM(require("dayjs"));
864
+ var import_customParseFormat = __toESM(require("dayjs/plugin/customParseFormat.js"));
865
+ var import_moment2 = __toESM(require("moment"));
866
+ import_dayjs.default.extend(import_customParseFormat.default);
743
867
  var DatePickerElement = (props) => {
744
- const [date, setDate] = (0, import_react21.useState)(null);
745
- const dateFormat = "DD/MM/YYYY";
746
- const handleChange = (date2, dateString) => {
747
- console.log("date==========", date2);
748
- if (date2) {
749
- console.log("date==", date2);
750
- const formattedDate = date2.format(dateFormat);
751
- setDate(date2);
868
+ const [dateState, setDateState] = (0, import_react21.useState)("");
869
+ const handleChange = (date, dateString) => {
870
+ if (date) {
871
+ const formattedDate = dateString;
872
+ setDateState(date);
752
873
  if (props.onChange) {
753
874
  props.onChange(formattedDate);
754
875
  }
755
876
  } else {
756
- setDate(null);
877
+ setDateState("");
757
878
  if (props.onChange) {
758
879
  props.onChange("");
759
880
  }
760
881
  }
761
882
  };
883
+ const disabledDate = (current) => {
884
+ return current && current > (0, import_moment2.default)();
885
+ };
762
886
  return /* @__PURE__ */ import_react21.default.createElement("div", null, /* @__PURE__ */ import_react21.default.createElement(
763
887
  import_antd15.DatePicker,
764
888
  {
889
+ disabledDate,
765
890
  placeholder: props.placeholder,
766
- value: date,
767
- variant: "borderless",
891
+ value: dateState,
892
+ format: { format: "DD-MM-YYYY" },
768
893
  onChange: handleChange
769
894
  }
770
895
  ));
@@ -773,29 +898,51 @@ var DatePickerElement = (props) => {
773
898
  // src/Components/DateRangePickerElement.tsx
774
899
  var import_react22 = __toESM(require("react"));
775
900
  var import_antd16 = require("antd");
776
- var import_dayjs = __toESM(require("dayjs"));
901
+ var import_dayjs2 = __toESM(require("dayjs"));
902
+ var import_moment3 = __toESM(require("moment"));
777
903
  var DateRangePickerElement = (props) => {
904
+ const { value } = props;
778
905
  const { RangePicker } = import_antd16.DatePicker;
779
906
  const handleChange = (dates, dateStrings) => {
780
- if (dates && props.onChange) {
781
- props.onChange(dateStrings);
907
+ console.log(dateStrings);
908
+ if (dates) {
909
+ const formattedDate = [];
910
+ formattedDate.push((0, import_moment3.default)(dateStrings[0]).format("DD-MM-YYYY"));
911
+ formattedDate.push((0, import_moment3.default)(dateStrings[1]).format("DD-MM-YYYY"));
912
+ console.log("formattedDate", formattedDate);
913
+ props.onChange && props.onChange(formattedDate);
782
914
  } else {
783
- console.log("Clear");
915
+ props.onChange && props.onChange(["", ""]);
784
916
  }
785
917
  };
786
918
  const rangePresets = [
787
- { label: "Last 7 Days", value: [(0, import_dayjs.default)().add(-7, "d"), (0, import_dayjs.default)()] },
788
- { label: "Last 14 Days", value: [(0, import_dayjs.default)().add(-14, "d"), (0, import_dayjs.default)()] },
789
- { label: "Last 30 Days", value: [(0, import_dayjs.default)().add(-30, "d"), (0, import_dayjs.default)()] },
790
- { label: "Last 90 Days", value: [(0, import_dayjs.default)().add(-90, "d"), (0, import_dayjs.default)()] }
919
+ { label: "Last 7 Days", value: [(0, import_dayjs2.default)().add(-7, "d"), (0, import_dayjs2.default)()] },
920
+ { label: "Last 14 Days", value: [(0, import_dayjs2.default)().add(-14, "d"), (0, import_dayjs2.default)()] },
921
+ { label: "Last 30 Days", value: [(0, import_dayjs2.default)().add(-30, "d"), (0, import_dayjs2.default)()] },
922
+ { label: "Last 90 Days", value: [(0, import_dayjs2.default)().add(-90, "d"), (0, import_dayjs2.default)()] }
791
923
  ];
792
- return /* @__PURE__ */ import_react22.default.createElement(import_antd16.Space, { direction: "vertical", size: 12 }, /* @__PURE__ */ import_react22.default.createElement(RangePicker, { presets: rangePresets, onChange: handleChange }));
924
+ const disabledDate = (current) => {
925
+ return current && current > (0, import_dayjs2.default)();
926
+ };
927
+ return /* @__PURE__ */ import_react22.default.createElement(import_antd16.Space, { direction: "vertical", size: 12 }, /* @__PURE__ */ import_react22.default.createElement(
928
+ RangePicker,
929
+ {
930
+ disabledDate,
931
+ presets: rangePresets,
932
+ format: { format: "DD-MM-YYYY" },
933
+ onChange: handleChange,
934
+ value: value && value.length === 2 && [
935
+ (0, import_dayjs2.default)(value[0], "DD-MM-YYYY"),
936
+ (0, import_dayjs2.default)(value[1], "DD-MM-YYYY")
937
+ ]
938
+ }
939
+ ));
793
940
  };
794
941
 
795
942
  // src/Components/Image.tsx
796
943
  var import_react23 = __toESM(require("react"));
797
944
  var Image = (props) => {
798
- return /* @__PURE__ */ import_react23.default.createElement("div", null, /* @__PURE__ */ import_react23.default.createElement("img", { className: props.className, src: props.img, alt: "image" }));
945
+ return /* @__PURE__ */ import_react23.default.createElement("img", { className: props.className, src: props.img, alt: "image" });
799
946
  };
800
947
 
801
948
  // src/Components/SingleCheckbox.tsx
@@ -814,60 +961,64 @@ var SingleCheckbox = (props) => {
814
961
  var import_react25 = __toESM(require("react"));
815
962
  var import_antd18 = require("antd");
816
963
  var DropDownGroup = (props) => {
817
- const [selectedValue, setSelectedValue] = (0, import_react25.useState)({ firstValue: {}, secondValue: {} });
818
- console.log(selectedValue);
964
+ const [selectedValue, setSelectedValue] = (0, import_react25.useState)({
965
+ firstValue: {},
966
+ secondValue: {},
967
+ temp: ""
968
+ });
819
969
  const handleFirstChange = (value) => {
820
- const filterOption2 = props.firstOptions?.find((eachOption) => eachOption.value === value);
970
+ console.log(selectedValue.temp);
971
+ const filterOption2 = props.firstOptions?.find(
972
+ (eachOption) => eachOption.value === value
973
+ );
821
974
  setSelectedValue((prev) => {
822
975
  const newValue = { ...prev, firstValue: filterOption2 };
976
+ const { temp, ...rest } = newValue;
823
977
  if (newValue.firstValue) {
824
- props.onChange?.(newValue);
978
+ props.onChange?.(rest);
825
979
  }
826
980
  return newValue;
827
981
  });
828
982
  };
829
983
  const handleSecondChange = (value) => {
830
- const filterOption2 = props.secondOptions?.find((eachOption) => eachOption.value === value);
984
+ const filterOption2 = props.secondOptions?.find(
985
+ (eachOption) => eachOption.value === value
986
+ );
831
987
  setSelectedValue((prev) => {
832
988
  const newValue = { ...prev, secondValue: filterOption2 };
989
+ const { temp, ...rest } = newValue;
833
990
  if (newValue.secondValue) {
834
- props.onChange?.(newValue);
991
+ props.onChange?.(rest);
835
992
  }
836
993
  return newValue;
837
994
  });
838
995
  };
839
- return /* @__PURE__ */ import_react25.default.createElement("div", { className: props.className, style: { display: "flex", flexDirection: "row", backgroundColor: "white", borderRadius: 10, border: "1px solid gray" } }, /* @__PURE__ */ import_react25.default.createElement(
996
+ return /* @__PURE__ */ import_react25.default.createElement("div", { className: props.containerClassName }, props.label && /* @__PURE__ */ import_react25.default.createElement("label", { htmlFor: props.name, className: props.labelClassName }, props.label), /* @__PURE__ */ import_react25.default.createElement("div", { className: props.subContainerClassName }, /* @__PURE__ */ import_react25.default.createElement(
840
997
  import_antd18.Select,
841
998
  {
842
999
  onChange: handleFirstChange,
843
1000
  variant: props.variant,
844
- options: props.firstOptions
1001
+ options: props.firstOptions,
1002
+ className: props.className
845
1003
  }
846
1004
  ), /* @__PURE__ */ import_react25.default.createElement("div", { style: { borderLeft: "1px solid gray", height: "33px" } }), /* @__PURE__ */ import_react25.default.createElement(
847
1005
  import_antd18.Select,
848
1006
  {
849
1007
  onChange: handleSecondChange,
850
1008
  variant: props.variant,
851
- options: props.secondOptions
1009
+ options: props.secondOptions,
1010
+ className: props.className
852
1011
  }
853
- ));
1012
+ )));
854
1013
  };
855
1014
 
856
1015
  // src/Components/FilesUpload.tsx
857
1016
  var import_react26 = __toESM(require("react"));
858
1017
  var import_antd19 = require("antd");
859
- var import_icons4 = require("@ant-design/icons");
1018
+ var import_icons5 = require("@ant-design/icons");
860
1019
  var FileUpload = (props) => {
861
1020
  const { Dragger } = import_antd19.Upload;
862
1021
  const [files, setFiles] = (0, import_react26.useState)([]);
863
- const beforeUpload = (file) => {
864
- const isCorrectFile = ["image/*", "video/*", "application/*"].includes(file.type);
865
- if (!isCorrectFile) {
866
- import_antd19.message.error(`(${file.name}) is an invalid file. Please upload files with the following extensions only (.png/.jpg/.jpeg/.pdf)`);
867
- return import_antd19.Upload.LIST_IGNORE;
868
- }
869
- return true;
870
- };
871
1022
  const handleChange = ({ fileList }) => {
872
1023
  setFiles(fileList);
873
1024
  if (props.onChange) {
@@ -891,12 +1042,11 @@ var FileUpload = (props) => {
891
1042
  maxCount: props.max_count,
892
1043
  multiple: props.multiple,
893
1044
  fileList: files,
894
- beforeUpload,
895
1045
  onChange: handleChange,
896
1046
  showUploadList: true,
897
1047
  customRequest
898
1048
  },
899
- /* @__PURE__ */ import_react26.default.createElement("p", null, /* @__PURE__ */ import_react26.default.createElement(import_icons4.InboxOutlined, null)),
1049
+ /* @__PURE__ */ import_react26.default.createElement("p", null, /* @__PURE__ */ import_react26.default.createElement(import_icons5.InboxOutlined, null)),
900
1050
  /* @__PURE__ */ import_react26.default.createElement("p", null, "Click or drag file to upload")
901
1051
  ));
902
1052
  };
@@ -920,23 +1070,546 @@ var onChange = (checked) => {
920
1070
  console.log(`switch to ${checked}`);
921
1071
  };
922
1072
  var SwitchElement = () => /* @__PURE__ */ import_react28.default.createElement(import_antd21.Switch, { defaultChecked: true, onChange });
1073
+
1074
+ // src/Components/Upload.tsx
1075
+ var import_react29 = __toESM(require("react"));
1076
+ var Upload2 = (props) => {
1077
+ const [file, setFile] = (0, import_react29.useState)();
1078
+ const handleFileChange = (e) => {
1079
+ setFile(e.target.files[0]);
1080
+ if (props.onChange) {
1081
+ props.onChange(e.target.files[0]);
1082
+ }
1083
+ };
1084
+ const handleUpload = async () => {
1085
+ if (!file) {
1086
+ console.error("No file selected");
1087
+ return;
1088
+ }
1089
+ };
1090
+ return /* @__PURE__ */ import_react29.default.createElement("div", { style: { marginTop: 16 } }, /* @__PURE__ */ import_react29.default.createElement("input", { type: "file", onChange: handleFileChange }), /* @__PURE__ */ import_react29.default.createElement(
1091
+ "button",
1092
+ {
1093
+ type: "button",
1094
+ onClick: handleUpload,
1095
+ disabled: !file,
1096
+ style: { marginTop: 16 }
1097
+ },
1098
+ "Upload"
1099
+ ));
1100
+ };
1101
+
1102
+ // src/Components/OtpElement.tsx
1103
+ var import_react30 = __toESM(require("react"));
1104
+ var import_antd22 = require("antd");
1105
+ var OtpElement = (props) => {
1106
+ const length = props.length;
1107
+ const [otp, setOtp] = (0, import_react30.useState)(Array(length).fill(""));
1108
+ const inputRefs = (0, import_react30.useRef)([]);
1109
+ const handleChange = (e, index) => {
1110
+ const value = e.target.value;
1111
+ if (/^[0-9]$/.test(value) || value === "") {
1112
+ const newOtp = [...otp];
1113
+ newOtp[index] = value;
1114
+ setOtp(newOtp);
1115
+ props.onChange && props.onChange(newOtp.join(""));
1116
+ if (value && index < length - 1) {
1117
+ inputRefs.current[index + 1]?.focus();
1118
+ }
1119
+ }
1120
+ };
1121
+ const handleKeyDown = (e, index) => {
1122
+ if (e.key === "Backspace" && !otp[index] && index > 0) {
1123
+ inputRefs.current[index - 1]?.focus();
1124
+ }
1125
+ };
1126
+ const handlePaste = (e) => {
1127
+ e.preventDefault();
1128
+ const pasteData = e.clipboardData.getData("text");
1129
+ if (/^\d+$/.test(pasteData)) {
1130
+ const newOtp = pasteData.split("").slice(0, length);
1131
+ setOtp(newOtp.concat(Array(length - newOtp.length).fill("")));
1132
+ props.onChange && props.onChange(newOtp.join(""));
1133
+ newOtp.forEach((_, idx) => {
1134
+ if (inputRefs.current[idx]) {
1135
+ inputRefs.current[idx]?.focus();
1136
+ }
1137
+ });
1138
+ }
1139
+ };
1140
+ (0, import_react30.useEffect)(() => {
1141
+ inputRefs.current[0]?.focus();
1142
+ }, []);
1143
+ return /* @__PURE__ */ import_react30.default.createElement("div", { className: props.containerClassName }, Array.from({ length }).map((_, index) => /* @__PURE__ */ import_react30.default.createElement(
1144
+ import_antd22.Input,
1145
+ {
1146
+ key: index,
1147
+ className: props.className,
1148
+ maxLength: 1,
1149
+ value: otp[index],
1150
+ onChange: (e) => handleChange(e, index),
1151
+ onKeyDown: (e) => handleKeyDown(e, index),
1152
+ onPaste: handlePaste,
1153
+ ref: (el) => inputRefs.current[index] = el
1154
+ }
1155
+ )));
1156
+ };
1157
+
1158
+ // src/Components/CircleDonut.tsx
1159
+ var import_react31 = __toESM(require("react"));
1160
+ var import_react_chartjs_2 = require("react-chartjs-2");
1161
+ var import_chart = require("chart.js");
1162
+ import_chart.Chart.register(import_chart.DoughnutController, import_chart.ArcElement, import_chart.Tooltip, import_chart.Legend);
1163
+ var CircleDonut = (props) => {
1164
+ const data = {
1165
+ labels: props.labels,
1166
+ datasets: [
1167
+ {
1168
+ label: "Bot Conversation",
1169
+ data: props.data,
1170
+ backgroundColor: [
1171
+ "#FFCB8A",
1172
+ "#CADBBF",
1173
+ "#8AC1BB",
1174
+ "#FCB0CB",
1175
+ "#CEB0FA"
1176
+ ],
1177
+ borderWidth: 0
1178
+ }
1179
+ ]
1180
+ };
1181
+ const options = {
1182
+ responsive: true,
1183
+ cutout: "80%",
1184
+ plugins: {
1185
+ legend: {
1186
+ position: "left",
1187
+ labels: {
1188
+ font: {
1189
+ size: 10
1190
+ },
1191
+ boxWidth: 15,
1192
+ generateLabels: (chart) => {
1193
+ const dataset = chart.data.datasets[0];
1194
+ return chart.data.labels.map((label, index) => {
1195
+ const value = dataset.data[index];
1196
+ return {
1197
+ text: `${label}: ${value}`,
1198
+ fillStyle: dataset.backgroundColor[index]
1199
+ };
1200
+ });
1201
+ }
1202
+ }
1203
+ },
1204
+ tooltip: {
1205
+ enabled: true,
1206
+ callbacks: {
1207
+ label: function(context) {
1208
+ const label = context.label || "";
1209
+ const value = context.raw || 0;
1210
+ return `${label}: ${value}`;
1211
+ }
1212
+ }
1213
+ }
1214
+ }
1215
+ };
1216
+ const centerTextPlugin = {
1217
+ id: "centerText",
1218
+ beforeDraw: (chart) => {
1219
+ const { ctx, chartArea: { left, right, top, bottom } } = chart;
1220
+ const width = right - left;
1221
+ const height = bottom - top;
1222
+ const centerX = left + width / 2;
1223
+ const centerY = top + height / 2;
1224
+ ctx.save();
1225
+ ctx.font = "7px Arial";
1226
+ ctx.fillStyle = "blue";
1227
+ ctx.textAlign = "center";
1228
+ ctx.textBaseline = "middle";
1229
+ ctx.fillText("Total Sessions", centerX, centerY - 10);
1230
+ ctx.font = "25px Arial";
1231
+ ctx.fillStyle = "black";
1232
+ ctx.fillText("85", centerX, centerY + 20);
1233
+ ctx.restore();
1234
+ }
1235
+ };
1236
+ return /* @__PURE__ */ import_react31.default.createElement("div", { className: props.className }, /* @__PURE__ */ import_react31.default.createElement("h1", { className: props.labelClassName }, props.label), /* @__PURE__ */ import_react31.default.createElement(import_react_chartjs_2.Doughnut, { data, options, plugins: [centerTextPlugin] }));
1237
+ };
1238
+
1239
+ // src/Components/SemiCircleDonut.tsx
1240
+ var import_react32 = __toESM(require("react"));
1241
+ var import_react_chartjs_22 = require("react-chartjs-2");
1242
+ var import_chart2 = require("chart.js");
1243
+ import_chart2.Chart.register(import_chart2.DoughnutController, import_chart2.ArcElement, import_chart2.Tooltip, import_chart2.Legend);
1244
+ var SemiCircleDonut = (props) => {
1245
+ const data = {
1246
+ labels: [
1247
+ "Registration",
1248
+ "Book Appointment",
1249
+ "Diagnostic Tests",
1250
+ "Hospital Facility",
1251
+ "Others, Prescriptions"
1252
+ ],
1253
+ datasets: [
1254
+ {
1255
+ label: "Bot Conversation",
1256
+ data: [30, 10, 27, 40, 12],
1257
+ backgroundColor: [
1258
+ "#FFCB8A",
1259
+ "#CADBBF",
1260
+ "#8AC1BB",
1261
+ "#FCB0CB",
1262
+ "#CEB0FA"
1263
+ ],
1264
+ borderWidth: 0
1265
+ }
1266
+ ]
1267
+ };
1268
+ const options = {
1269
+ responsive: true,
1270
+ circumference: 180,
1271
+ rotation: -90,
1272
+ cutout: "80%",
1273
+ plugins: {
1274
+ legend: {
1275
+ display: false
1276
+ // Disable the legend
1277
+ },
1278
+ tooltip: {
1279
+ enabled: true,
1280
+ callbacks: {
1281
+ label: function(context) {
1282
+ const label = context.label || "";
1283
+ const value = context.raw || 0;
1284
+ return `${label}: ${value}`;
1285
+ }
1286
+ }
1287
+ }
1288
+ }
1289
+ };
1290
+ const centerTextPlugin = {
1291
+ id: "centerText",
1292
+ beforeDraw: (chart) => {
1293
+ const { ctx, chartArea: { left, right, top, bottom } } = chart;
1294
+ const width = right - left;
1295
+ const height = bottom - top;
1296
+ const centerX = left + width / 2;
1297
+ const centerY = top + height / 1.5;
1298
+ const maxWidth = width * 0.8;
1299
+ ctx.save();
1300
+ ctx.fillStyle = "black";
1301
+ ctx.textAlign = "center";
1302
+ ctx.textBaseline = "middle";
1303
+ const drawText = (text, y, fontSize) => {
1304
+ ctx.font = `${fontSize}px Arial`;
1305
+ const textWidth = ctx.measureText(text).width;
1306
+ if (textWidth > maxWidth) {
1307
+ const newFontSize = fontSize * maxWidth / textWidth;
1308
+ ctx.font = `${newFontSize}px Arial`;
1309
+ }
1310
+ ctx.fillText(text, centerX, y);
1311
+ };
1312
+ drawText(props.fillText1, centerY - 10, 16);
1313
+ drawText(props.fillText2, centerY + 20, 8);
1314
+ ctx.restore();
1315
+ }
1316
+ };
1317
+ return /* @__PURE__ */ import_react32.default.createElement("div", { className: props.className }, /* @__PURE__ */ import_react32.default.createElement("h1", { className: props.labelClassName }, props.label), /* @__PURE__ */ import_react32.default.createElement(import_react_chartjs_22.Doughnut, { data, options, plugins: [centerTextPlugin] }));
1318
+ };
1319
+
1320
+ // src/Components/HorizontalBarChart.tsx
1321
+ var import_react33 = __toESM(require("react"));
1322
+ var import_react_chartjs_23 = require("react-chartjs-2");
1323
+ var import_chart3 = require("chart.js");
1324
+ import_chart3.Chart.register(import_chart3.BarElement, import_chart3.CategoryScale, import_chart3.LinearScale, import_chart3.Tooltip);
1325
+ var HorizontalBarChart = (props) => {
1326
+ const data = {
1327
+ labels: ["18-24", "25-34", "35-44", "45-54", "55-64", "65+"],
1328
+ datasets: [
1329
+ {
1330
+ data: [30, 10, 27, 40, 12, 24],
1331
+ backgroundColor: "#6298D5",
1332
+ barThickness: 15
1333
+ }
1334
+ ]
1335
+ };
1336
+ const options = {
1337
+ responsive: true,
1338
+ indexAxis: "y",
1339
+ scales: {
1340
+ x: {
1341
+ beginAtZero: true,
1342
+ ticks: {
1343
+ callback: function(value) {
1344
+ return `${value}%`;
1345
+ }
1346
+ }
1347
+ },
1348
+ y: {
1349
+ grid: {
1350
+ display: false
1351
+ }
1352
+ }
1353
+ },
1354
+ plugins: {
1355
+ tooltip: {
1356
+ enabled: true,
1357
+ callbacks: {
1358
+ label: function(context) {
1359
+ const label = context.label || "";
1360
+ const value = context.raw || 0;
1361
+ return `${label}: ${value}`;
1362
+ }
1363
+ }
1364
+ },
1365
+ legend: {
1366
+ display: false
1367
+ }
1368
+ }
1369
+ };
1370
+ return /* @__PURE__ */ import_react33.default.createElement("div", { className: props.className }, /* @__PURE__ */ import_react33.default.createElement("h1", { className: props.labelClassName }, props.label), /* @__PURE__ */ import_react33.default.createElement(import_react_chartjs_23.Bar, { data, options }));
1371
+ };
1372
+
1373
+ // src/Components/LineChart.tsx
1374
+ var import_react34 = __toESM(require("react"));
1375
+ var import_auto = __toESM(require("chart.js/auto"));
1376
+ var LineChart = (props) => {
1377
+ const chartRef = (0, import_react34.useRef)(null);
1378
+ const chartInstance = (0, import_react34.useRef)(null);
1379
+ const data = [
1380
+ { label: "ROI", data: [10, 13, 20, 15, 10] },
1381
+ { label: "Engagement Rate", data: [20, 23, 30, 28, 20] },
1382
+ { label: "Conversion Rate", data: [50, 100, 150, 180, 50] }
1383
+ ];
1384
+ const labels = ["Instagram", "Whatsapp", "Messages", "Telegram", "Linkedin"];
1385
+ (0, import_react34.useEffect)(() => {
1386
+ if (chartRef.current) {
1387
+ if (chartInstance.current) {
1388
+ chartInstance.current.destroy();
1389
+ }
1390
+ chartInstance.current = new import_auto.default(chartRef.current, {
1391
+ type: "line",
1392
+ data: {
1393
+ labels,
1394
+ datasets: data.map((dataset, index) => ({
1395
+ label: dataset.label,
1396
+ data: dataset.data,
1397
+ borderColor: index === 0 ? "#FF8F00" : index === 1 ? "#F50057" : "#254AAA",
1398
+ backgroundColor: "rgba(0, 0, 0, 0)",
1399
+ pointBackgroundColor: index === 0 ? "#FF8F00" : index === 1 ? "#F50057" : "#254AAA",
1400
+ pointBorderColor: "white",
1401
+ pointStyle: "circle",
1402
+ pointRadius: 3,
1403
+ tension: 0.1,
1404
+ fill: true
1405
+ }))
1406
+ },
1407
+ options: {
1408
+ plugins: {
1409
+ legend: {
1410
+ labels: {
1411
+ usePointStyle: true
1412
+ }
1413
+ }
1414
+ },
1415
+ scales: {
1416
+ x: {
1417
+ grid: {
1418
+ display: false
1419
+ }
1420
+ },
1421
+ y: {
1422
+ beginAtZero: true,
1423
+ suggestedMax: 200,
1424
+ ticks: {
1425
+ callback: function(value) {
1426
+ return value + "%";
1427
+ }
1428
+ },
1429
+ grid: {
1430
+ display: true
1431
+ }
1432
+ }
1433
+ }
1434
+ }
1435
+ });
1436
+ }
1437
+ return () => {
1438
+ if (chartInstance.current) {
1439
+ chartInstance.current.destroy();
1440
+ }
1441
+ };
1442
+ }, [labels, data]);
1443
+ return /* @__PURE__ */ import_react34.default.createElement("div", { className: props.className }, /* @__PURE__ */ import_react34.default.createElement("canvas", { ref: chartRef }));
1444
+ };
1445
+
1446
+ // src/Components/DoubleBarChart.tsx
1447
+ var import_react35 = __toESM(require("react"));
1448
+ var import_auto2 = __toESM(require("chart.js/auto"));
1449
+ var DoubleBarChart = (props) => {
1450
+ const chartRef = (0, import_react35.useRef)(null);
1451
+ const chartInstance = (0, import_react35.useRef)(null);
1452
+ (0, import_react35.useEffect)(() => {
1453
+ if (chartRef.current) {
1454
+ if (chartInstance.current) {
1455
+ chartInstance.current.destroy();
1456
+ }
1457
+ chartInstance.current = new import_auto2.default(chartRef.current, {
1458
+ type: "bar",
1459
+ data: {
1460
+ labels: [
1461
+ "Summer Health Tips",
1462
+ "New Services Launch",
1463
+ "Discounts on Checkups",
1464
+ "Wellness Webinar",
1465
+ "LinkedIn Insights"
1466
+ ],
1467
+ datasets: [
1468
+ {
1469
+ label: "Engagement Rate",
1470
+ data: [60, 70, 50, 80, 65],
1471
+ // Example data for male
1472
+ backgroundColor: "#93B8E2",
1473
+ barThickness: 10
1474
+ },
1475
+ {
1476
+ label: "Conversion Rate",
1477
+ data: [70, 65, 75, 55, 85],
1478
+ // Example data for female
1479
+ backgroundColor: "#4484CD",
1480
+ barThickness: 10
1481
+ }
1482
+ ]
1483
+ },
1484
+ options: {
1485
+ scales: {
1486
+ x: {
1487
+ grid: {
1488
+ display: false
1489
+ // Display x-axis grid lines
1490
+ }
1491
+ },
1492
+ y: {
1493
+ beginAtZero: true,
1494
+ suggestedMax: 100,
1495
+ ticks: {
1496
+ callback: function(value) {
1497
+ return value + "%";
1498
+ }
1499
+ },
1500
+ grid: {
1501
+ display: true
1502
+ }
1503
+ }
1504
+ },
1505
+ plugins: {
1506
+ legend: {
1507
+ labels: {
1508
+ usePointStyle: true
1509
+ }
1510
+ }
1511
+ }
1512
+ }
1513
+ });
1514
+ }
1515
+ return () => {
1516
+ if (chartInstance.current) {
1517
+ chartInstance.current.destroy();
1518
+ }
1519
+ };
1520
+ }, []);
1521
+ return /* @__PURE__ */ import_react35.default.createElement("div", { className: props.className }, /* @__PURE__ */ import_react35.default.createElement("h1", { className: props.labelClassName }, props.label), /* @__PURE__ */ import_react35.default.createElement("canvas", { ref: chartRef }));
1522
+ };
1523
+
1524
+ // src/Components/BarChart.tsx
1525
+ var import_react36 = __toESM(require("react"));
1526
+ var import_react_chartjs_24 = require("react-chartjs-2");
1527
+ var import_chart4 = require("chart.js");
1528
+ import_chart4.Chart.register(import_chart4.BarElement, import_chart4.CategoryScale, import_chart4.LinearScale, import_chart4.Tooltip);
1529
+ var BarChart = (props) => {
1530
+ const data = {
1531
+ labels: [
1532
+ "17 June",
1533
+ "18 June",
1534
+ "19 June",
1535
+ "20 June",
1536
+ "21 June",
1537
+ "22 June",
1538
+ "23 June"
1539
+ ],
1540
+ datasets: [
1541
+ {
1542
+ data: [30, 100, 270, 140, 120, 240],
1543
+ backgroundColor: "#1565C0",
1544
+ barThickness: 15
1545
+ }
1546
+ ]
1547
+ };
1548
+ const options = {
1549
+ responsive: true,
1550
+ scales: {
1551
+ x: {
1552
+ beginAtZero: true,
1553
+ grid: {
1554
+ display: false
1555
+ }
1556
+ },
1557
+ y: {
1558
+ grid: {
1559
+ display: true
1560
+ },
1561
+ ticks: {
1562
+ min: 0,
1563
+ max: 400,
1564
+ stepSize: 200,
1565
+ callback: function(value) {
1566
+ return `${value}`;
1567
+ }
1568
+ }
1569
+ }
1570
+ },
1571
+ plugins: {
1572
+ tooltip: {
1573
+ enabled: true,
1574
+ callbacks: {
1575
+ label: function(context) {
1576
+ const label = context.label || "";
1577
+ const value = context.raw || 0;
1578
+ return ` ${label}: ${value}`;
1579
+ }
1580
+ }
1581
+ },
1582
+ legend: {
1583
+ display: false
1584
+ }
1585
+ }
1586
+ };
1587
+ return /* @__PURE__ */ import_react36.default.createElement("div", { className: props.className }, /* @__PURE__ */ import_react36.default.createElement("h1", { className: props.labelClassName }, props.label), /* @__PURE__ */ import_react36.default.createElement(import_react_chartjs_24.Bar, { data, options }));
1588
+ };
923
1589
  // Annotate the CommonJS export names for ESM import in node:
924
1590
  0 && (module.exports = {
925
1591
  AddMoreTable,
1592
+ BarChart,
926
1593
  ButtonElement,
927
1594
  CheckboxElement,
1595
+ CircleDonut,
928
1596
  CkEditor,
929
1597
  DatePickerElement,
930
1598
  DateRangePickerElement,
1599
+ DoubleBarChart,
931
1600
  DropDownGroup,
932
1601
  FileUpload,
1602
+ HorizontalBarChart,
933
1603
  Image,
1604
+ LineChart,
934
1605
  MultipleSelectElement,
935
1606
  Navbar,
936
1607
  NumberElement,
1608
+ OtpElement,
937
1609
  PasswordElement,
938
1610
  RadioElement,
939
1611
  SelectElement,
1612
+ SemiCircleDonut,
940
1613
  Sidebar,
941
1614
  SingleCheckbox,
942
1615
  SingleSelectElement,
@@ -944,5 +1617,6 @@ var SwitchElement = () => /* @__PURE__ */ import_react28.default.createElement(i
944
1617
  TableElement,
945
1618
  TabsElement,
946
1619
  TextElement,
947
- TextareaElement
1620
+ TextareaElement,
1621
+ Upload
948
1622
  });