@sustaina/shared-ui 1.6.2 → 1.6.4

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