@griddo/ax 1.75.238 → 1.75.239

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 (24) hide show
  1. package/package.json +2 -2
  2. package/src/__tests__/components/Browser/Browser.test.tsx +1 -1
  3. package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +25 -7
  4. package/src/__tests__/modules/Sites/SitesList/SitesList.test.tsx +2 -3
  5. package/src/components/ConfigPanel/Form/ConnectedField/PageConnectedField/Field/index.tsx +1 -1
  6. package/src/components/ConfigPanel/Form/ConnectedField/PageConnectedField/TemplateManager/index.tsx +3 -0
  7. package/src/components/ConfigPanel/Form/ConnectedField/PageConnectedField/index.tsx +2 -1
  8. package/src/components/FieldContainer/index.tsx +1 -1
  9. package/src/components/Fields/AsyncCheckGroup/index.tsx +35 -12
  10. package/src/components/Fields/AsyncSelect/index.tsx +4 -4
  11. package/src/components/Fields/ComponentArray/MixableComponentArray/index.tsx +3 -3
  12. package/src/components/Fields/ComponentArray/SameComponentArray/index.tsx +3 -3
  13. package/src/components/Fields/ComponentArray/helpers.tsx +2 -2
  14. package/src/components/Fields/MultiCheckSelect/index.tsx +23 -25
  15. package/src/components/Fields/MultiCheckSelect/style.tsx +20 -19
  16. package/src/containers/App/actions.tsx +1 -1
  17. package/src/containers/App/reducer.tsx +1 -1
  18. package/src/containers/Sites/actions.tsx +6 -7
  19. package/src/modules/Content/index.tsx +2 -1
  20. package/src/modules/GlobalEditor/index.tsx +16 -14
  21. package/src/modules/PageEditor/index.tsx +15 -21
  22. package/src/modules/Sites/SitesList/GridView/GridSiteItem/index.tsx +11 -11
  23. package/src/modules/Sites/SitesList/ListView/ListSiteItem/index.tsx +11 -11
  24. package/src/modules/Sites/SitesList/RecentSiteItem/index.tsx +3 -3
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@griddo/ax",
3
3
  "description": "Griddo Author Experience",
4
- "version": "1.75.238",
4
+ "version": "1.75.239",
5
5
  "authors": [
6
6
  "Álvaro Sánchez' <alvaro.sanches@secuoyas.com>",
7
7
  "Carlos Torres <carlos.torres@secuoyas.com>",
@@ -230,5 +230,5 @@
230
230
  "publishConfig": {
231
231
  "access": "public"
232
232
  },
233
- "gitHead": "2d1fa86361a787815bed32d120d5bda5f1489c6f"
233
+ "gitHead": "f551ff2a20f234d26bbe6c2b16c15f9fe3a7b1de"
234
234
  }
@@ -19,7 +19,7 @@ const defaultProps = mock<IBrowserProps>();
19
19
 
20
20
  defaultProps.content = {};
21
21
  defaultProps.browserRef = {
22
- current: "",
22
+ current: null,
23
23
  };
24
24
  defaultProps.cloudinaryName = "thesaurus-cms";
25
25
  defaultProps.disabled = false;
@@ -10,8 +10,6 @@ import { mock } from "jest-mock-extended";
10
10
 
11
11
  afterEach(cleanup);
12
12
 
13
- const defaultProps = mock<IAsyncCheckGroup>();
14
-
15
13
  jest.mock("axios");
16
14
  const mockedAxios = axios as jest.MockedFunction<typeof axios>;
17
15
 
