@griddo/ax 10.6.4 → 10.6.5

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 (26) hide show
  1. package/package.json +3 -2
  2. package/src/__tests__/components/TableFilters/CustomizeFilters/CustomizeFilters.test.tsx +39 -35
  3. package/src/components/CategoryCell/style.tsx +1 -1
  4. package/src/components/TableFilters/CategoryFilter/index.tsx +2 -2
  5. package/src/components/TableFilters/CategoryFilter/style.tsx +1 -1
  6. package/src/components/TableFilters/CustomizeFilters/index.tsx +15 -12
  7. package/src/helpers/arrays.tsx +10 -1
  8. package/src/helpers/customColumns.tsx +45 -0
  9. package/src/helpers/index.tsx +6 -1
  10. package/src/modules/Content/BulkHeader/TableHeader/index.tsx +11 -27
  11. package/src/modules/Content/BulkHeader/TableHeader/style.tsx +4 -2
  12. package/src/modules/Content/BulkHeader/index.tsx +19 -14
  13. package/src/modules/Content/PageItem/index.tsx +4 -3
  14. package/src/modules/Content/PageItem/style.tsx +6 -3
  15. package/src/modules/Content/index.tsx +27 -24
  16. package/src/modules/Content/utils.tsx +36 -3
  17. package/src/modules/StructuredData/StructuredDataList/BulkHeader/TableHeader/index.tsx +11 -8
  18. package/src/modules/StructuredData/StructuredDataList/BulkHeader/TableHeader/style.tsx +8 -7
  19. package/src/modules/StructuredData/StructuredDataList/BulkHeader/index.tsx +27 -16
  20. package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/index.tsx +15 -7
  21. package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/style.tsx +3 -2
  22. package/src/modules/StructuredData/StructuredDataList/StructuredDataItem/index.tsx +27 -18
  23. package/src/modules/StructuredData/StructuredDataList/StructuredDataItem/style.tsx +15 -5
  24. package/src/modules/StructuredData/StructuredDataList/index.tsx +40 -40
  25. package/src/modules/StructuredData/StructuredDataList/utils.tsx +52 -1
  26. package/src/types/index.tsx +2 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@griddo/ax",
3
3
  "description": "Griddo Author Experience",
4
- "version": "10.6.4",
4
+ "version": "10.6.5",
5
5
  "authors": [
6
6
  "Álvaro Sánchez' <alvaro.sanches@secuoyas.com>",
7
7
  "Carlos Torres <carlos.torres@secuoyas.com>",
@@ -112,6 +112,7 @@
112
112
  "mini-css-extract-plugin": "0.11.3",
113
113
  "optimize-css-assets-webpack-plugin": "^6.0.1",
114
114
  "pkg-dir": "^5.0.0",
115
+ "pnp-webpack-plugin": "^1.7.0",
115
116
  "polished": "3.4.1",
116
117
  "postcss": "^8.4.5",
117
118
  "postcss-flexbugs-fixes": "4.1.0",
@@ -232,5 +233,5 @@
232
233
  "publishConfig": {
233
234
  "access": "public"
234
235
  },
235
- "gitHead": "c611871f53ec5d5bc4b97e6d215b9988fd2d6f5b"
236
+ "gitHead": "4a065853330bcae74912ddb0f0785af16b0e261a"
236
237
  }
@@ -15,14 +15,15 @@ const defaultProps = mock<ICustomizeFiltersProps>();
15
15
 
