Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/common/actions/entity.actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export interface IAction {
class: string;
titleTranslationId: string;
views: TabViews[];
disabled?: boolean;
dependentField?: DependentField;
}

Expand Down Expand Up @@ -115,6 +116,14 @@ const ACTIONS_CONFIG: IEntityActions[] = [
dependentField: { field: 'layerURLMissing', expectedValue: false },
views: [TabViews.CATALOG, TabViews.SEARCH_RESULTS],
},
{
action: 'delete',
frequent: false,
icon: '',
class: 'mc-icon-Delete',
titleTranslationId: 'action.delete.tooltip',
views: [TabViews.CATALOG, TabViews.SEARCH_RESULTS],
},
],
},
],
Expand Down
1 change: 1 addition & 0 deletions src/common/components/error/error-presentor.css
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
height: 60px;
min-width: 264px;
overflow-y: auto;
overflow-x: hidden;
}

body[dir='rtl'] .errorsList {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,8 @@ body[dir='rtl'] #gridActionsCellRenderer .actionMenuItemTitle {
.actionMenuItemContainer:hover {
background: var(--mdc-theme-gc-alternative-surface);
}

#gridActionsCellRenderer .disabled {
opacity: 0.5;
pointer-events: none;
}
30 changes: 19 additions & 11 deletions src/common/components/grid/cell-renderer/actions.cell-renderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const FIRST = 0;
const EMPTY_ACTION_GROUP = 0;

interface IActionsRendererParams extends ICellRendererParams {
actions: Record<string, IActionGroup[]>;
actions: IActionGroup[];
actionHandler: (action: Record<string, unknown>) => void;
}

Expand Down Expand Up @@ -50,10 +50,7 @@ export const ActionsRenderer: React.FC<IActionsRendererParams> = (props) => {
return filteredActionGroups;
};

