@contentful/field-editor-shared 2.12.3 → 2.13.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.
Files changed (33) hide show
  1. package/dist/cjs/ReleaseEntityStatusBadge/ReleaseEntityStatusPopover.js +5 -14
  2. package/dist/cjs/ReleaseEntityStatusBadge/constants.js +7 -0
  3. package/dist/cjs/hooks/useLocalePublishStatus.js +7 -22
  4. package/dist/cjs/hooks/useReleaseStatus.js +137 -0
  5. package/dist/cjs/hooks/{useActiveReleaseLocalesStatuses.spec.js → useReleaseStatus.spec.js} +91 -99
  6. package/dist/cjs/index.js +1 -2
  7. package/dist/cjs/utils/sanitizeLocales.js +20 -0
  8. package/dist/esm/ReleaseEntityStatusBadge/ReleaseEntityStatusPopover.js +6 -15
  9. package/dist/esm/ReleaseEntityStatusBadge/constants.js +7 -0
  10. package/dist/esm/hooks/useLocalePublishStatus.js +7 -22
  11. package/dist/esm/hooks/useReleaseStatus.js +127 -0
  12. package/dist/esm/hooks/{useActiveReleaseLocalesStatuses.spec.js → useReleaseStatus.spec.js} +91 -99
  13. package/dist/esm/index.js +1 -2
  14. package/dist/esm/utils/sanitizeLocales.js +10 -0
  15. package/dist/types/ReleaseEntityStatusBadge/ReleaseEntityStatusLocalesList.d.ts +2 -2
  16. package/dist/types/ReleaseEntityStatusBadge/ReleaseEntityStatusPopover.d.ts +3 -3
  17. package/dist/types/ReleaseEntityStatusBadge/constants.d.ts +7 -0
  18. package/dist/types/hooks/useLocalePublishStatus.d.ts +4 -2
  19. package/dist/types/hooks/useReleaseStatus.d.ts +14 -0
  20. package/dist/types/index.d.ts +1 -2
  21. package/dist/types/types.d.ts +3 -3
  22. package/dist/types/utils/sanitizeLocales.d.ts +4 -0
  23. package/package.json +3 -3
  24. package/dist/cjs/hooks/useActiveReleaseLocalesStatuses.js +0 -112
  25. package/dist/cjs/utils/getPreviousReleaseEntity.js +0 -32
  26. package/dist/cjs/utils/parseReleaseParameters.js +0 -42
  27. package/dist/esm/hooks/useActiveReleaseLocalesStatuses.js +0 -102
  28. package/dist/esm/utils/getPreviousReleaseEntity.js +0 -22
  29. package/dist/esm/utils/parseReleaseParameters.js +0 -32
  30. package/dist/types/hooks/useActiveReleaseLocalesStatuses.d.ts +0 -14
  31. package/dist/types/utils/getPreviousReleaseEntity.d.ts +0 -12
  32. package/dist/types/utils/parseReleaseParameters.d.ts +0 -11
  33. /package/dist/types/hooks/{useActiveReleaseLocalesStatuses.spec.d.ts → useReleaseStatus.spec.d.ts} +0 -0
@@ -0,0 +1,14 @@
1
+ import type { LocalesAPI } from '@contentful/app-sdk';
2
+ import type { AssetProps, EntryProps, LocaleProps, ReleaseProps } from 'contentful-management/types';
3
+ import type { ReleaseAction, ReleaseV2Props, ReleaseStatusMap } from '../types';
4
+ type UseActiveReleaseLocalesStatuses = {
5
+ entity?: EntryProps | AssetProps;
6
+ locales: LocaleProps[] | LocalesAPI;
7
+ release?: ReleaseProps | ReleaseV2Props;
8
+ previousEntityOnTimeline?: EntryProps | AssetProps;
9
+ };
10
+ export declare function useReleaseStatus({ entity, release, locales, previousEntityOnTimeline, }: UseActiveReleaseLocalesStatuses): {
11
+ releaseStatusMap: ReleaseStatusMap;
12
+ releaseAction: ReleaseAction | undefined;
13
+ };
14
+ export {};
@@ -15,10 +15,9 @@ export { shortenStorageUnit, toLocaleString } from './utils/shortenStorageUnit';
15
15
  export type { FieldConnectorChildProps } from './FieldConnector';
16
16
  export * from './types';
17
17
  export * from './hooks/useActiveLocales';
18
- export * from './hooks/useActiveReleaseLocalesStatuses';
18
+ export * from './hooks/useReleaseStatus';
19
19
  export * from './hooks/useLocalePublishStatus';