@@ -19,36 +17,53 @@ describe("AsyncCheckGroup component rendering", () => {
19
17
  afterEach(() => {
20
18
  jest.resetAllMocks();
21
19
  });
20
+
22
21
  it("should render the component with 6 options", async () => {
23
22
  const defaultSite = mock<ISite>();
24
23
  defaultSite.id = 113;
25
- defaultProps.site = defaultSite;
26
- defaultProps.value = [3622];
24
+
25
+ const defaultDataProps: IAsyncCheckGroup = {
26
+ site: defaultSite,
27
+ value: [{
28
+ value: 3622,
29
+ name: "Home",
30
+ title: "Home"
31
+ }],
32
+ onChange: jest.fn(),
33
+ source: "NEWS",
34
+ }
35
+
27
36
  const data = {
28
37
  data: [
29
38
  {
30
39
  value: 3622,
31
40
  name: "Home",
41
+ title: "Home"
32
42
  },
33
43
  {
34
44
  value: 3731,
35
45
  name: "English child",
46
+ title: "English child",
36
47
  },
37
48
  {
38
49
  value: 3730,
39
50
  name: "English Parent",
51
+ title: "English Parent",
40
52
  },
41
53
  {
42
54
  value: 3787,
43
55
  name: "English test",
56
+ title: "English test",
44
57
  },
45
58
  {
46
59
  value: 3745,
47
60
  name: "New Page",
61
+ title: "New Page",
48
62
  },
49
63
  {
50
64
  value: 3784,
51
65
  name: "Prueba",
66
+ title: "Prueba",
52
67
  },
53
68
  ],
54
69
  status: 200,
@@ -62,7 +77,7 @@ describe("AsyncCheckGroup component rendering", () => {
62
77
  await act(async () => {
63
78
  render(
64
79
  <ThemeProvider theme={parseTheme(globalTheme)}>
65
- <AsyncCheckGroup {...defaultProps} />
80
+ <AsyncCheckGroup {...defaultDataProps} />
66
81
  </ThemeProvider>
67
82
  );
68
83
  });
@@ -71,8 +86,11 @@ describe("AsyncCheckGroup component rendering", () => {
71
86
  });
72
87
 
73
88
  it("should render the component with no options", async () => {
74
- defaultProps.source = "source";
75
- defaultProps.value = [];
89
+ const defaultProps: IAsyncCheckGroup = {
90
+ value: [],
91
+ onChange: jest.fn(),
92
+ source: "NEWS",
93
+ }
76
94
 
77
95
  const data = {
78
96
  data: [],
@@ -447,8 +447,7 @@ describe("Sites module events", () => {
447
447
  expect(recentSiteItems.length).toEqual(2);
448
448
 
449
449
  fireEvent.click(recentSiteItems[0]);
450
-
451
- expect(history.location.pathname).toEqual("/sites/pages");
450
+ await waitFor(() => expect(history.location.pathname).toEqual("/sites/pages"));
452
451
  });
453
452
 
454
453
  it("should display list view on click list option button", async () => {
@@ -896,7 +895,7 @@ describe("Sites module events", () => {
896
895
  await act(async () => {
897
896
  render(Component, { store });
898
897
  });
899
-
898
+
900
899
  const gridIconAction = screen.getByTestId("icon-action-Grid2");
901
900
  fireEvent.click(gridIconAction);
902
901
 
@@ -94,7 +94,7 @@ export interface IFieldProps {
94
94
  pages: IPage[];
95
95
  actions: any;
96
96
  site?: ISite;
97
- lang?: string;
97
+ lang?: number;
98
98
  disabled?: boolean;
99
99
  readonly?: boolean;
100
100
  activatedModules?: string[];
@@ -28,6 +28,7 @@ export const TemplateManager = (props: IProps): JSX.Element => {
28
28
  moduleCopy,
29
29
  availableDataPacks,
30
30
  setHistoryPush,
31
+ lang
31
32
  } = props;
32
33
 
33
34
  const isConfig = selectedTab === "config";
@@ -99,6 +100,7 @@ export const TemplateManager = (props: IProps): JSX.Element => {
99
100
  availableDataPacks={availableDataPacks}
100
101
  template={template}
101
102
  setHistoryPush={setHistoryPush}
103
+ lang={lang}
102
104
  />
103
105
  );
104
106
  })}
@@ -126,6 +128,7 @@ interface IProps {
126
128
  moduleCopy: { date: string; element: Record<string, unknown> } | null;
127
129
  availableDataPacks: Record<string, any>[];
128
130
  setHistoryPush?: (path: string, isEditor: boolean) => void;
131
+ lang: number;
129
132
  }
130
133
 
131
134
  const mapStateToProps = (state: IRootState) => ({
@@ -163,6 +163,7 @@ const PageConnectedField = (props: any) => {
163
163
  theme={theme}
164
164
  moduleCopy={moduleCopy}
165
165
  setHistoryPush={setHistoryPush}
166
+ lang={lang.id}
166
167
  />
167
168
  );
168
169
  }
@@ -178,7 +179,7 @@ const PageConnectedField = (props: any) => {
178
179
  pages={pages}
179
180
  actions={actions}
180
181
  site={site}
181
- lang={lang}
182
+ lang={lang.id}
182
183
  disabled={isDisabled}
183
184
  readonly={isFieldReadOnly}
184
185
  activatedModules={activatedModules}
@@ -69,7 +69,7 @@ export interface IFieldContainerProps {
69
69
  actions?: any;
70
70
  hideable?: boolean;
71
71
  site?: ISite;
72
- lang?: string;
72
+ lang?: number;
73
73
  innerFields?: any;
74
74
  disabled?: boolean;
75
75
  readonly?: boolean;
@@ -10,17 +10,16 @@ import * as S from "./style";
10
10
  const AsyncCheckGroup = (props: IAsyncCheckGroup): JSX.Element => {
11
11
  const { onChange, value, site, source, disabled, error, handleValidation, fullHeight, allLanguages = false } = props;
12
12
 
13
- const [options, setOptions] = useState<ICheck[]>([]);
14
-
15
- const safeValue = value ? value : [];
13
+ const [options, setOptions] = useState<ICheckValue[]>([]);
14
+ const safeValue = value && Array.isArray(value) ? value : [];
16
15
 
17
16
  useEffect((): any => {
18
17
  let isSubscribed = true;
19
18
 
20
- const getItems = async () => {
19
+ const getItems = async (): Promise<ICheckValue[]> => {
21
20
  try {
22
21
  let result = null;
23
- const siteID = site ? site.id : null;
22
+ const siteID = site ? site.id : "global";
24
23
  result = await checkgroups.getCheckGroupItems(siteID, source, allLanguages);
25
24
  if (result && isReqOk(result.status)) {
26
25
  return result.data;
@@ -28,12 +27,29 @@ const AsyncCheckGroup = (props: IAsyncCheckGroup): JSX.Element => {
28
27
  } catch (e) {
29
28
  console.log(e);
30
29
  }
31
- return false;
30
+ return [];
32
31
  };
33
32
 
34
33
  getItems()
35
- .then((result) => (isSubscribed ? setOptions(result) : null))
36
- .catch((apiError) => console.log(apiError));
34
+ .then((result) => {
35
+ if(isSubscribed){
36
+ setOptions(result);
37
+ // clean array of old values and set translations
38
+ const resultIDs = result && result.map((opt: ICheckValue) => opt.value);
39
+ const fixedState = safeValue.reduce((acc: ICheckValue[], current: ICheckValue) => {
40
+ if(resultIDs.includes(current.value)){
41
+ return [...acc, current];
42
+ } else {
43
+ const trad = result.find((value: ICheckValue) => value.dataLanguages && value.dataLanguages.find((data: any) => data.id === current.value ));
44
+ if(trad){
45
+ return [...acc, trad]
46
+ }
47
+ return acc;
48
+ }
49
+ }, []);
50
+ onChange(fixedState);
51
+ }
52
+ }).catch((apiError) => console.log(apiError));
37
53
 
38
54
  return () => (isSubscribed = false);
39
55
  }, [site, source, allLanguages]);
@@ -52,13 +68,13 @@ const AsyncCheckGroup = (props: IAsyncCheckGroup): JSX.Element => {
52
68
  newArray = [...arrayIds, newValue.value];
53
69
  }
54
70
 
55
- const newArrayObject = options.filter((e: any) => newArray.includes(e.value));
71
+ const newArrayObject = options.filter((e: ICheckValue) => newArray.includes(e.value));
56
72
 
57
73
  onChange(newArrayObject);
58
74
  error && handleValidation && handleValidation(newArrayObject);
59
75
  };
60
76
 
61
- const isChecked = (id: number) => safeValue.find((e: any) => (typeof e === "number" ? e === id : e.value === id));
77
+ const isChecked = (id: number) : boolean =>!!safeValue.find((e: ICheckValue) => (typeof e === "number" ? e === id : e.value === id));
62
78
 
63
79
  const checks =
64
80
  options &&
@@ -78,11 +94,18 @@ const AsyncCheckGroup = (props: IAsyncCheckGroup): JSX.Element => {
78
94
  return <S.FieldGroup full={fullHeight}>{checks}</S.FieldGroup>;
79
95
  };
80
96
 
97
+ interface ICheckValue {
98
+ value: number;
99
+ name: string;
100
+ title: string;
101
+ dataLanguages?: { id: number; language: number }[];
102
+ }
103
+
81
104
  export interface IAsyncCheckGroup {
82
- value: any[] | null;
105
+ value: ICheckValue[] | null;
83
106
  site?: ISite | null;
84
107
  source: string;
85
- onChange: (value: any) => void;
108
+ onChange: (value: ICheckValue[]) => void;
86
109
  disabled?: boolean;
87
110
  error?: boolean;
88
111
  handleValidation?: (value: string | any[]) => void;
@@ -86,7 +86,7 @@ const AsyncSelect = (props: IAsyncSelectProps): JSX.Element => {
86
86
  // eslint-disable-next-line react-hooks/exhaustive-deps
87
87
  }, [entity, site, lang, selectedContent, entityId, mandatory, placeholder, filter, isCategories, isPage, options]);
88
88
 
89
- const handleChange = (selectedValue: any) => {
89
+ const handleChange = (selectedValue: ICheck | IOption | null) => {
90
90
  const newValue = selectedValue ? selectedValue.value : selectedValue;
91
91
  onChange(newValue);
92
92
  };
@@ -154,19 +154,19 @@ interface ICheck {
154
154
  }
155
155
  export interface IAsyncSelectProps {
156
156
  name: string;
157
- value: any;
157
+ value?: string | number | null;
158
158
  entity?: string;
159
159
  entityId?: string | number;
160
160
  error?: boolean;
161
161
  disabled?: boolean;
162
- onChange: (value: string) => void;
162
+ onChange: (value: string | number | null) => void;
163
163
  site: ISite | null;
164
164
  lang: string;
165
165
  selectedContent: any;
166
166
  mandatory?: boolean;
167
167
  placeholder?: string;
168
168
  filter?: any[];
169
- options?: any;
169
+ options?: any[];
170
170
  source?: string;
171
171
  }
172
172
 
@@ -98,11 +98,11 @@ const MixableComponentArray = (props: IMixableComponentArrayProps): JSX.Element
98
98
  showAddItemButton &&
99
99
  (isModuleArr || objKey === "componentModules") &&
100
100
  !!moduleCopy &&
101
- timeSinceModuleCopy < eightHoursInSeconds &&
101
+ timeSinceModuleCopy && timeSinceModuleCopy < eightHoursInSeconds &&
102
102
  (whiteList.includes(moduleCopyComponent) || isModuleCopyUnavailable);
103
103
 
104
104
  const canReplace = maxItems === 1 && whiteList.length > 1;
105
- const displayReplaceSideModal = value.length > 0 && canReplace;
105
+ const displayReplaceSideModal = fixedValue.length > 0 && canReplace;
106
106
  const optionsType = isModuleArr ? "modules" : "components";
107
107
 
108
108
  const Asterisk = () => (mandatory ? <S.Asterisk>*</S.Asterisk> : null);
@@ -224,7 +224,7 @@ export interface IMixableComponentArrayProps {
224
224
  maxItems: number;
225
225
  title: string;
226
226
  whiteList: any[];
227
- value: IModule[];
227
+ value?: IModule[];
228
228
  selectedContent: any;
229
229
  editorID: number;
230
230
  goTo: (editorID: string) => void;
@@ -40,7 +40,7 @@ const SameComponentArray = (props: ISameComponentArrayProps): JSX.Element => {
40
40
  }
41
41
 
42
42
  const getText = (name: string, index: number) => {
43
- return value.length > 1 ? `#${index + 1} ${name}` : name;
43
+ return value && value.length > 1 ? `#${index + 1} ${name}` : name;
44
44
  };
45
45
 
46
46
  const { kind } = selectedContent;
@@ -54,7 +54,7 @@ const SameComponentArray = (props: ISameComponentArrayProps): JSX.Element => {
54
54
 
55
55
  const handleAdd = isModuleArr ? handleAddModule : handleAddComponent;
56
56
 
57
- const showAddItemButton = !maxItems || value.length < maxItems;
57
+ const showAddItemButton = !maxItems || (value && value.length < maxItems);
58
58
 
59
59
  const Asterisk = () => (mandatory ? <S.Asterisk>*</S.Asterisk> : null);
60
60
 
@@ -141,7 +141,7 @@ export interface ISameComponentArrayProps {
141
141
  maxItems: number;
142
142
  title: string;
143
143
  whiteList: string[];
144
- value: IModule[];
144
+ value?: IModule[];
145
145
  elementUniqueSelection: boolean;
146
146
  selectedContent: any;
147
147
  editorID: number;
@@ -26,8 +26,8 @@ const getComponentProps = (element: any, activatedModules: string[], isModuleArr
26
26
  return { moduleTitle, isModuleDeactivated, componentTitle, displayName, isModule };
27
27
  };
28
28
 
29
- const containerToComponentArray = (value: Record<string, IComponent>): IComponent[] =>
30
- Object.values(value).filter((item: IComponent) => !isComponentEmpty(item));
29
+ const containerToComponentArray = (value?: Record<string, IComponent>): IComponent[] =>
30
+ value ? Object.values(value).filter((item: IComponent) => !isComponentEmpty(item)): [];
31
31
 
32
32
  const getTypefromKey = (key: string) => {
33
33
  switch (key) {
@@ -32,36 +32,34 @@ const MultiCheckSelect = (props: IMultiCheckSelectProps) => {
32
32
  <S.Field isOpen={isOpen} onClick={handleClick} disabled={disabled} data-testid="field">
33
33
  {placeholder} <Asterisk />
34
34
  </S.Field>
35
- {isOpen && (
36
- <S.DropDown floating={floating}>
37
- {options && (
38
- <CheckGroup
39
- options={options}
40
- value={value}
41
- onChange={onChange}
42
- selectAllOption={selectAllOption}
43
- disabled={disabled}
44
- />
45
- )}
46
- {source && (
47
- <AsyncCheckGroup
48
- source={source}
49
- site={site}
50
- value={value}
51
- onChange={onChange}
52
- fullHeight={true}
53
- disabled={disabled}
54
- />
55
- )}
56
- </S.DropDown>
57
- )}
35
+ {isOpen && <S.DropDown floating={floating} isOpen={isOpen}>
36
+ {options && (
37
+ <CheckGroup
38
+ options={options}
39
+ value={value}
40
+ onChange={onChange}
41
+ selectAllOption={selectAllOption}
42
+ disabled={disabled}
43
+ />
44
+ )}
45
+ {source && !options && (
46
+ <AsyncCheckGroup
47
+ source={source}
48
+ site={site}
49
+ value={value}
50
+ onChange={onChange}
51
+ fullHeight={true}
52
+ disabled={disabled}
53
+ />
54
+ )}
55
+ </S.DropDown>}
58
56
  </S.Wrapper>
59
57
  );
60
58
  };
61
59
 
62
60
  export interface IMultiCheckSelectProps {
63
- value: (string | number)[];
64
- onChange: (value: string | (string | number)[]) => void;
61
+ value: any[];
62
+ onChange: (value: string | any[]) => void;
65
63
  site?: ISite | null;
66
64
  placeholder: string;
67
65
  source?: string;
@@ -2,34 +2,34 @@ import styled from "styled-components";
2
2
 
3
3
  const Wrapper = styled.div`
4
4
  position: relative;
5
- min-width: calc(${(p) => p.theme.spacing?.xl} * 2);
6
- max-width: calc(${(p) => p.theme.spacing?.xl} * 6);
5
+ min-width: calc(${(p) => p.theme.spacing.xl} * 2);
6
+ max-width: calc(${(p) => p.theme.spacing.xl} * 6);
7
7
  z-index: 2;
8
8
  `;
9
9
 
10
10
  const Field = styled.div<{ isOpen: boolean; disabled?: boolean }>`
11
11
  position: relative;
12
- ${(p) => p.theme.textStyle?.fieldContent};
13
- color: ${(p) => (p.disabled ? p.theme.color?.interactiveDisabled : p.theme.color?.textHighEmphasis)};
12
+ ${(p) => p.theme.textStyle.fieldContent};
13
+ color: ${(p) => (p.disabled ? p.theme.color.interactiveDisabled : p.theme.color.textHighEmphasis)};
14
14
  display: flex;
15
15
  width: 100%;
16
- height: ${(p) => p.theme.spacing?.l};
17
- background-color: ${(p) => p.theme.color?.interactiveBackground};
16
+ height: ${(p) => p.theme.spacing.l};
17
+ background-color: ${(p) => p.theme.color.interactiveBackground};
18
18
  border: 1px solid
19
19
  ${(p) =>
20
20
  p.isOpen
21
- ? p.theme.color?.interactive01
21
+ ? p.theme.color.interactive01
22
22
  : p.disabled
23
- ? p.theme.color?.interactiveDisabled
24
- : p.theme.color?.uiLine};
25
- border-radius: ${(p) => p.theme.radii?.s};
23
+ ? p.theme.color.interactiveDisabled
24
+ : p.theme.color.uiLine};
25
+ border-radius: ${(p) => p.theme.radii.s};
26
26
  align-items: center;
27
27
  cursor: pointer;
28
- padding: 0 ${(p) => p.theme.spacing?.s};
28
+ padding: 0 ${(p) => p.theme.spacing.s};
29
29
 
30
30
  :focus,
31
31
  :active {
32
- border: 1px solid ${(p) => p.theme.color?.interactive01};
32
+ border: 1px solid ${(p) => p.theme.color.interactive01};
33
33
  outline: none;
34
34
  }
35
35
 
@@ -38,7 +38,7 @@ const Field = styled.div<{ isOpen: boolean; disabled?: boolean }>`
38
38
  right: 16px;
39
39
  top: ${(p) => (p.isOpen ? `22px` : `18px`)};
40
40
  content: "";
41
- border: solid ${(p) => p.theme.color?.interactive01};
41
+ border: solid ${(p) => p.theme.color.interactive01};
42
42
  border-width: 0 2px 2px 0;
43
43
  display: inline-block;
44
44
  padding: 3px;
@@ -46,15 +46,16 @@ const Field = styled.div<{ isOpen: boolean; disabled?: boolean }>`
46
46
  }
47
47
  `;
48
48
 
49
- const DropDown = styled.div<{ floating?: boolean }>`
50
- background-color: ${(p) => p.theme.color?.uiBarBackground};
51
- border: 1px solid ${(p) => p.theme.color?.uiLine};
52
- border-radius: ${(p) => p.theme.radii?.s};
53
- padding: ${(p) => `${p.theme.spacing?.s} ${p.theme.spacing?.xs} ${p.theme.spacing?.xs} ${p.theme.spacing?.s}`};
49
+ const DropDown = styled.div<{ floating?: boolean; isOpen: boolean }>`
50
+ background-color: ${(p) => p.theme.color.uiBarBackground};
51
+ border: ${(p) => (p.isOpen ? `1px solid ${p.theme.color.uiLine}` : "none")};
52
+ border-radius: ${(p) => p.theme.radii.s};
53
+ padding: ${(p) => p.isOpen ? `${p.theme.spacing.s} ${p.theme.spacing.xs} ${p.theme.spacing.xs} ${p.theme.spacing.s}` : 0};
54
54
  width: 100%;
55
55
  z-index: 2;
56
+ height: ${(p) => (p.isOpen ? "100%" : 0)};
56
57
  max-height: 130px;
57
- overflow: auto;
58
+ overflow: ${(p) => (p.isOpen ? "auto" : "hidden")};
58
59
  position: ${(p) => (p.floating ? "absolute" : "block")};
59
60
  `;
60
61
 
@@ -122,7 +122,7 @@ function handleError(response: any, isMultiple = false, msg?: string): (dispatch
122
122
  text,
123
123
  } = response;
124
124
 
125
- const firstMsg = Array.isArray(message) ? message[0].error : message || text;
125
+ const firstMsg = Array.isArray(message) && message[0] ? message[0].error : message || text;
126
126
 
127
127
  const error = {
128
128
  code,
@@ -22,7 +22,7 @@ export interface IAppState {
22
22
  user: IUser;
23
23
  token: string;
24
24
  isLoggingIn: boolean;
25
- lang: { locale: string; id: any };
25
+ lang: { locale: string; id: number };
26
26
  globalLangs: any;
27
27
  globalSettings: IGlobalSettings;
28
28
  sessionStartedAt: null | Date;
@@ -599,7 +599,7 @@ function deleteAndRemoveFromSiteBulk(
599
599
 
600
600
  const responseGlobalPageActions = {
601
601
  handleSuccess: () => {
602
- if (responseErrorPages.data.message.length > 0) {
602
+ if (responseErrorPages.data.message?.length > 0) {
603
603
  getMessageErrors();
604
604
  }
605
605
  },
@@ -617,14 +617,13 @@ function deleteAndRemoveFromSiteBulk(
617
617
  },
618
618
  };
619
619
 
620
- const callbackPages = async () => pageIds.length > 0 && pages.bulkDelete(pageIds);
621
- const callbackGlobalPages = async () =>
622
- globalPageIds.length > 0 && sites.removePageBulk(currentSiteInfo.id, globalPageIds);
620
+ const callbackPages = async () => pages.bulkDelete(pageIds);
621
+ const callbackGlobalPages = async () => sites.removePageBulk(currentSiteInfo.id, globalPageIds);
623
622
 
624
- const resultPages = await handleRequest(callbackPages, responsePageActions, [])(dispatch);
625
- const resultGlobalPages = await handleRequest(callbackGlobalPages, responseGlobalPageActions, [])(dispatch);
623
+ const resultPages = pageIds.length > 0 ? await handleRequest(callbackPages, responsePageActions, [])(dispatch) : true;
624
+ const resultGlobalPages = globalPageIds.length > 0 ? await handleRequest(callbackGlobalPages, responseGlobalPageActions, [])(dispatch) : true;
626
625
 
627
- return resultPages && resultGlobalPages;
626
+ return resultPages || resultGlobalPages;
628
627
  } catch (e) {
629
628
  console.log(e);
630
629
  return false;
@@ -229,10 +229,11 @@ const Content = (props: IProps): JSX.Element => {
229
229
  itemsPerPage,
230
230
  query: searchQuery,
231
231
  format: "list",
232
+ lang: lang.id
232
233
  };
233
234
 
234
235
  return params;
235
- }, [filter, currentSiteInfo, isStructuredData, page, searchQuery]);
236
+ }, [filter, currentSiteInfo, isStructuredData, page, searchQuery, lang]);
236
237
 
237
238
  const getPages = (params: any, filterQuery?: any) => {
238
239
  const isStructuredDataPage = filter !== "unique-pages";
@@ -136,13 +136,13 @@ const GlobalEditor = (props: IProps) => {
136
136
  status: pageStatus.UPLOAD_PENDING,
137
137
  };
138
138
 
139
- pageID
140
- ? updatePageStatus([pageID], pageStatus.UPLOAD_PENDING)
141
- : savePage(false, publishPage).then((isSaved: boolean) => {
142
- if (isSaved) {
143
- resetDirty();
144
- }
145
- });
139
+ const isSaved = pageID
140
+ ? await updatePageStatus([pageID], pageStatus.UPLOAD_PENDING)
141
+ : await savePage(false, publishPage);
142
+
143
+ if (isSaved) {
144
+ resetDirty();
145
+ }
146
146
  } else {
147
147
  setNotification({ text: errorNotificationText, type: "error" });
148
148
  }
@@ -158,20 +158,22 @@ const GlobalEditor = (props: IProps) => {
158
158
  status: pageStatus.UPLOAD_PENDING,
159
159
  };
160
160
 
161
- savePage(false, publishPage).then((isSaved: boolean) => {
162
- if (isSaved) {
163
- resetDirty();
164
- }
165
- });
161
+ const isSaved = await savePage(false, publishPage);
162
+ if (isSaved) {
163
+ resetDirty();
164
+ }
166
165
  } else {
167
166
  setNotification({ text: errorNotificationText, type: "error" });
168
167
  }
169
168
  };
170
169
 
171
- const unpublishPage = () => {
170
+ const unpublishPage = async () => {
172
171
  const { updatePageStatus, pageID } = props;
173
172
 
174
- updatePageStatus([pageID], pageStatus.OFFLINE_PENDING);
173
+ const isSaved = await updatePageStatus([pageID], pageStatus.OFFLINE_PENDING);
174
+ if (isSaved) {
175
+ resetDirty();
176
+ }
175
177
  };
176
178
 
177
179
  const reviewPage = async () => {
@@ -144,21 +144,13 @@ const PageEditor = (props: IProps) => {
144
144
  status: pageStatus.UPLOAD_PENDING,
145
145
  };
146
146
 
147
- const handleSavePage = async () => {
148
- const isSaved = await savePage(false, publishPage);
149
- if (isSaved) {
150
- resetDirty();
151
- }
152
- };
153
-
154
- const handleUpdatePageStatus = async () => {
155
- const isUpdated = await updatePageStatus([pageID], pageStatus.UPLOAD_PENDING);
156
- if (isUpdated) {
157
- resetDirty();
158
- }
159
- };
147
+ const isSaved = pageID
148
+ ? await updatePageStatus([pageID], pageStatus.UPLOAD_PENDING)
149
+ : await savePage(false, publishPage);
160
150
 
161
- pageID ? await handleUpdatePageStatus() : await handleSavePage();
151
+ if (isSaved) {
152
+ resetDirty();
153
+ }
162
154
  } else {
163
155
  setNotification({ text: errorNotificationText, type: "error" });
164
156
  }
@@ -174,20 +166,22 @@ const PageEditor = (props: IProps) => {
174
166
  status: pageStatus.UPLOAD_PENDING,
175
167
  };
176
168
 
177
- savePage(false, publishPage).then((isSaved: boolean) => {
178
- if (isSaved) {
179
- resetDirty();
180
- }
181
- });
169
+ const isSaved = await savePage(false, publishPage);
170
+ if (isSaved) {
171
+ resetDirty();
172
+ }
182
173
  } else {
183
174
  setNotification({ text: errorNotificationText, type: "error" });
184
175
  }
185
176
  };
186
177
 
187
- const unpublishPage = () => {
178
+ const unpublishPage = async () => {
188
179
  const { updatePageStatus, pageID } = props;
189
180
 
190
- updatePageStatus([pageID], pageStatus.OFFLINE_PENDING);
181
+ const isSaved = await updatePageStatus([pageID], pageStatus.OFFLINE_PENDING);
182
+ if (isSaved) {
183
+ resetDirty();
184
+ }
191
185
  };
192
186
 
193
187
  const reviewPage = async () => {
@@ -38,7 +38,7 @@ const GridSiteItem = (props: IGridSiteItemProps): JSX.Element => {
38
38
  };
39
39
 
40
40
  const setSite = async () => {
41
- setSiteInfo(site);
41
+ await setSiteInfo(site);
42
42
  const contentPath = "/sites/pages";
43
43
  setHistoryPush(contentPath, false);
44
44
  };
@@ -61,9 +61,9 @@ const GridSiteItem = (props: IGridSiteItemProps): JSX.Element => {
61
61
  },
62
62
  ];
63
63
 
64
- const handleDeleteSite = () => {
64
+ const handleDeleteSite = async () => {
65
65
  const params = getParams();
66
- deleteSite(site.id, params);
66
+ await deleteSite(site.id, params);
67
67
  toggleDeleteModal();
68
68
  };
69
69
 
@@ -74,15 +74,15 @@ const GridSiteItem = (props: IGridSiteItemProps): JSX.Element => {
74
74
  };
75
75
  const secondaryDeleteAction = { title: "Cancel", onClick: toggleDeleteModal };
76
76
 
77
- const handlePublishSite = () => {
77
+ const handlePublishSite = async () => {
78
78
  const params = getParams();
79
- publishSite(site.id, params);
79
+ await publishSite(site.id, params);
80
80
  togglePublishModal();
81
81
  };
82
82
 
83
- const handleUnpublishSite = () => {
83
+ const handleUnpublishSite = async () => {
84
84
  const params = getParams();
85
- unpublishSite(site.id, params);
85
+ await unpublishSite(site.id, params);
86
86
  togglePublishModal();
87
87
  };
88
88
 
@@ -171,11 +171,11 @@ const GridSiteItem = (props: IGridSiteItemProps): JSX.Element => {
171
171
 
172
172
  interface IGridSiteItemProps {
173
173
  site: ISite;
174
- setSiteInfo(currentSiteInfo: any): void;
174
+ setSiteInfo(currentSiteInfo: any): Promise<void>;
175
175
  setHistoryPush(page: string, isEditor: boolean): void;
176
- deleteSite(siteID: number, params?: IGetSitesParams): void;
177
- publishSite(siteID: number, params?: IGetSitesParams): void;
178
- unpublishSite(siteID: number, params?: IGetSitesParams): void;
176
+ deleteSite(siteID: number, params?: IGetSitesParams): Promise<void>;
177
+ publishSite(siteID: number, params?: IGetSitesParams): Promise<void>;
178
+ unpublishSite(siteID: number, params?: IGetSitesParams): Promise<void>;
179
179
  getParams: () => IGetSitesParams;
180
180
  }
181
181
 
@@ -40,7 +40,7 @@ const ListSiteItem = (props: IListSiteItemProps): JSX.Element => {
40
40
  };
41
41
 
42
42
  const setSite = async () => {
43
- setSiteInfo(site);
43
+ await setSiteInfo(site);
44
44
  const contentPath = "/sites/pages";
45
45
  setHistoryPush(contentPath, false);
46
46
  };
@@ -63,9 +63,9 @@ const ListSiteItem = (props: IListSiteItemProps): JSX.Element => {
63
63
  },
64
64
  ];
65
65
 
66
- const handleDeleteSite = () => {
66
+ const handleDeleteSite = async () => {
67
67
  const params = getParams();
68
- deleteSite(site.id, params);
68
+ await deleteSite(site.id, params);
69
69
  toggleDeleteModal();
70
70
  };
71
71
 
@@ -76,15 +76,15 @@ const ListSiteItem = (props: IListSiteItemProps): JSX.Element => {
76
76
  };
77
77
  const secondaryDeleteAction = { title: "Cancel", onClick: toggleDeleteModal };
78
78
 
79
- const handlePublishSite = () => {
79
+ const handlePublishSite = async () => {
80
80
  const params = getParams();
81
- publishSite(site.id, params);
81
+ await publishSite(site.id, params);
82
82
  togglePublishModal();
83
83
  };
84
84
 
85
- const handleUnpublishSite = () => {
85
+ const handleUnpublishSite = async () => {
86
86
  const params = getParams();
87
- unpublishSite(site.id, params);
87
+ await unpublishSite(site.id, params);
88
88
  togglePublishModal();
89
89
  };
90
90
 
@@ -185,11 +185,11 @@ const ListSiteItem = (props: IListSiteItemProps): JSX.Element => {
185
185
  interface IListSiteItemProps {
186
186
  site: ISite;
187
187
  isSelected: boolean;
188
- setSiteInfo(currentSiteInfo: any): void;
188
+ setSiteInfo(currentSiteInfo: any): Promise<void>;
189
189
  setHistoryPush(site: string, isEditor: boolean): void;
190
- deleteSite(siteID: number, params?: IGetSitesParams): void;
191
- publishSite(siteID: number, params?: IGetSitesParams): void;
192
- unpublishSite(siteID: number, params?: IGetSitesParams): void;
190
+ deleteSite(siteID: number, params?: IGetSitesParams): Promise<void>;
191
+ publishSite(siteID: number, params?: IGetSitesParams): Promise<void>;
192
+ unpublishSite(siteID: number, params?: IGetSitesParams): Promise<void>;
193
193
  onCheck: (e: any) => void;
194
194
  getParams: () => IGetSitesParams;
195
195
  }
@@ -14,8 +14,8 @@ import * as S from "./style";
14
14
  const RecentSiteItem = (props: IRecentSiteItemProps): JSX.Element => {
15
15
  const { site, setSiteInfo, setHistoryPush } = props;
16
16
 
17
- const setSite = () => {
18
- setSiteInfo(site);
17
+ const setSite = async () => {
18
+ await setSiteInfo(site);
19
19
  const contentPath = "/sites/pages";
20
20
  setHistoryPush(contentPath, false);
21
21
  };
@@ -38,7 +38,7 @@ const RecentSiteItem = (props: IRecentSiteItemProps): JSX.Element => {
38
38
 
39
39
  interface IRecentSiteItemProps {
40
40
  site: ISite;
41
- setSiteInfo(currentSiteInfo: any): void;
41
+ setSiteInfo(currentSiteInfo: any): Promise<void>;
42
42
  setHistoryPush(page: string, isEditor: boolean): void;
43
43
  }
44
44