16
16
  describe("CustomizeFilters component rendering", () => {
17
17
  it("should render customize filter", () => {
18
- defaultProps.columns = {
19
- live: { title: "Live", show: true },
20
- profile: { title: "Profile", show: true },
21
- site: { title: "Site", show: true },
22
- status: { title: "Status", show: true },
23
- translation: { title: "Trans.", show: true },
24
- };
18
+ defaultProps.columns = [
19
+ { id: "live", title: "Live", show: true },
20
+ { id: "profile", title: "Profile", show: true },
21
+ { id: "site", title: "Site", show: true },
22
+ { id: "status", title: "Status", show: true },
23
+ { id: "translation", title: "Trans.", show: true },
24
+ ];
25
25
  defaultProps.value = ["site", "profile", "live", "status", "translation"];
26
+ defaultProps.limit = { value: 5, text: "five" };
26
27
  defaultProps.setColumns = jest.fn() as CalledWithMock<void, [newValue: any]> & ((newValue: any) => void);
27
28
 
28
29
  render(
@@ -38,14 +39,15 @@ describe("CustomizeFilters component rendering", () => {
38
39
 
39
40
  describe("CustomizeFilters events", () => {
40
41
  it("should render check group on click floating menu button", () => {
41
- defaultProps.columns = {
42
- live: { title: "Live", show: true },
43
- profile: { title: "Profile", show: true },
44
- site: { title: "Site", show: true },
45
- status: { title: "Status", show: true },
46
- translation: { title: "Trans.", show: true },
47
- };
42
+ defaultProps.columns = [
43
+ { id: "live", title: "Live", show: true },
44
+ { id: "profile", title: "Profile", show: true },
45
+ { id: "site", title: "Site", show: true },
46
+ { id: "status", title: "Status", show: true },
47
+ { id: "translation", title: "Trans.", show: true },
48
+ ];
48
49
  defaultProps.value = ["site", "profile", "live", "status", "translation"];
50
+ defaultProps.limit = { value: 5, text: "five" };
49
51
  defaultProps.setColumns = jest.fn() as CalledWithMock<void, [newValue: any]> & ((newValue: any) => void);
50
52
 
51
53
  render(
@@ -66,14 +68,15 @@ describe("CustomizeFilters events", () => {
66
68
  });
67
69
 
68
70
  it("should check option on click", () => {
69
- defaultProps.columns = {
70
- live: { title: "Live", show: true },
71
- profile: { title: "Profile", show: true },
72
- site: { title: "Site", show: true },
73
- status: { title: "Status", show: true },
74
- translation: { title: "Trans.", show: true },
75
- };
71
+ defaultProps.columns = [
72
+ { id: "live", title: "Live", show: true },
73
+ { id: "profile", title: "Profile", show: true },
74
+ { id: "site", title: "Site", show: true },
75
+ { id: "status", title: "Status", show: true },
76
+ { id: "translation", title: "Trans.", show: true },
77
+ ];
76
78
  defaultProps.value = ["site", "profile", "live", "status", "translation"];
79
+ defaultProps.limit = { value: 5, text: "five" };
77
80
  defaultProps.setColumns = jest.fn() as CalledWithMock<void, [newValue: any]> & ((newValue: any) => void);
78
81
 
79
82
  render(
@@ -96,14 +99,15 @@ describe("CustomizeFilters events", () => {
96
99
  });
97
100
 
98
101
  it("should call setColumns action on change", async () => {
99
- defaultProps.columns = {
100
- live: { title: "Live", show: true },
101
- profile: { title: "Profile", show: true },
102
- site: { title: "Site", show: true },
103
- status: { title: "Status", show: true },
104
- translation: { title: "Trans.", show: true },
105
- };
102
+ defaultProps.columns = [
103
+ { id: "live", title: "Live", show: true },
104
+ { id: "profile", title: "Profile", show: true },
105
+ { id: "site", title: "Site", show: true },
106
+ { id: "status", title: "Status", show: true },
107
+ { id: "translation", title: "Trans.", show: true },
108
+ ];
106
109
  defaultProps.value = ["site", "profile", "live", "status", "translation"];
110
+ defaultProps.limit = { value: 5, text: "five" };
107
111
  const onChangeMock = jest.fn() as CalledWithMock<void, [newValue: any]> & ((newValue: any) => void);
108
112
  defaultProps.setColumns = onChangeMock;
109
113
 
@@ -120,12 +124,12 @@ describe("CustomizeFilters events", () => {
120
124
  const checkFieldInputs = screen.queryAllByTestId("check-field-input");
121
125
  fireEvent.click(checkFieldInputs[0]);
122
126
  expect(onChangeMock).toHaveBeenCalledTimes(1);
123
- expect(onChangeMock).toBeCalledWith({
124
- live: { title: "Live", show: false },
125
- profile: { title: "Profile", show: true },
126
- site: { title: "Site", show: true },
127
- status: { title: "Status", show: true },
128
- translation: { title: "Trans.", show: true },
129
- });
127
+ expect(onChangeMock).toBeCalledWith([
128
+ { id: "live", title: "Live", show: false },
129
+ { id: "profile", title: "Profile", show: true },
130
+ { id: "site", title: "Site", show: true },
131
+ { id: "status", title: "Status", show: true },
132
+ { id: "translation", title: "Trans.", show: true },
133
+ ]);
130
134
  });
131
135
  });
@@ -4,7 +4,7 @@ import styled from "styled-components";
4
4
  import { Cell } from "@ax/components/TableList/TableItem/style";
5
5
 
6
6
  const CategoryCell = styled((props) => <Cell {...props} />)`
7
- flex: 0 0 150px;
7
+ flex: 0 0 215px;
8
8
  align-items: center;
9
9
  position: relative;
10
10
  `;
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect, useState } from "react";
2
2
 
3
3
  import { CheckGroup, FloatingMenu, Icon, ListTitle } from "@ax/components";
4
- import { areEquals, isReqOk } from "@ax/helpers";
4
+ import { areEquals, isReqOk, trimText } from "@ax/helpers";
5
5
  import { checkgroups } from "@ax/api";
6
6
  import { IFilterValue, IQueryValue } from "@ax/types";
7
7
 
@@ -74,7 +74,7 @@ const CategoryFilter = (props: ICategoryFilterProps): JSX.Element => {
74
74
 
75
75
  const Header = () => (
76
76
  <S.HeaderWrapper isActive={isActive}>
77
- {structuredData.title}
77
+ {trimText(structuredData.title, 23)}
78
78
  <S.IconsWrapper>
79
79
  {isActive ? <Icon name="Filter" size="16" /> : <Icon name="DownArrow" size="16" />}
80
80
  </S.IconsWrapper>
@@ -3,7 +3,7 @@ import styled from "styled-components";
3
3
  import { Header } from "@ax/components/TableList/style";
4
4
 
5
5
  const HeaderWrapper = styled((props) => <Header {...props} />)<{ isActive: boolean }>`
6
- width: 150px;
6
+ width: 215px;
7
7
  justify-content: center;
8
8
  &:hover {
9
9
  color: ${(p) => p.theme.color.interactive01};
@@ -5,19 +5,21 @@ import { IColumn } from "@ax/types";
5
5
  import * as S from "./style";
6
6
 
7
7
  const CustomizeFilters = (props: ICustomizeFiltersProps): JSX.Element => {
8
- const { columns, setColumns, value } = props;
9
- const options = Object.keys(columns).map((col: string) => {
10
- const disabled = value.length >= 5 && !value.includes(col);
11
- return { name: col, title: columns[col].title, value: col, disabled };
8
+ const { columns, setColumns, value, limit } = props;
9
+
10
+ const options = columns.map((col) => {
11
+ const disabled = value.length >= limit.value && !value.includes(col.id);
12
+ return { name: col.id, title: col.title, value: col.id, disabled };
12
13
  });
13
14
 
14
15
  const toggleColumn = (selection: any) => {
15
- const updatedColumns = { ...columns };
16
- Object.keys(columns).forEach((val: string, index: number) => {
17
- if (selection.includes(val)) {
18
- updatedColumns[val].show = true;
16
+ const updatedColumns: IColumn[] = [...columns];
17
+ columns.forEach((val) => {
18
+ const columIndex = updatedColumns.findIndex((col) => col.id === val.id);
19
+ if (selection.includes(val.id)) {
20
+ updatedColumns[columIndex].show = true;
19
21
  } else {
20
- updatedColumns[val].show = false;
22
+ updatedColumns[columIndex].show = false;
21
23
  }
22
24
  });
23
25
  setColumns(updatedColumns);
@@ -33,7 +35,7 @@ const CustomizeFilters = (props: ICustomizeFiltersProps): JSX.Element => {
33
35
  <S.Wrapper data-testid="customize-filters-wrapper">
34
36
  <FloatingMenu Button={Button} position="right" closeOnSelect={false}>
35
37
  <ListTitle>Customize filters</ListTitle>
36
- <S.Note>You can select up to five options</S.Note>
38
+ <S.Note>You can select up to {limit.text} options</S.Note>
37
39
  <S.ChecksWrapper>
38
40
  <CheckGroup options={options} value={value} onChange={toggleColumn} />
39
41
  </S.ChecksWrapper>
@@ -43,9 +45,10 @@ const CustomizeFilters = (props: ICustomizeFiltersProps): JSX.Element => {
43
45
  };
44
46
 
45
47
  export interface ICustomizeFiltersProps {
46
- setColumns(newValue: any): void;
47
- columns: Record<string, IColumn>;
48
+ setColumns(newValue: IColumn[]): void;
49
+ columns: IColumn[];
48
50
  value: string[];
51
+ limit: { value: number; text: string };
49
52
  }
50
53
 
51
54
  export default CustomizeFilters;
@@ -10,4 +10,13 @@ const moveArrayElement = (element: any, arr: any[], newIndex: number): Array<any
10
10
  return arrCopy;
11
11
  };
12
12
 
13
- export { isEmptyArray, moveArrayElement };
13
+ const arrayInsert = (arr: any[], index: number, newItem: any) => [
14
+ // part of the array before the specified index
15
+ ...arr.slice(0, index),
16
+ // inserted item
17
+ ...newItem,
18
+ // part of the array after the specified index
19
+ ...arr.slice(index),
20
+ ];
21
+
22
+ export { isEmptyArray, moveArrayElement, arrayInsert };
@@ -0,0 +1,45 @@
1
+ import { IColumn } from "@ax/types";
2
+
3
+ const getMaxColumns = (width: number, isSimple: boolean): { value: number; text: string } => {
4
+ let maxColumns = 5;
5
+ if (width >= 1680) {
6
+ maxColumns = 6;
7
+ }
8
+ if (width > 1920) {
9
+ maxColumns = 7;
10
+ }
11
+
12
+ if (isSimple) {
13
+ maxColumns = maxColumns - 1;
14
+ }
15
+
16
+ switch (maxColumns) {
17
+ case 4:
18
+ return { value: 4, text: "four" };
19
+ case 6:
20
+ return { value: 6, text: "six" };
21
+ case 7:
22
+ return { value: 7, text: "seven" };
23
+ default:
24
+ return { value: 5, text: "five" };
25
+ }
26
+ };
27
+
28
+ const updateColumns = (columnsState: IColumn[], maxColumns: number): IColumn[] => {
29
+ if (!columnsState) return [];
30
+ const activeColumns = columnsState.filter((col) => col.show).length;
31
+ let availableColumns = maxColumns - activeColumns;
32
+
33
+ return columnsState.map((col) => {
34
+ if (!col.show && availableColumns > 0) {
35
+ col.show = true;
36
+ availableColumns = availableColumns - 1;
37
+ }
38
+ if (col.show && !col.default && availableColumns < 0) {
39
+ col.show = false;
40
+ }
41
+ return col;
42
+ });
43
+ };
44
+
45
+ export { getMaxColumns, updateColumns };
@@ -94,7 +94,7 @@ import {
94
94
 
95
95
  import { imageResizeCropAndCompress, compressImage } from "./imageResize";
96
96
 
97
- import { isEmptyArray, moveArrayElement } from "./arrays";
97
+ import { isEmptyArray, moveArrayElement, arrayInsert } from "./arrays";
98
98
 
99
99
  import { getActivatedDataPacksIds, isModuleDisabled, getDeactivatedModules } from "./dataPacks";
100
100
 
@@ -113,6 +113,8 @@ import { parseTheme } from "./parseTheme";
113
113
 
114
114
  import { getFileIcon } from "./files";
115
115
 
116
+ import { getMaxColumns, updateColumns } from "./customColumns";
117
+
116
118
  export {
117
119
  isComponentEmpty,
118
120
  setAsContainedComponent,
@@ -204,4 +206,7 @@ export {
204
206
  stripHtml,
205
207
  encodeData,
206
208
  getFileIcon,
209
+ arrayInsert,
210
+ getMaxColumns,
211
+ updateColumns,
207
212
  };
@@ -6,12 +6,11 @@ import {
6
6
  CustomizeFilters,
7
7
  CategoryFilter,
8
8
  NameFilter,
9
- TypeFilter,
10
9
  StatusFilter,
11
10
  LiveFilter,
12
11
  TranslationsFilter,
13
12
  } from "@ax/components";
14
- import { IColumn, IQueryValue } from "@ax/types";
13
+ import { IColumn, IQueryValue, ISchemaField } from "@ax/types";
15
14
 
16
15
  import * as S from "./style";
17
16
 
@@ -31,14 +30,15 @@ const TableHeader = (props: IProps): JSX.Element => {
31
30
  isGlobalPages,
32
31
  filterValues,
33
32
  siteID,
33
+ maxColumns,
34
34
  } = props;
35
35
 
36
- const activeColumns = Object.keys(columns).filter((col: string) => columns[col].show);
36
+ const activeColumns = columns.filter((col) => col.show).map((col) => col.id);
37
37
 
38
38
  const CategoryColumns =
39
39
  isGlobalPages &&
40
40
  categoryColumns.map(
41
- (col: any) =>
41
+ (col) =>
42
42
  activeColumns.includes(col.key) && (
43
43
  <S.HeaderWrapper key={col.key}>
44
44
  <CategoryFilter
@@ -51,24 +51,6 @@ const TableHeader = (props: IProps): JSX.Element => {
51
51
  )
52
52
  );
53
53
 
54
- const typeFilters = [
55
- {
56
- name: "all",
57
- value: "all",
58
- title: "All content",
59
- },
60
- {
61
- name: "unique",
62
- value: "unique",
63
- title: "Basic templates",
64
- },
65
- {
66
- name: "structuredData",
67
- value: "structuredData",
68
- title: "Content types",
69
- },
70
- ];
71
-
72
54
  return (
73
55
  <S.TableHeader isScrolling={isScrolling}>
74
56
  <S.CheckHeader>
@@ -109,13 +91,14 @@ const TableHeader = (props: IProps): JSX.Element => {
109
91
  <S.NameWrapper>
110
92
  <NameFilter sortItems={sortItems} sortedState={sortedListStatus} />
111
93
  </S.NameWrapper>
112
- {CategoryColumns}
94
+
113
95
  {activeColumns.includes("type") && <S.TypeHeader>Type</S.TypeHeader>}
114
96
  {activeColumns.includes("live") && (
115
97
  <S.HeaderWrapper>
116
98
  <LiveFilter filterItems={filterItems} value={filterValues.liveStatus} />
117
99
  </S.HeaderWrapper>
118
100
  )}
101
+ {CategoryColumns}
119
102
  {activeColumns.includes("status") && (
120
103
  <S.HeaderWrapper>
121
104
  <StatusFilter sortItems={sortItems} sortedState={sortedListStatus} />
@@ -132,7 +115,7 @@ const TableHeader = (props: IProps): JSX.Element => {
132
115
  )}
133
116
  <S.ActionsHeader>
134
117
  <TableCounter totalItems={totalItems} />
135
- <CustomizeFilters columns={columns} setColumns={setColumns} value={activeColumns} />
118
+ <CustomizeFilters columns={columns} setColumns={setColumns} value={activeColumns} limit={maxColumns} />
136
119
  </S.ActionsHeader>
137
120
  </S.TableHeader>
138
121
  );
@@ -147,9 +130,10 @@ interface IProps {
147
130
  sortItems: (orderPointer: IQueryValue[], isAscending: boolean) => void;
148
131
  filterItems: (filterPointer: string, filtersSelected: IQueryValue[]) => void;
149
132
  sortedListStatus: { isAscending: boolean; sortedByDate: boolean; sortedByTitle: boolean; sortedByURL: boolean };
150
- categoryColumns: any[];
151
- columns: Record<string, IColumn>;
152
- setColumns: (columns: Record<string, IColumn>) => void;
133
+ categoryColumns: ISchemaField[];
134
+ columns: IColumn[];
135
+ setColumns: (columns: IColumn[]) => void;
136
+ maxColumns: { value: number; text: string };
153
137
  isGlobalPages: boolean;
154
138
  filterValues: any;
155
139
  siteID: number;
@@ -52,13 +52,15 @@ const TypeHeader = styled(Header)`
52
52
  `;
53
53
 
54
54
  const GlobalMark = styled(Header)`
55
- width: 24px;
56
55
  flex: 0 0 24px;
56
+ padding-right: 0;
57
+ padding-left: 0;
57
58
  `;
58
59
 
59
60
  const ActionsHeader = styled(Header)`
60
- width: 100px;
61
+ flex: 0 0 85px;
61
62
  padding-right: 0;
63
+ padding-left: 0;
62
64
  justify-content: flex-end;
63
65
  align-items: center;
64
66
  `;
@@ -26,6 +26,7 @@ const BulkHeader = (props: IProps): JSX.Element => {
26
26
  setColumns,
27
27
  isGlobalPages,
28
28
  siteID,
29
+ maxColumns,
29
30
  } = props;
30
31
 
31
32
  const isAllowedToDeletePage = usePermission("content.deletePages");
@@ -37,18 +38,20 @@ const BulkHeader = (props: IProps): JSX.Element => {
37
38
  action: bulkDelete,
38
39
  };
39
40
 
40
- const actions = isAllowedToPublishPages ? [
41
- {
42
- icon: "upload-pending",
43
- text: "publish",
44
- action: bulkPublish,
45
- },
46
- {
47
- icon: "offline",
48
- text: "unpublish",
49
- action: bulkUnpublish,
50
- },
51
- ] : [];
41
+ const actions = isAllowedToPublishPages
42
+ ? [
43
+ {
44
+ icon: "upload-pending",
45
+ text: "publish",
46
+ action: bulkPublish,
47
+ },
48
+ {
49
+ icon: "offline",
50
+ text: "unpublish",
51
+ action: bulkUnpublish,
52
+ },
53
+ ]
54
+ : [];
52
55
 
53
56
  const bulkActions = isEditable && isAllowedToDeletePage ? [deleteAction, ...actions] : actions;
54
57
 
@@ -76,6 +79,7 @@ const BulkHeader = (props: IProps): JSX.Element => {
76
79
  setColumns={setColumns}
77
80
  isGlobalPages={isGlobalPages}
78
81
  siteID={siteID}
82
+ maxColumns={maxColumns}
79
83
  />
80
84
  );
81
85
  };
@@ -97,8 +101,9 @@ interface IProps {
97
101
  isEditable?: boolean | null;
98
102
  filterValues: any;
99
103
  categoryColumns: any[];
100
- columns: Record<string, IColumn>;
101
- setColumns: (columns: Record<string, IColumn>) => void;
104
+ columns: IColumn[];
105
+ setColumns: (columns: IColumn[]) => void;
106
+ maxColumns: { value: number; text: string };
102
107
  isGlobalPages: boolean;
103
108
  siteID: number;
104
109
  }
@@ -101,7 +101,7 @@ const PageItem = (props: IPageItemProps): JSX.Element => {
101
101
  const isCopyable = !currentTemplateDataPacks;
102
102
  const isGlobal = origin === "GLOBAL";
103
103
  const isTranslated = pageLanguages.length > 1;
104
- const activeColumns = Object.keys(columns).filter((col: string) => columns[col].show);
104
+ const activeColumns = columns.filter((col) => col.show).map((col) => col.id);
105
105
  const API_URL = process.env.REACT_APP_API_ENDPOINT;
106
106
  const isPublished = liveStatus.status === pageStatus.PUBLISHED || liveStatus.status === pageStatus.UPLOAD_PENDING;
107
107
  const isAllowedToDelete = (isPublished && isAllowedToDeletePublishedPage) || (!isPublished && isAllowedToDeletePage);
@@ -516,7 +516,7 @@ const PageItem = (props: IPageItemProps): JSX.Element => {
516
516
  {!isHome && <S.Slug width={path.width}>{path.text}</S.Slug>}
517
517
  </Tooltip>
518
518
  </S.NameCell>
519
- {CategoryColumns}
519
+
520
520
  {activeColumns.includes("type") && (
521
521
  <S.TypeCell role="cell" onClick={goToPage}>
522
522
  {displayName}
@@ -529,6 +529,7 @@ const PageItem = (props: IPageItemProps): JSX.Element => {
529
529
  </Tooltip>
530
530
  </S.LiveCell>
531
531
  )}
532
+ {CategoryColumns}
532
533
  {activeColumns.includes("status") && (
533
534
  <S.StatusCell role="cell" onClick={goToPage}>
534
535
  {checkWorkflowStatus()}
@@ -682,7 +683,7 @@ interface IPageItemProps {
682
683
  toggleToast(): void;
683
684
  setRemovedPage(pageID: number): void;
684
685
  categoryColumns: any[];
685
- columns: Record<string, IColumn>;
686
+ columns: IColumn[];
686
687
  categoryColors: any;
687
688
  addCategoryColors(cats: string[]): void;
688
689
  dataPacks: IDataPack[];
@@ -75,8 +75,10 @@ const SeoCell = styled(Cell)`
75
75
  `;
76
76
 
77
77
  const GlobalCell = styled(Cell)`
78
- width: 24px;
79
78
  flex: 0 0 24px;
79
+ flex-shrink: 0;
80
+ padding-left: 0;
81
+ padding-right: 0;
80
82
  `;
81
83
 
82
84
  const Mark = styled.div`
@@ -109,14 +111,15 @@ const Wrapper = styled.div`
109
111
  `;
110
112
 
111
113
  const ActionsCell = styled(Cell)`
112
- flex: 0 0 100px;
113
- text-align: center;
114
+ flex: 0 0 85px;
115
+ padding-left: 0;
114
116
  `;
115
117
 
116
118
  const StyledActionMenu = styled(ActionMenu)`
117
119
  opacity: 0;
118
120
  width: 32px;
119
121
  display: flex;
122
+ margin-left: auto;
120
123
  `;
121
124
 
122
125
  const PageRow = styled(Row)<{ global?: boolean }>`