20
20
  export * from './LocalePublishingEntityStatusBadge';
21
21
  export * from './ReleaseEntityStatusBadge';
22
22
  export * from './utils/determineReleaseAction';
23
23
  export * from './utils/getEntityReleaseStatus';
24
- export * from './utils/parseReleaseParameters';
@@ -59,11 +59,11 @@ export type ReleaseV2Props = Omit<ReleaseProps, 'entities' | 'sys'> & {
59
59
  metadata?: ReleaseMetadataV2;
60
60
  };
61
61
  export type ReleaseAction = 'publish' | 'unpublish' | 'not-in-release';
62
- export type ReleaseEntityStatus = 'willPublish' | 'becomesDraft' | 'remainsDraft' | 'notInRelease';
62
+ export type ReleaseEntityStatus = 'willPublish' | 'becomesDraft' | 'remainsDraft' | 'notInRelease' | 'published';
63
63
  export type ReleaseLocalesStatus = {
64
64
  status: ReleaseEntityStatus;
65
65
  variant: BadgeVariant;
66
66
  label: string;
67
- locale: LocaleProps;
67
+ locale: Pick<LocaleProps, 'code' | 'default' | 'name'>;
68
68
  };
69
- export type ReleaseLocalesStatusMap = Map<string, ReleaseLocalesStatus>;
69
+ export type ReleaseStatusMap = Map<string, ReleaseLocalesStatus>;
@@ -0,0 +1,4 @@
1
+ import type { LocalesAPI } from '@contentful/app-sdk';
2
+ import type { LocaleProps } from 'contentful-management';
3
+ export type SanitizedLocale = Pick<LocaleProps, 'code' | 'default' | 'name'>;
4
+ export declare function sanitizeLocales(locales: Pick<LocalesAPI, 'available' | 'default' | 'names'> | LocaleProps[]): SanitizedLocale[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/field-editor-shared",
3
- "version": "2.12.3",
3
+ "version": "2.13.1",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "types": "dist/types/index.d.ts",
@@ -36,7 +36,7 @@
36
36
  "tsc": "tsc -p ./ --noEmit"
37
37
  },
38
38
  "devDependencies": {
39
- "@contentful/app-sdk": "^4.29.0",
39
+ "@contentful/app-sdk": "^4.42.0",
40
40
  "@contentful/field-editor-test-utils": "^1.6.2",
41
41
  "@lingui/core": "5.3.0",
42
42
  "@testing-library/react": "16.3.0"
@@ -58,5 +58,5 @@
58
58
  "publishConfig": {
59
59
  "registry": "https://npm.pkg.github.com/"
60
60
  },
61
- "gitHead": "72fc78dc2c8b5431b6740852965a1ce3ccb4c997"
61
+ "gitHead": "5a7e41aa7b9bbd285221f164daa777fb48cbdb01"
62
62
  }
