@sustaina/shared-ui 1.6.2 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1925,9 +1925,11 @@ var Navbar = ({
1925
1925
  subTitle,
1926
1926
  headImageURL = "",
1927
1927
  headImageURLClassName,
1928
+ tooltipContentClassName = "md:w-[350px] lg:w-[420px]",
1928
1929
  tooltipTitle,
1929
1930
  tooltipIcon,
1930
1931
  tooltipdescription = [],
1932
+ tooltipDescriptionWrapperClassName,
1931
1933
  mainButtonText,
1932
1934
  mainButtonClassName,
1933
1935
  mainButtonDisable = false,
@@ -1946,17 +1948,17 @@ var Navbar = ({
1946
1948
  "nav",
1947
1949
  {
1948
1950
  className: cn(
1949
- "py-5 px-8 w-full h-[5.3rem] bg-sus-primary-1 flex items-center justify-between",
1951
+ "py-3 px-8 w-full h-16 bg-sus-primary-1 flex items-center justify-between",
1950
1952
  className
1951
1953
  ),
1952
1954
  children: [
1953
1955
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
1954
- headImageURL !== "" ? /* @__PURE__ */ jsx("img", { src: headImageURL, alt: "", className: cn("w-full h-full", headImageURLClassName) }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
1955
- isValidElement(title) ? title : /* @__PURE__ */ jsx("h1", { className: "text-white text-4xl font-bold", children: title }),
1956
- isValidElement(subTitle) ? subTitle : /* @__PURE__ */ jsx("h1", { className: "text-white text-xl font-bold", children: subTitle })
1956
+ headImageURL !== "" ? /* @__PURE__ */ jsx("img", { src: headImageURL, alt: "", className: cn("w-full h-full", headImageURLClassName) }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
1957
+ isValidElement(title) ? title : /* @__PURE__ */ jsx("h1", { className: "text-white text-xl font-bold", children: title }),
1958
+ isValidElement(subTitle) ? subTitle : /* @__PURE__ */ jsx("h1", { className: "text-white text-sm font-semibold", children: subTitle })
1957
1959
  ] }),
1958
- tooltipTitle && /* @__PURE__ */ jsxs(Tooltip2, { children: [
1959
- /* @__PURE__ */ jsx(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ jsx("button", { className: "text-white hover:opacity-80 ", children: /* @__PURE__ */ jsx(InfoIcon_default, { className: "w-4" }) }) }),
1960
+ tooltipTitle && /* @__PURE__ */ jsxs(Tooltip2, { delayDuration: 700, children: [
1961
+ /* @__PURE__ */ jsx(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ jsx("button", { className: "text-white hover:opacity-80", children: /* @__PURE__ */ jsx(InfoIcon_default, { className: "w-4" }) }) }),
1960
1962
  /* @__PURE__ */ jsxs(
1961
1963
  TooltipContent2,
1962
1964
  {
@@ -1966,11 +1968,12 @@ var Navbar = ({
1966
1968
  align: "start",
1967
1969
  avoidCollisions: false,
1968
1970
  className: cn(
1969
- "bg-background text-foreground border border-black md:w-[350px] lg:w-[420px]",
1971
+ "bg-background text-foreground border border-black",
1970
1972
  "transition-all duration-150 ease-out origin-top",
1971
1973
  "data-[state=closed]:opacity-0 data-[state=open]:opacity-100",
1972
1974
  "data-[state=closed]:scale-95 data-[state=open]:scale-100",
1973
- { "mt-5": isDesktop }
1975
+ { "mt-5": isDesktop },
1976
+ tooltipContentClassName
1974
1977
  ),
1975
1978
  children: [
1976
1979
  /* @__PURE__ */ jsxs(
@@ -1978,7 +1981,10 @@ var Navbar = ({
1978
1981
  {
1979
1982
  role: "tooltip",
1980
1983
  "aria-label": tooltipTitle,
1981
- className: cn("flex flex-col gap-4 max-w-sm text-sm text-gray-700", className),
1984
+ className: cn(
1985
+ "flex flex-col gap-4 max-w-sm text-sm text-gray-700",
1986
+ tooltipDescriptionWrapperClassName
1987
+ ),
1982
1988
  children: [
1983
1989
  tooltipTitle && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
1984
1990
  isValidElement(tooltipIcon) ? tooltipIcon : /* @__PURE__ */ jsx(Icon3, { size: 32, "aria-hidden": "true" }),
@@ -2083,6 +2089,7 @@ var ExpandCollapse_default = ExpandCollapse;
2083
2089
 
2084
2090
  // src/components/advanceSearch/operatorMap.ts
2085
2091
  var OPERATOR_MAP = {
2092
+ uuid: ["equals", "notEquals", "gt", "gte", "lt", "lte"],
2086
2093
  text: [
2087
2094
  "contains",
2088
2095
  "equals",
@@ -2112,22 +2119,30 @@ function firstOperatorFor(fields, fieldName) {
2112
2119
  const t3 = getFieldType(fields, fieldName);
2113
2120
  return OPERATOR_MAP[t3][0];
2114
2121
  }
2115
- function makeNewRow(fields) {
2116
- const first = fields[0];
2117
- const op = OPERATOR_MAP[first.type][0];
2122
+ function makeNewRow(field) {
2123
+ const op = OPERATOR_MAP[field.type][0];
2118
2124
  if (op === "between") {
2119
2125
  return {
2120
2126
  id: crypto.randomUUID(),
2121
- fieldName: first.name,
2127
+ fieldName: field.name,
2128
+ fieldType: field.type,
2122
2129
  operator: "between",
2123
2130
  value: "",
2124
- value2: ""
2131
+ value2: "",
2132
+ multiTableSearch: field.multiTableSearch
2125
2133
  };
2126
2134
  }
2127
- return { id: crypto.randomUUID(), fieldName: first.name, operator: op, value: "" };
2135
+ return {
2136
+ id: crypto.randomUUID(),
2137
+ fieldName: field.name,
2138
+ fieldType: field.type,
2139
+ operator: op,
2140
+ value: "",
2141
+ multiTableSearch: field.multiTableSearch
2142
+ };
2128
2143
  }
2129
2144
  function useAdvanceSearch({ fields, limitRows }) {
2130
- const [rows, setRows] = useState([makeNewRow(fields)]);
2145
+ const [rows, setRows] = useState([makeNewRow(fields[0])]);
2131
2146
  const updateRows = useCallback((next) => {
2132
2147
  setRows(next);
2133
2148
  }, []);
@@ -2140,7 +2155,7 @@ function useAdvanceSearch({ fields, limitRows }) {
2140
2155
  );
2141
2156
  const addRow = useCallback(() => {
2142
2157
  if (!limitRows || rows.length < limitRows) {
2143
- updateRows([...rows, makeNewRow(fields)]);
2158
+ updateRows([...rows, makeNewRow(fields[0])]);
2144
2159
  }
2145
2160
  }, [rows, fields, updateRows, limitRows]);
2146
2161
  const removeRow = useCallback(
@@ -2156,22 +2171,29 @@ function useAdvanceSearch({ fields, limitRows }) {
2156
2171
  rows.map((r2) => {
2157
2172
  if (r2.id !== id) return r2;
2158
2173
  const nextOp = firstOperatorFor(fields, r2.fieldName);
2159
- return nextOp === "between" ? { id: r2.id, fieldName: r2.fieldName, operator: "between", value: "", value2: "" } : { id: r2.id, fieldName: r2.fieldName, operator: nextOp, value: "" };
2174
+ return nextOp === "between" ? {
2175
+ id: r2.id,
2176
+ fieldName: r2.fieldName,
2177
+ fieldType: r2.fieldType,
2178
+ operator: "between",
2179
+ value: "",
2180
+ value2: ""
2181
+ } : { id: r2.id, fieldName: r2.fieldName, fieldType: r2.fieldType, operator: nextOp, value: "" };
2160
2182
  })
2161
2183
  );
2162
2184
  },
2163
2185
  [rows, fields, updateRows]
2164
2186
  );
2165
2187
  const clearAllRow = useCallback(() => {
2166
- updateRows([makeNewRow(fields)]);
2188
+ updateRows([makeNewRow(fields[0])]);
2167
2189
  }, [fields, updateRows]);
2168
2190
  const changeField = useCallback(
2169
2191
  (id, fieldName) => {
2170
- const nextOp = firstOperatorFor(fields, fieldName);
2171
2192
  updateRows(
2172
2193
  rows.map((r2) => {
2173
2194
  if (r2.id !== id) return r2;
2174
- return nextOp === "between" ? { id: r2.id, fieldName, operator: "between", value: "", value2: "" } : { id: r2.id, fieldName, operator: nextOp, value: "" };
2195
+ const newRow = makeNewRow(fields.find((f) => f.name === fieldName) || fields[0]);
2196
+ return { ...newRow, id: r2.id };
2175
2197
  })
2176
2198
  );
2177
2199
  },
@@ -2183,9 +2205,24 @@ function useAdvanceSearch({ fields, limitRows }) {
2183
2205
  rows.map((r2) => {
2184
2206
  if (r2.id !== id) return r2;
2185
2207
  if (operator === "between") {
2186
- return { id: r2.id, fieldName: r2.fieldName, operator, value: "", value2: "" };
2208
+ return {
2209
+ id: r2.id,
2210
+ fieldName: r2.fieldName,
2211
+ fieldType: r2.fieldType,
2212
+ multiTableSearch: r2.multiTableSearch,
2213
+ operator,
2214
+ value: "",
2215
+ value2: ""
2216
+ };
2187
2217
  }
2188
- return { id: r2.id, fieldName: r2.fieldName, operator, value: "" };
2218
+ return {
2219
+ id: r2.id,
2220
+ fieldName: r2.fieldName,
2221
+ fieldType: r2.fieldType,
2222
+ multiTableSearch: r2.multiTableSearch,
2223
+ operator,
2224
+ value: ""
2225
+ };
2189
2226
  })
2190
2227
  );
2191
2228
  },
@@ -2210,55 +2247,16 @@ function useAdvanceSearch({ fields, limitRows }) {
2210
2247
  })),
2211
2248
  [fields]
2212
2249
  );
2213
- const rowToFilter = (row) => {
2214
- switch (row.operator) {
2215
- case "between":
2216
- return {
2217
- [row.fieldName]: {
2218
- gte: row.value,
2219
- lte: row.value2
2220
- }
2221
- };
2222
- case "contains":
2223
- return { [row.fieldName]: { contains: row.value } };
2224
- case "beginsWith":
2225
- return { [row.fieldName]: { startsWith: row.value } };
2226
- case "endsWith":
2227
- return { [row.fieldName]: { endsWith: row.value } };
2228
- case "notEquals":
2229
- return { [row.fieldName]: { not: row.value } };
2230
- case "gt":
2231
- return { [row.fieldName]: { gt: row.value } };
2232
- case "gte":
2233
- return { [row.fieldName]: { gte: row.value } };
2234
- case "lt":
2235
- return { [row.fieldName]: { lt: row.value } };
2236
- case "lte":
2237
- return { [row.fieldName]: { lte: row.value } };
2238
- case "is":
2239
- return { [row.fieldName]: row.value };
2240
- case "isNot":
2241
- return { [row.fieldName]: { not: row.value } };
2242
- case "notContains":
2243
- return { [row.fieldName]: { not: { contains: row.value } } };
2244
- case "notBeginsWith":
2245
- return { [row.fieldName]: { not: { startsWith: row.value } } };
2246
- case "notEndsWith":
2247
- return { [row.fieldName]: { not: { endsWith: row.value } } };
2248
- case "containsAny":
2249
- return { [row.fieldName]: { hasSome: row.value.split(",") } };
2250
- case "containsAll":
2251
- return { [row.fieldName]: { hasEvery: row.value.split(",") } };
2252
- case "containsOnly":
2253
- return { [row.fieldName]: { equals: row.value.split(",") } };
2254
- default:
2255
- return { [row.fieldName]: row.value };
2256
- }
2257
- };
2258
- const buildParam = useMemo(() => {
2259
- const andConditions = rows.map((r2) => r2.value ? rowToFilter(r2) : null).filter(Boolean);
2260
- return { AND: andConditions };
2261
- }, [rows]);
2250
+ const buildFilter = useCallback(
2251
+ (prismaFilter, options) => {
2252
+ return options?.multiTableSearch ? {
2253
+ some: {
2254
+ value: { ...prismaFilter, ...options?.insensitive ? { mode: "insensitive" } : void 0 }
2255
+ }
2256
+ } : prismaFilter;
2257
+ },
2258
+ []
2259
+ );
2262
2260
  return {
2263
2261
  rows,
2264
2262
  addRow,
@@ -2270,7 +2268,7 @@ function useAdvanceSearch({ fields, limitRows }) {
2270
2268
  changeValue,
2271
2269
  operatorsForField,
2272
2270
  fieldOptions,
2273
- param: buildParam
2271
+ buildFilter
2274
2272
  };
2275
2273
  }
2276
2274
 
@@ -4796,7 +4794,10 @@ var AdvanceSearch = ({
4796
4794
  onSearch,
4797
4795
  onClear
4798
4796
  }) => {
4799
- const fieldsData = useMemo(() => fields || [], [fields]);
4797
+ const fieldsData = useMemo(() => {
4798
+ if (fields.length === 0) throw new Error("fields cannot be an empty array");
4799
+ return fields || [];
4800
+ }, [fields]);
4800
4801
  const {
4801
4802
  rows,
4802
4803
  addRow,
@@ -4806,7 +4807,8 @@ var AdvanceSearch = ({
4806
4807
  changeField,
4807
4808
  changeOperator,
4808
4809
  operatorsForField,
4809
- fieldOptions
4810
+ fieldOptions,
4811
+ buildFilter
4810
4812
  } = useAdvanceSearch({ fields: fieldsData, limitRows });
4811
4813
  const form = useForm({
4812
4814
  mode: "onSubmit",
@@ -4818,66 +4820,181 @@ var AdvanceSearch = ({
4818
4820
  const currentValues = getValues();
4819
4821
  const param = {
4820
4822
  AND: rows.map((r2) => {
4821
- const val1 = currentValues[`value_${r2.id}`];
4823
+ let val1 = currentValues[`value_${r2.id}`];
4822
4824
  const val2 = currentValues[`value2_${r2.id}`];
4823
4825
  if (r2.operator === "between") {
4824
4826
  if (!val1 || !val2) return null;
4827
+ const start = new Date(val1);
4828
+ start.setHours(0, 0, 0, 0);
4829
+ const end = new Date(val2);
4830
+ end.setHours(23, 59, 59, 59);
4825
4831
  return {
4826
4832
  [r2.fieldName]: {
4827
- gte: val1,
4828
- lte: val2
4833
+ gte: start.toISOString(),
4834
+ lt: end.toISOString()
4829
4835
  }
4830
4836
  };
4831
4837
  }
4832
4838
  if (!val1) return null;
4839
+ val1 = r2.fieldType === "number" ? Number(val1) : val1;
4833
4840
  switch (r2.operator) {
4834
4841
  case "contains":
4835
- return { [r2.fieldName]: { contains: val1 } };
4842
+ return {
4843
+ [r2.fieldName]: buildFilter(
4844
+ { contains: val1 },
4845
+ {
4846
+ multiTableSearch: r2.multiTableSearch,
4847
+ insensitive: true
4848
+ }
4849
+ )
4850
+ };
4836
4851
  case "beginsWith":
4837
- return { [r2.fieldName]: { startsWith: val1 } };
4852
+ return {
4853
+ [r2.fieldName]: buildFilter(
4854
+ { startsWith: val1 },
4855
+ {
4856
+ multiTableSearch: r2.multiTableSearch,
4857
+ insensitive: true
4858
+ }
4859
+ )
4860
+ };
4838
4861
  case "endsWith":
4839
- return { [r2.fieldName]: { endsWith: val1 } };
4862
+ return {
4863
+ [r2.fieldName]: buildFilter(
4864
+ { endsWith: val1 },
4865
+ {
4866
+ multiTableSearch: r2.multiTableSearch,
4867
+ insensitive: true
4868
+ }
4869
+ )
4870
+ };
4840
4871
  case "equals":
4841
- return { [r2.fieldName]: { equals: val1 } };
4872
+ return {
4873
+ [r2.fieldName]: buildFilter(
4874
+ { equals: val1 },
4875
+ {
4876
+ multiTableSearch: r2.multiTableSearch,
4877
+ insensitive: true
4878
+ }
4879
+ )
4880
+ };
4842
4881
  case "notEquals":
4843
- return { [r2.fieldName]: { not: val1 } };
4882
+ return {
4883
+ [r2.fieldName]: buildFilter(
4884
+ { not: val1 },
4885
+ {
4886
+ multiTableSearch: r2.multiTableSearch,
4887
+ insensitive: true
4888
+ }
4889
+ )
4890
+ };
4844
4891
  case "gt":
4845
- return { [r2.fieldName]: { gt: val1 } };
4892
+ return {
4893
+ [r2.fieldName]: buildFilter({ gt: val1 }, { multiTableSearch: r2.multiTableSearch })
4894
+ };
4846
4895
  case "gte":
4847
- return { [r2.fieldName]: { gte: val1 } };
4896
+ return {
4897
+ [r2.fieldName]: buildFilter({ gte: val1 }, { multiTableSearch: r2.multiTableSearch })
4898
+ };
4848
4899
  case "lt":
4849
- return { [r2.fieldName]: { lt: val1 } };
4900
+ return {
4901
+ [r2.fieldName]: buildFilter({ lt: val1 }, { multiTableSearch: r2.multiTableSearch })
4902
+ };
4850
4903
  case "lte":
4851
- return { [r2.fieldName]: { lte: val1 } };
4904
+ return {
4905
+ [r2.fieldName]: buildFilter({ lte: val1 }, { multiTableSearch: r2.multiTableSearch })
4906
+ };
4852
4907
  case "is":
4853
4908
  return { [r2.fieldName]: val1 };
4854
4909
  case "isNot":
4855
4910
  return { [r2.fieldName]: { not: val1 } };
4856
4911
  case "notContains":
4857
- return { [r2.fieldName]: { not: { contains: val1 } } };
4912
+ return {
4913
+ [r2.fieldName]: buildFilter(
4914
+ { not: { contains: val1 } },
4915
+ {
4916
+ multiTableSearch: r2.multiTableSearch,
4917
+ insensitive: true
4918
+ }
4919
+ )
4920
+ };
4858
4921
  case "notBeginsWith":
4859
- return { [r2.fieldName]: { not: { startsWith: val1 } } };
4922
+ return {
4923
+ [r2.fieldName]: buildFilter(
4924
+ { not: { startsWith: val1 } },
4925
+ {
4926
+ multiTableSearch: r2.multiTableSearch,
4927
+ insensitive: true
4928
+ }
4929
+ )
4930
+ };
4860
4931
  case "notEndsWith":
4861
- return { [r2.fieldName]: { not: { endsWith: val1 } } };
4932
+ return {
4933
+ [r2.fieldName]: buildFilter(
4934
+ { not: { endsWith: val1 } },
4935
+ {
4936
+ multiTableSearch: r2.multiTableSearch,
4937
+ insensitive: true
4938
+ }
4939
+ )
4940
+ };
4862
4941
  case "containsAny":
4863
- return { [r2.fieldName]: { hasSome: String(val1).split(",") } };
4942
+ return {
4943
+ [r2.fieldName]: buildFilter(
4944
+ { hasSome: String(val1).split(",") },
4945
+ { multiTableSearch: r2.multiTableSearch }
4946
+ )
4947
+ };
4864
4948
  case "containsAll":
4865
- return { [r2.fieldName]: { hasEvery: String(val1).split(",") } };
4949
+ return {
4950
+ [r2.fieldName]: buildFilter(
4951
+ { hasEvery: String(val1).split(",") },
4952
+ { multiTableSearch: r2.multiTableSearch }
4953
+ )
4954
+ };
4866
4955
  case "containsOnly":
4867
- return { [r2.fieldName]: { equals: String(val1).split(",") } };
4868
- case "on":
4869
- return { [r2.fieldName]: { on: val1 } };
4956
+ return {
4957
+ [r2.fieldName]: buildFilter(
4958
+ { equals: String(val1).split(",") },
4959
+ {
4960
+ multiTableSearch: r2.multiTableSearch,
4961
+ insensitive: true
4962
+ }
4963
+ )
4964
+ };
4965
+ case "on": {
4966
+ const start = new Date(val1);
4967
+ start.setHours(0, 0, 0, 0);
4968
+ const end = new Date(val1);
4969
+ end.setHours(23, 59, 59, 59);
4970
+ return {
4971
+ [r2.fieldName]: buildFilter(
4972
+ { gte: start.toISOString(), lt: end.toISOString() },
4973
+ { multiTableSearch: r2.multiTableSearch }
4974
+ )
4975
+ };
4976
+ }
4870
4977
  case "after":
4871
- return { [r2.fieldName]: { after: val1 } };
4978
+ return {
4979
+ [r2.fieldName]: buildFilter(
4980
+ { gte: new Date(val1).toISOString() },
4981
+ { multiTableSearch: r2.multiTableSearch }
4982
+ )
4983
+ };
4872
4984
  case "before":
4873
- return { [r2.fieldName]: { before: val1 } };
4985
+ return {
4986
+ [r2.fieldName]: buildFilter(
4987
+ { lt: new Date(val1).toISOString() },
4988
+ { multiTableSearch: r2.multiTableSearch }
4989
+ )
4990
+ };
4874
4991
  }
4875
4992
  }).filter(Boolean)
4876
4993
  };
4877
4994
  if (onSearch) {
4878
4995
  onSearch(param);
4879
4996
  }
4880
- }, [getValues, rows, onSearch]);
4997
+ }, [buildFilter, getValues, rows, onSearch]);
4881
4998
  return /* @__PURE__ */ jsx(
4882
4999
  ExpandCollapse_default,
4883
5000
  {