const actions = useMemo(
() => filterActionsByDependentFields(props.actions[entity]),
[props.actions[entity]]
);
const actions = useMemo(() => filterActionsByDependentFields(props.actions), [props.actions]);
let frequentActions: IAction[] = [];
let allFlatActions: IAction[] = [];
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
Expand Down Expand Up @@ -88,6 +85,7 @@ export const ActionsRenderer: React.FC<IActionsRendererParams> = (props) => {
: `actionIcon actionDismissible`
}
icon={action.icon}
disabled={action.disabled}
key={`freqAct_${action.action}_${idx}`}
onClick={(): void => {
sendAction(entity, action, props.data);
Expand All @@ -114,21 +112,31 @@ export const ActionsRenderer: React.FC<IActionsRendererParams> = (props) => {
<MenuItem
className="actionMenuItemContainer"
onClick={(evt): void => {
if (action.disabled) {
evt.preventDefault();
evt.stopPropagation();
return;
}
sendAction(entity, action, props.data);
setOpenActionsMenu(false);
}}
key={`menuItemAct_${action.action}_${idx}`}
>
<Box className="actionMenuItem">
<IconButton
className={
action.class
? `actionIcon actionDismissible ${action.class}`
: `actionIcon actionDismissible glow-missing-icon`
}
className={`actionIcon actionDismissible ${
action.class || 'glow-missing-icon'
}`}
disabled={action.disabled}
icon={action.icon}
/>
<Typography tag="div" className="actionMenuItemTitle actionDismissible">
<Typography
tag="div"
disabled={action.disabled}
className={`actionMenuItemTitle actionDismissible ${
action.disabled ? 'disabled' : ''
}`}
>
{action.titleTranslationId}
</Typography>
</Box>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,8 @@ body[dir='rtl'] .actionMenuItemTitle {
padding-left: unset;
padding-right: 8px;
}

.actionsContainer .disabled {
opacity: 0.5;
pointer-events: none;
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export const ActionsRenderer: React.FC<IActionsRendererParams> = ({
: `actionIcon actionDismissible`
}
icon={action.icon}
disabled={action.disabled}
key={`freqAct_${node.id as string}_${idx}`}
onClick={(): void => {
sendAction(entity, action, node);
Expand All @@ -72,20 +73,28 @@ export const ActionsRenderer: React.FC<IActionsRendererParams> = ({
<Box
key={`menuAct_${node.id as string}_${idx}`}
onClick={(evt): void => {
if (action.disabled) {
evt.preventDefault();
evt.stopPropagation();
return;
}
sendAction(entity, action, node);
setOpenActionsMenu(false);
}}
className="actionMenuItem"
>
<IconButton
className={
action.class
? `actionIcon actionDismissible ${action.class}`
: `actionIcon actionDismissible`
}
className={`actionIcon actionDismissible ${action.class || ''}`}
disabled={action.disabled}
icon={action.icon}
/>
<Typography tag="div" className="actionMenuItemTitle actionDismissible">
<Typography
tag="div"
disabled={action.disabled}
className={`actionMenuItemTitle actionDismissible ${
action.disabled ? 'disabled' : ''
}`}
>
{action.titleTranslationId}
</Typography>
</Box>
Expand Down
3 changes: 3 additions & 0 deletions src/common/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@
"delete.dialog.action": "Delete",
"delete.dialog.checkbox": "Confirm deleting",

"delete.approver-name": "Approver name:",
"delete.approval-code": "Approval code:",

"snack.message.success": "SUCCESS",
"snack.message.failed": "FAILURE",
"snack.dismiss-btn.text": "Dismiss",
Expand Down
3 changes: 3 additions & 0 deletions src/common/i18n/he.json
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@
"delete.dialog.action": "מחיקת",
"delete.dialog.checkbox": "אישור מחיקה",

"delete.approver-name": "שם מבצע:",
"delete.approval-code": "קוד מאשר:",

"snack.message.success": "הצלחה",
"snack.message.failed": "כשלון",
"snack.dismiss-btn.text": "אישור",
Expand Down
3 changes: 0 additions & 3 deletions src/common/i18n/helpers/helpers.ts

This file was deleted.

13 changes: 8 additions & 5 deletions src/discrete-layer/components/catalog-tree/catalog-tree.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@ import { changeNodeAtPath, getNodeAtPath, find, ExtendedNodeData } from 'react-s
import { useIntl } from 'react-intl';
import { Box } from '@map-colonies/react-components';
import { useTheme } from '@map-colonies/react-core';
import { IActionGroup } from '../../../common/actions/entity.actions';
import { TreeComponent, TreeItem } from '../../../common/components/tree';
import { ActionsRenderer } from '../../../common/components/tree/icon-renderers/actions.button-renderer';
import { FootprintRenderer } from '../../../common/components/tree/icon-renderers/footprint.icon-renderer';
import { LayerImageRenderer } from '../../../common/components/tree/icon-renderers/layer-image.icon-renderer';
import { ProductTypeRenderer } from '../../../common/components/tree/icon-renderers/product-type.icon-renderer';
import { Error } from '../../../common/components/tree/statuses/error';
import { Loading } from '../../../common/components/tree/statuses/loading';
import { getTextStyle } from '../../../common/helpers/style';
import { getTextStyle, isUnpublished } from '../../../common/helpers/style';
import { isValidLayerMetadata } from '../../../common/helpers/layer-url';
import { LinkType } from '../../../common/models/link-type.enum';
import {
Expand All @@ -30,6 +29,7 @@ import { TabViews } from '../../views/tab-views';
import { LayerMetadataMixedUnion } from '../../models';
import { BestInEditDialog } from '../dialogs/best-in-edit.dialog';
import { getLinkUrlWithToken } from '../helpers/layersUtils';
import { disableActionByPredicate } from '../helpers/actionsUtils';
import { queue } from '../snackbar/notification-queue';

import './catalog-tree.css';
Expand Down Expand Up @@ -310,9 +310,12 @@ export const CatalogTreeComponent: React.FC<CatalogTreeComponentProps> = observe
hoveredNode.parentPath === rowInfo.path.slice(0, -1).toString() && (
<ActionsRenderer
node={rowInfo.node}
actions={
entityPermittedActions[rowInfo.node.__typename] as IActionGroup[]
}
actions={disableActionByPredicate(
entityPermittedActions,
rowInfo.node,
'delete',
(data) => !isUnpublished(data)
)}
entity={rowInfo.node.__typename}
actionHandler={dispatchAction}
/>
Expand Down
27 changes: 27 additions & 0 deletions src/discrete-layer/components/helpers/actionsUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { IActionGroup } from '../../../common/actions/entity.actions';

export const disableActionByPredicate = (
entityPermittedActions: Record<string, unknown>,
data: Record<string, any>,
actionToDisable: string,
predicate: (data: Record<string, unknown>) => boolean
): IActionGroup[] => {
const actionGroups = (entityPermittedActions[data.__typename] as IActionGroup[]).map((group) => ({
...group,
group: group.group.map((action) => ({ ...action })),
}));

if (predicate(data)) {
const targetGroup = actionGroups.find((group) =>
group.group.some((action) => action.action === actionToDisable)
);

const targetAction = targetGroup?.group.find((action) => action.action === actionToDisable);

if (targetAction) {
targetAction.disabled = true;
}
}

return actionGroups;
};
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,11 @@ import { PriorityRenderer } from '../cell-renderer/priority.cell-renderer';
import PlaceholderCellRenderer from '../cell-renderer/placeholder.cell-renderer';
import { StatusRenderer } from '../cell-renderer/status.cell-renderer';
import { TooltippedCellRenderer } from '../cell-renderer/tool-tipped.cell-renderer';
import { JOB_ENTITY } from '../job.types';

export interface ICommonJobManagerGridProps {
rowData: unknown[];
dispatchAction: (action: Record<string, unknown> | undefined) => void;
getJobActions: { [JOB_ENTITY]: IActionGroup[] };
getJobActions: IActionGroup[];
updateJobCB: (updateParam: Record<string, unknown>) => void;
rowDataChangeCB?: () => void;
gridOptionsOverride?: Partial<GridComponentOptions>;
Expand Down Expand Up @@ -299,10 +298,10 @@ const JobManagerGrid: React.FC<ICommonJobManagerGridProps> = (props) => {
headerName: '',
width: 0,
cellRenderer: 'actionsRenderer',
cellRendererParams: {
cellRendererParams: (params: any) => ({
actions: getJobActions,
actionHandler: dispatchAction,
},
}),
},
],
[]
Expand Down
4 changes: 1 addition & 3 deletions src/discrete-layer/components/job-manager/jobs.dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,7 @@ export const JobsDialog: React.FC<JobsDialogProps> = observer((props: JobsDialog
return { ...action, group: groupsWithTranslation };
});

return {
[JOB_ENTITY]: actions,
};
return actions;
}, []);

useEffect(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
#entityDeleteDialog {
--update-layer-header-height: 150px;
--warning-message-height: 60px;
--header-height: 150px;
--footer-height: 60px;
--footer-offset: 4px;
--modal-height: calc(100vh - 80px);
--modal-height: 100vh;
--modal-width: 888px;
--map-height: calc(
100% - var(--header-height) - var(--footer-height) - var(--warning-message-height)
);
}

#entityDeleteDialog .icon {
Expand All @@ -14,15 +17,10 @@

#entityDeleteDialog .footer {
display: flex;
margin-top: var(--footer-offset);
width: 100%;
height: var(--footer-height);
}

body[dir='rtl'] #entityDeleteDialog .footer {
left: 20px;
}

#entityDeleteDialog .buttons {
display: flex;
gap: 20px;
Expand All @@ -45,21 +43,14 @@ body[dir='rtl'] #entityDeleteDialog .closeIcon {
}

#entityDeleteDialog .headerWarning {
height: 100px;
height: var(--warning-message-height);
display: flex;
align-items: center;
}

@media (min-width: 900px) {
#entityDeleteDialog .mdc-dialog .mdc-dialog__surface {
max-width: var(--modal-width);
height: var(--modal-height);
}

#entityDeleteDialog .mdc-dialog .mdc-dialog__surface .mdc-dialog .mdc-dialog__surface {
max-width: var(--modal-width);
height: var(--chonky-modal-height);
}
#entityDeleteDialog .mdc-dialog .mdc-dialog__surface {
max-width: var(--modal-width);
height: var(--modal-height);
}

#deleteLayerDetailsContainer {
Expand All @@ -70,7 +61,7 @@ body[dir='rtl'] #entityDeleteDialog .closeIcon {
align-items: center;
justify-content: center;
width: 100%;
height: var(--update-layer-header-height);
height: var(--header-height);
}

#deleteLayerDetails {
Expand Down
Loading
Loading