@carlonicora/nextjs-jsonapi 1.53.0 → 1.53.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"list-container.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list-container.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAehF"}
1
+ {"version":3,"file":"list-container.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list-container.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAqBhF"}
@@ -17,9 +17,15 @@ function generateListContainerTemplate(data) {
17
17
  return `"use client";
18
18
 
19
19
  import ${names.pascalCase}List from "@/features/${data.importTargetDir}/${names.kebabCase}/components/lists/${names.pascalCase}List";
20
+ import { RoundPageContainer } from "@carlonicora/nextjs-jsonapi/components";
21
+ import { Modules } from "@carlonicora/nextjs-jsonapi/core";
20
22
 
21
23
  function ${names.pascalCase}ListContainerInternal() {
22
- return <${names.pascalCase}List />;
24
+ return (
25
+ <RoundPageContainer module={Modules.${names.pascalCase}}>
26
+ <${names.pascalCase}List />
27
+ </RoundPageContainer>
28
+ );
23
29
  }
24
30
 
25
31
  export default function ${names.pascalCase}ListContainer() {
@@ -1 +1 @@
1
- {"version":3,"file":"list-container.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list-container.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,sEAeC;AArBD;;;;;GAKG;AACH,SAAgB,6BAA6B,CAAC,IAA0B;IACtE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO;;SAEA,KAAK,CAAC,UAAU,yBAAyB,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;;WAEnH,KAAK,CAAC,UAAU;YACf,KAAK,CAAC,UAAU;;;0BAGF,KAAK,CAAC,UAAU;YAC9B,KAAK,CAAC,UAAU;;CAE3B,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"list-container.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list-container.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,sEAqBC;AA3BD;;;;;GAKG;AACH,SAAgB,6BAA6B,CAAC,IAA0B;IACtE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO;;SAEA,KAAK,CAAC,UAAU,yBAAyB,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;;;;WAInH,KAAK,CAAC,UAAU;;0CAEe,KAAK,CAAC,UAAU;SACjD,KAAK,CAAC,UAAU;;;;;0BAKC,KAAK,CAAC,UAAU;YAC9B,KAAK,CAAC,UAAU;;CAE3B,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"multi-selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CA4JhF"}
1
+ {"version":3,"file":"multi-selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CA+JhF"}
@@ -15,7 +15,8 @@ exports.generateMultiSelectorTemplate = generateMultiSelectorTemplate;
15
15
  function generateMultiSelectorTemplate(data) {
16
16
  const { names, fields, extendsContent } = data;
17
17
  const hasNameField = extendsContent || fields.some((f) => f.name === "name");
18
- const displayProp = hasNameField ? "name" : "id";
18
+ const firstStringField = fields.find((f) => f.tsType === "string" || f.tsType === "string | null");
19
+ const displayProp = hasNameField ? "name" : (firstStringField?.name ?? "id");
19
20
  return `"use client";
20
21
 
21
22
  import { ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
@@ -25,11 +26,12 @@ import { FormFieldWrapper, MultipleSelector } from "@carlonicora/nextjs-jsonapi/
25
26
  import { Option } from "@carlonicora/nextjs-jsonapi/components";
26
27
  import { Modules } from "@carlonicora/nextjs-jsonapi/core";
27
28
  import { useCallback, useEffect, useMemo, useState } from "react";
29
+ import { useTranslations } from "next-intl";
28
30
  import { useWatch } from "react-hook-form";
29
31
 
30
32
  type ${names.pascalCase}MultiSelectType = {
31
33
  id: string;
32
- name: string;
34
+ ${displayProp}: string;
33
35
  };
34
36
 
35
37
  type ${names.pascalCase}MultiSelectorProps = {
@@ -57,6 +59,7 @@ export default function ${names.pascalCase}MultiSelector({
57
59
  maxCount = 3,
58
60
  isRequired = false,
59
61
  }: ${names.pascalCase}MultiSelectorProps) {
62
+ const t = useTranslations();
60
63
  const [${names.camelCase}Options, set${names.pascalCase}Options] = useState<${names.pascalCase}Option[]>([]);
61
64
  const [searchTerm, setSearchTerm] = useState<string>("");
62
65
 
@@ -123,7 +126,7 @@ export default function ${names.pascalCase}MultiSelector({
123
126
  // Convert to form format
124
127
  const formValues = options.map((option) => ({
125
128
  id: option.value,
126
- name: option.label,
129
+ ${displayProp}: option.label,
127
130
  }));
128
131
 
129
132
  form.setValue(id, formValues, { shouldDirty: true, shouldTouch: true });
@@ -159,7 +162,7 @@ export default function ${names.pascalCase}MultiSelector({
159
162
  hideClearAllButton
160
163
  onSearchSync={handleSearchSync}
161
164
  delay={0}
162
- emptyIndicator={<span className="text-muted-foreground">No results found</span>}
165
+ emptyIndicator={<span className="text-muted-foreground">{t("ui.search.no_results_generic")}</span>}
163
166
  />
164
167
  )}
165
168
  </FormFieldWrapper>
@@ -1 +1 @@
1
- {"version":3,"file":"multi-selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,sEA4JC;AAlKD;;;;;GAKG;AACH,SAAgB,6BAA6B,CAAC,IAA0B;IACtE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,YAAY,GAAG,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,OAAO;;WAEE,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAChH,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;OAQlH,KAAK,CAAC,UAAU;;;;;OAKhB,KAAK,CAAC,UAAU;;;WAGZ,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,UAAU;;;gBAGjC,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,UAAU;;;;;OAKhD,KAAK,CAAC,UAAU;IACnB,KAAK,CAAC,SAAS,UAAU,KAAK,CAAC,UAAU;;;0BAGnB,KAAK,CAAC,UAAU;;;WAG/B,KAAK,CAAC,UAAU;;;;;;KAMtB,KAAK,CAAC,UAAU;WACV,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,UAAU,uBAAuB,KAAK,CAAC,UAAU;;;kBAG9E,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,UAAU;;kCAEvB,KAAK,CAAC,UAAU;6BACrB,KAAK,CAAC,UAAU;;;sBAGvB,KAAK,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;cAsBxB,KAAK,CAAC,WAAW,mBAAmB,KAAK,CAAC,UAAU;sBAC5C,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,WAAW,YAAY,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS,kBAAkB,KAAK,CAAC,UAAU;;uBAE5H,KAAK,CAAC,UAAU,sBAAsB,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS;iBACtF,KAAK,CAAC,SAAS,IAAI,WAAW;iBAC9B,KAAK,CAAC,SAAS;UACtB,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,SAAS;;;;;8BAKnB,KAAK,CAAC,UAAU,sBAAsB,KAAK,CAAC,YAAY;mBACnE,KAAK,CAAC,SAAS,+BAA+B,KAAK,CAAC,SAAS;gBAChE,KAAK,CAAC,SAAS;mBACZ,KAAK,CAAC,SAAS,IAAI,WAAW;mBAC9B,KAAK,CAAC,SAAS;YACtB,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,SAAS,kBAAkB,KAAK,CAAC,UAAU;;;WAG1E,KAAK,CAAC,UAAU;;0BAED,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,YAAY;;;;qBAIpD,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS;eAChD,KAAK,CAAC,SAAS;eACf,KAAK,CAAC,SAAS,IAAI,WAAW;;gBAE7B,KAAK,CAAC,YAAY;;;;;;;;;;;;;;;kBAehB,KAAK,CAAC,SAAS,YAAY,KAAK,CAAC,SAAS;mBACzC,KAAK,CAAC,SAAS,WAAW,KAAK,CAAC,SAAS;;8BAE9B,KAAK,CAAC,UAAU;;;;;;;;aAQjC,KAAK,CAAC,SAAS;;;;;;;;;;uBAUL,KAAK,CAAC,SAAS;;;;;;;;;;;;;CAarC,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"multi-selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-page.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/list-page.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAsB3E"}
1
+ {"version":3,"file":"list-page.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/list-page.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAmB3E"}
@@ -16,7 +16,6 @@ function generateListPageTemplate(data) {
16
16
  const { names } = data;
17
17
  return `import ${names.pascalCase}ListContainer from "@/features/${data.importTargetDir}/${names.kebabCase}/components/containers/${names.pascalCase}ListContainer";
18
18
  import { ${names.pascalCase}Provider } from "@/features/${data.importTargetDir}/${names.kebabCase}/contexts/${names.pascalCase}Context";
19
- import { RoundPageContainer } from "@carlonicora/nextjs-jsonapi/components";
20
19
  import { Modules } from "@carlonicora/nextjs-jsonapi/core";
21
20
  import { Action } from "@carlonicora/nextjs-jsonapi/core";
22
21
  import { ServerSession } from "@carlonicora/nextjs-jsonapi/server";
@@ -26,9 +25,7 @@ export default async function ${names.pluralPascal}ListPage() {
26
25
 
27
26
  return (
28
27
  <${names.pascalCase}Provider>
29
- <RoundPageContainer module={Modules.${names.pascalCase}}>
30
- <${names.pascalCase}ListContainer />
31
- </RoundPageContainer>
28
+ <${names.pascalCase}ListContainer />
32
29
  </${names.pascalCase}Provider>
33
30
  );
34
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list-page.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/list-page.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,4DAsBC;AA5BD;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,IAA0B;IACjE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO,UAAU,KAAK,CAAC,UAAU,kCAAkC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,0BAA0B,KAAK,CAAC,UAAU;WAC3I,KAAK,CAAC,UAAU,+BAA+B,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,aAAa,KAAK,CAAC,UAAU;;;;;;gCAM9F,KAAK,CAAC,YAAY;0DACQ,KAAK,CAAC,UAAU;;;OAGnE,KAAK,CAAC,UAAU;4CACqB,KAAK,CAAC,UAAU;WACjD,KAAK,CAAC,UAAU;;QAEnB,KAAK,CAAC,UAAU;;;CAGvB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"list-page.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/list-page.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,4DAmBC;AAzBD;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,IAA0B;IACjE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO,UAAU,KAAK,CAAC,UAAU,kCAAkC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,0BAA0B,KAAK,CAAC,UAAU;WAC3I,KAAK,CAAC,UAAU,+BAA+B,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,aAAa,KAAK,CAAC,UAAU;;;;;gCAK9F,KAAK,CAAC,YAAY;0DACQ,KAAK,CAAC,UAAU;;;OAGnE,KAAK,CAAC,UAAU;SACd,KAAK,CAAC,UAAU;QACjB,KAAK,CAAC,UAAU;;;CAGvB,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nextjs-jsonapi",
3
- "version": "1.53.0",
3
+ "version": "1.53.1",
4
4
  "description": "Next.js JSON:API client with server/client support and caching",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",
@@ -56,7 +56,7 @@
56
56
  },
57
57
  "scripts": {
58
58
  "build": "NODE_OPTIONS='--max-old-space-size=8192' tsup && tsc -p scripts/generate-web-module/tsconfig.json",
59
- "dev": "NODE_OPTIONS='--max-old-space-size=8192' tsup --watch --no-dts",
59
+ "dev": "NODE_OPTIONS='--max-old-space-size=8192' tsup --watch",
60
60
  "clean": "rm -rf dist",
61
61
  "lint": "eslint \"src/**/*.ts\" \"src/**/*.tsx\" --fix",
62
62
  "format": "prettier --write \"src/**/*.ts\"",
@@ -18,9 +18,15 @@ export function generateListContainerTemplate(data: FrontendTemplateData): strin
18
18
  return `"use client";
19
19
 
20
20
  import ${names.pascalCase}List from "@/features/${data.importTargetDir}/${names.kebabCase}/components/lists/${names.pascalCase}List";
21
+ import { RoundPageContainer } from "@carlonicora/nextjs-jsonapi/components";
22
+ import { Modules } from "@carlonicora/nextjs-jsonapi/core";
21
23
 
22
24
  function ${names.pascalCase}ListContainerInternal() {
23
- return <${names.pascalCase}List />;
25
+ return (
26
+ <RoundPageContainer module={Modules.${names.pascalCase}}>
27
+ <${names.pascalCase}List />
28
+ </RoundPageContainer>
29
+ );
24
30
  }
25
31
 
26
32
  export default function ${names.pascalCase}ListContainer() {
@@ -15,7 +15,8 @@ import { FrontendTemplateData } from "../../types/template-data.interface";
15
15
  export function generateMultiSelectorTemplate(data: FrontendTemplateData): string {
16
16
  const { names, fields, extendsContent } = data;
17
17
  const hasNameField = extendsContent || fields.some((f) => f.name === "name");
18
- const displayProp = hasNameField ? "name" : "id";
18
+ const firstStringField = fields.find((f) => f.tsType === "string" || f.tsType === "string | null");
19
+ const displayProp = hasNameField ? "name" : (firstStringField?.name ?? "id");
19
20
 
20
21
  return `"use client";
21
22
 
@@ -26,11 +27,12 @@ import { FormFieldWrapper, MultipleSelector } from "@carlonicora/nextjs-jsonapi/
26
27
  import { Option } from "@carlonicora/nextjs-jsonapi/components";
27
28
  import { Modules } from "@carlonicora/nextjs-jsonapi/core";
28
29
  import { useCallback, useEffect, useMemo, useState } from "react";
30
+ import { useTranslations } from "next-intl";
29
31
  import { useWatch } from "react-hook-form";
30
32
 
31
33
  type ${names.pascalCase}MultiSelectType = {
32
34
  id: string;
33
- name: string;
35
+ ${displayProp}: string;
34
36
  };
35
37
 
36
38
  type ${names.pascalCase}MultiSelectorProps = {
@@ -58,6 +60,7 @@ export default function ${names.pascalCase}MultiSelector({
58
60
  maxCount = 3,
59
61
  isRequired = false,
60
62
  }: ${names.pascalCase}MultiSelectorProps) {
63
+ const t = useTranslations();
61
64
  const [${names.camelCase}Options, set${names.pascalCase}Options] = useState<${names.pascalCase}Option[]>([]);
62
65
  const [searchTerm, setSearchTerm] = useState<string>("");
63
66
 
@@ -124,7 +127,7 @@ export default function ${names.pascalCase}MultiSelector({
124
127
  // Convert to form format
125
128
  const formValues = options.map((option) => ({
126
129
  id: option.value,
127
- name: option.label,
130
+ ${displayProp}: option.label,
128
131
  }));
129
132
 
130
133
  form.setValue(id, formValues, { shouldDirty: true, shouldTouch: true });
@@ -160,7 +163,7 @@ export default function ${names.pascalCase}MultiSelector({
160
163
  hideClearAllButton
161
164
  onSearchSync={handleSearchSync}
162
165
  delay={0}
163
- emptyIndicator={<span className="text-muted-foreground">No results found</span>}
166
+ emptyIndicator={<span className="text-muted-foreground">{t("ui.search.no_results_generic")}</span>}
164
167
  />
165
168
  )}
166
169
  </FormFieldWrapper>
@@ -17,7 +17,6 @@ export function generateListPageTemplate(data: FrontendTemplateData): string {
17
17
 
18
18
  return `import ${names.pascalCase}ListContainer from "@/features/${data.importTargetDir}/${names.kebabCase}/components/containers/${names.pascalCase}ListContainer";
19
19
  import { ${names.pascalCase}Provider } from "@/features/${data.importTargetDir}/${names.kebabCase}/contexts/${names.pascalCase}Context";
20
- import { RoundPageContainer } from "@carlonicora/nextjs-jsonapi/components";
21
20
  import { Modules } from "@carlonicora/nextjs-jsonapi/core";
22
21
  import { Action } from "@carlonicora/nextjs-jsonapi/core";
23
22
  import { ServerSession } from "@carlonicora/nextjs-jsonapi/server";
@@ -27,9 +26,7 @@ export default async function ${names.pluralPascal}ListPage() {
27
26
 
28
27
  return (
29
28
  <${names.pascalCase}Provider>
30
- <RoundPageContainer module={Modules.${names.pascalCase}}>
31
- <${names.pascalCase}ListContainer />
32
- </RoundPageContainer>
29
+ <${names.pascalCase}ListContainer />
33
30
  </${names.pascalCase}Provider>
34
31
  );
35
32
  }