@@ -1,112 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "useActiveReleaseLocalesStatuses", {
6
- enumerable: true,
7
- get: function() {
8
- return useActiveReleaseLocalesStatuses;
9
- }
10
- });
11
- const _react = require("react");
12
- const _getPreviousReleaseEntity = require("../utils/getPreviousReleaseEntity");
13
- const useActiveReleaseLocalesStatuses = ({ currentEntityDraft, entityId, entityType, releaseVersionMap, locales, activeRelease, releases })=>{
14
- const previousReleaseEntity = (0, _react.useMemo)(()=>(0, _getPreviousReleaseEntity.getPreviousReleaseEntity)({
15
- entityId,
16
- entityType,
17
- releaseVersionMap,
18
- activeRelease,
19
- releases
20
- }).previousReleaseEntity, [
21
- entityId,
22
- entityType,
23
- releaseVersionMap,
24
- activeRelease,
25
- releases
26
- ]);
27
- const activeReleaseReleaseEntity = (0, _react.useMemo)(()=>activeRelease?.entities.items.find((entity)=>entity.entity.sys.id === entityId && entity.entity.sys.linkType === entityType), [
28
- activeRelease?.entities.items,
29
- entityId,
30
- entityType
31
- ]);
32
- const getLocaleStatus = (0, _react.useCallback)((localeCode)=>{
33
- if (!activeReleaseReleaseEntity) {
34
- return 'Not in release';
35
- }
36
- return activeReleaseReleaseEntity?.action === 'publish' || activeReleaseReleaseEntity?.add?.fields['*'].includes(localeCode) ? 'published' : 'draft';
37
- }, [
38
- activeReleaseReleaseEntity
39
- ]);
40
- const releaseLocalesStatusMap = (0, _react.useMemo)(()=>{
41
- return locales.reduce((acc, locale)=>{
42
- acc.set(locale.code, {
43
- variant: 'secondary',
44
- status: 'remainsDraft',
45
- label: 'Remains draft',
46
- locale
47
- });
48
- if (!activeReleaseReleaseEntity) {
49
- acc.set(locale.code, {
50
- variant: 'secondary',
51
- status: 'notInRelease',
52
- label: 'Not in release',
53
- locale
54
- });
55
- return acc;
56
- }
57
- if (getLocaleStatus(locale.code) === 'draft') {
58
- if (currentEntityDraft?.sys.fieldStatus) {
59
- const previousStatus = currentEntityDraft.sys.fieldStatus['*'][locale.code];
60
- if (previousStatus === 'published' || previousStatus === 'changed') {
61
- acc.set(locale.code, {
62
- status: 'becomesDraft',
63
- variant: 'warning',
64
- label: 'Becomes draft',
65
- locale
66
- });
67
- } else {
68
- acc.set(locale.code, {
69
- status: 'remainsDraft',
70
- variant: 'secondary',
71
- label: 'Remains draft',
72
- locale
73
- });
74
- }
75
- } else if (previousReleaseEntity) {
76
- if (previousReleaseEntity.action === 'publish' || previousReleaseEntity.add.fields['*'].includes(locale.code)) {
77
- acc.set(locale.code, {
78
- status: 'becomesDraft',
79
- variant: 'warning',
80
- label: 'Becomes draft',
81
- locale
82
- });
83
- } else {
84
- acc.set(locale.code, {
85
- status: 'remainsDraft',
86
- variant: 'secondary',
87
- label: 'Remains draft',
88
- locale
89
- });
90
- }
91
- }
92
- } else if (getLocaleStatus(locale.code) === 'published') {
93
- acc.set(locale.code, {
94
- variant: 'positive',
95
- status: 'willPublish',
96
- label: 'Will publish',
97
- locale
98
- });
99
- }
100
- return acc;
101
- }, new Map());
102
- }, [
103
- locales,
104
- activeReleaseReleaseEntity,
105
- getLocaleStatus,
106
- currentEntityDraft?.sys.fieldStatus,
107
- previousReleaseEntity
108
- ]);
109
- return {
110
- releaseLocalesStatusMap
111
- };
112
- };
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "getPreviousReleaseEntity", {
6
- enumerable: true,
7
- get: function() {
8
- return getPreviousReleaseEntity;
9
- }
10
- });
11
- const _datefns = require("date-fns");
12
- function getPreviousReleaseEntity({ entityId, entityType, releaseVersionMap, activeRelease, releases }) {
13
- const orderedScheduledReleases = releases?.items.filter((r)=>r.startDate).sort((a, b)=>(0, _datefns.compareAsc)(new Date(a.startDate), new Date(b.startDate)));
14
- const indexOfActive = orderedScheduledReleases?.findIndex((r)=>r.sys.id === activeRelease?.sys.id);
15
- let previousRelease;
16
- let previousReleaseEntity;
17
- if (indexOfActive && indexOfActive > 0) {
18
- for(let i = indexOfActive - 1; i >= 0; i--){
19
- const release = orderedScheduledReleases[i];
20
- const action = releaseVersionMap.get(entityId)?.get(release.sys.id);
21
- if (action !== 'not-in-release') {
22
- previousRelease = release;
23
- previousReleaseEntity = release.entities.items.find((e)=>e.entity.sys.id === entityId && e.entity.sys.linkType === entityType);
24
- break;
25
- }
26
- }
27
- }
28
- return {
29
- previousRelease,
30
- previousReleaseEntity
31
- };
32
- }
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "parseReleaseParams", {
6
- enumerable: true,
7
- get: function() {
8
- return parseReleaseParams;
9
- }
10
- });
11
- function parseReleaseParams(raw) {
12
- let parsedRaw;
13
- if (!raw) {
14
- return {
15
- releaseVersionMap: new Map(),
16
- locales: [],
17
- activeRelease: undefined,
18
- isActiveReleaseLoading: false,
19
- releases: undefined
20
- };
21
- }
22
- try {
23
- parsedRaw = JSON.parse(raw);
24
- } catch (e) {
25
- throw new Error('Failed to parse release parameters: invalid JSON');
26
- }
27
- const releaseVersionMap = new Map();
28
- for (const [entryId, innerObj] of Object.entries(parsedRaw.releaseVersionMap)){
29
- const innerMap = new Map();
30
- for (const [localeKey, actionData] of Object.entries(innerObj)){
31
- innerMap.set(localeKey, actionData);
32
- }
33
- releaseVersionMap.set(entryId, innerMap);
34
- }
35
- return {
36
- releaseVersionMap,
37
- locales: parsedRaw.locales,
38
- activeRelease: parsedRaw.activeRelease,
39
- isActiveReleaseLoading: parsedRaw.isActiveReleaseLoading,
40
- releases: parsedRaw.releases
41
- };
42
- }
@@ -1,102 +0,0 @@
1
- import { useCallback, useMemo } from 'react';
2
- import { getPreviousReleaseEntity } from '../utils/getPreviousReleaseEntity';
3
- export const useActiveReleaseLocalesStatuses = ({ currentEntityDraft, entityId, entityType, releaseVersionMap, locales, activeRelease, releases })=>{
4
- const previousReleaseEntity = useMemo(()=>getPreviousReleaseEntity({
5
- entityId,
6
- entityType,
7
- releaseVersionMap,
8
- activeRelease,
9
- releases
10
- }).previousReleaseEntity, [
11
- entityId,
12
- entityType,
13
- releaseVersionMap,
14
- activeRelease,
15
- releases
16
- ]);
17
- const activeReleaseReleaseEntity = useMemo(()=>activeRelease?.entities.items.find((entity)=>entity.entity.sys.id === entityId && entity.entity.sys.linkType === entityType), [
18
- activeRelease?.entities.items,
19
- entityId,
20
- entityType
21
- ]);
22
- const getLocaleStatus = useCallback((localeCode)=>{
23
- if (!activeReleaseReleaseEntity) {
24
- return 'Not in release';
25
- }
26
- return activeReleaseReleaseEntity?.action === 'publish' || activeReleaseReleaseEntity?.add?.fields['*'].includes(localeCode) ? 'published' : 'draft';
27
- }, [
28
- activeReleaseReleaseEntity
29
- ]);
30
- const releaseLocalesStatusMap = useMemo(()=>{
31
- return locales.reduce((acc, locale)=>{
32
- acc.set(locale.code, {
33
- variant: 'secondary',
34
- status: 'remainsDraft',
35
- label: 'Remains draft',
36
- locale
37
- });
38
- if (!activeReleaseReleaseEntity) {
39
- acc.set(locale.code, {
40
- variant: 'secondary',
41
- status: 'notInRelease',
42
- label: 'Not in release',
43
- locale
44
- });
45
- return acc;
46
- }
47
- if (getLocaleStatus(locale.code) === 'draft') {
48
- if (currentEntityDraft?.sys.fieldStatus) {
49
- const previousStatus = currentEntityDraft.sys.fieldStatus['*'][locale.code];
50
- if (previousStatus === 'published' || previousStatus === 'changed') {
51
- acc.set(locale.code, {
52
- status: 'becomesDraft',
53
- variant: 'warning',
54
- label: 'Becomes draft',
55
- locale
56
- });
57
- } else {
58
- acc.set(locale.code, {
59
- status: 'remainsDraft',
60
- variant: 'secondary',
61
- label: 'Remains draft',
62
- locale
63
- });
64
- }
65
- } else if (previousReleaseEntity) {
66
- if (previousReleaseEntity.action === 'publish' || previousReleaseEntity.add.fields['*'].includes(locale.code)) {
67
- acc.set(locale.code, {
68
- status: 'becomesDraft',
69
- variant: 'warning',
70
- label: 'Becomes draft',
71
- locale
72
- });
73
- } else {
74
- acc.set(locale.code, {
75
- status: 'remainsDraft',
76
- variant: 'secondary',
77
- label: 'Remains draft',
78
- locale
79
- });
80
- }
81
- }
82
- } else if (getLocaleStatus(locale.code) === 'published') {
83
- acc.set(locale.code, {
84
- variant: 'positive',
85
- status: 'willPublish',
86
- label: 'Will publish',
87
- locale
88
- });
89
- }
90
- return acc;
91
- }, new Map());
92
- }, [
93
- locales,
94
- activeReleaseReleaseEntity,
95
- getLocaleStatus,
96
- currentEntityDraft?.sys.fieldStatus,
97
- previousReleaseEntity
98
- ]);
99
- return {
100
- releaseLocalesStatusMap
101
- };
102
- };
@@ -1,22 +0,0 @@
1
- import { compareAsc } from 'date-fns';
2
- export function getPreviousReleaseEntity({ entityId, entityType, releaseVersionMap, activeRelease, releases }) {
3
- const orderedScheduledReleases = releases?.items.filter((r)=>r.startDate).sort((a, b)=>compareAsc(new Date(a.startDate), new Date(b.startDate)));
4
- const indexOfActive = orderedScheduledReleases?.findIndex((r)=>r.sys.id === activeRelease?.sys.id);
5
- let previousRelease;
6
- let previousReleaseEntity;
7
- if (indexOfActive && indexOfActive > 0) {
8
- for(let i = indexOfActive - 1; i >= 0; i--){
9
- const release = orderedScheduledReleases[i];
10
- const action = releaseVersionMap.get(entityId)?.get(release.sys.id);
11
- if (action !== 'not-in-release') {
12
- previousRelease = release;
13
- previousReleaseEntity = release.entities.items.find((e)=>e.entity.sys.id === entityId && e.entity.sys.linkType === entityType);
14
- break;
15
- }
16
- }
17
- }
18
- return {
19
- previousRelease,
20
- previousReleaseEntity
21
- };
22
- }
@@ -1,32 +0,0 @@
1
- export function parseReleaseParams(raw) {
2
- let parsedRaw;
3
- if (!raw) {
4
- return {
5
- releaseVersionMap: new Map(),
6
- locales: [],
7
- activeRelease: undefined,
8
- isActiveReleaseLoading: false,
9
- releases: undefined
10
- };
11
- }
12
- try {
13
- parsedRaw = JSON.parse(raw);
14
- } catch (e) {
15
- throw new Error('Failed to parse release parameters: invalid JSON');
16
- }
17
- const releaseVersionMap = new Map();
18
- for (const [entryId, innerObj] of Object.entries(parsedRaw.releaseVersionMap)){
19
- const innerMap = new Map();
20
- for (const [localeKey, actionData] of Object.entries(innerObj)){
21
- innerMap.set(localeKey, actionData);
22
- }
23
- releaseVersionMap.set(entryId, innerMap);
24
- }
25
- return {
26
- releaseVersionMap,
27
- locales: parsedRaw.locales,
28
- activeRelease: parsedRaw.activeRelease,
29
- isActiveReleaseLoading: parsedRaw.isActiveReleaseLoading,
30
- releases: parsedRaw.releases
31
- };
32
- }
@@ -1,14 +0,0 @@
1
- import type { ReleaseAction, ReleaseLocalesStatusMap } from '@contentful/field-editor-shared';
2
- import type { AssetProps, CollectionProp, EntryProps, LocaleProps } from 'contentful-management/types';
3
- import type { ReleaseV2Props } from '../types';
4
- export declare const useActiveReleaseLocalesStatuses: ({ currentEntityDraft, entityId, entityType, releaseVersionMap, locales, activeRelease, releases, }: {
5
- currentEntityDraft: EntryProps | AssetProps;
6
- entityId: string;
7
- entityType: 'Entry' | 'Asset';
8
- releaseVersionMap: Map<string, Map<string, ReleaseAction>>;
9
- locales: LocaleProps[];
10
- activeRelease: ReleaseV2Props | undefined;
11
- releases: CollectionProp<ReleaseV2Props> | undefined;
12
- }) => {
13
- releaseLocalesStatusMap: ReleaseLocalesStatusMap;
14
- };
@@ -1,12 +0,0 @@
1
- import type { CollectionProp } from 'contentful-management/types';
2
- import type { ReleaseAction, ReleaseV2Entity, ReleaseV2EntityWithLocales, ReleaseV2Props } from '../types';
3
- export declare function getPreviousReleaseEntity({ entityId, entityType, releaseVersionMap, activeRelease, releases, }: {
4
- entityId: string;
5
- entityType: 'Entry' | 'Asset';
6
- releaseVersionMap: Map<string, Map<string, ReleaseAction>>;
7
- activeRelease: ReleaseV2Props | undefined;
8
- releases: CollectionProp<ReleaseV2Props> | undefined;
9
- }): {
10
- previousReleaseEntity: ReleaseV2Entity | ReleaseV2EntityWithLocales | undefined;
11
- previousRelease: ReleaseV2Props | undefined;
12
- };
@@ -1,11 +0,0 @@
1
- import type { ReleaseV2Props } from '@contentful/field-editor-shared';
2
- import type { CollectionProp, LocaleProps } from 'contentful-management';
3
- import type { ReleaseAction } from '../types';
4
- export type ParsedReleaseParams = {
5
- releaseVersionMap: Map<string, Map<string, ReleaseAction>>;
6
- locales: LocaleProps[];
7
- activeRelease: ReleaseV2Props | undefined;
8
- isActiveReleaseLoading: boolean;
9
- releases: CollectionProp<ReleaseV2Props> | undefined;
10
- };
11
- export declare function parseReleaseParams(raw: string | undefined): ParsedReleaseParams;