Default 'process type' filter status is: show only main processes.
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas@di-pentima.com.ar>
import { resourcesActions } from "~/store/resources/resources-actions";
import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions.ts';
-import { getDataExplorer, DataExplorer } from "~/store/data-explorer/data-explorer-reducer";
+import { getDataExplorer, DataExplorer, getSortColumn } from "~/store/data-explorer/data-explorer-reducer";
import { loadMissingProcessesInformation } from "~/store/project-panel/project-panel-middleware-service";
import { DataColumns } from "~/components/data-table/data-table";
-import { ProcessStatusFilter, buildProcessStatusFilters } from "../resource-type-filters/resource-type-filters";
+import {
+ ProcessStatusFilter,
+ buildProcessStatusFilters,
+ serializeOnlyProcessTypeFilters
+} from "../resource-type-filters/resource-type-filters";
+import { AllProcessesPanelColumnNames } from "~/views/all-processes-panel/all-processes-panel";
+import { OrderBuilder, OrderDirection } from "~/services/api/order-builder";
+import { ProcessResource } from "~/models/process";
+import { SortDirection } from "~/components/data-table/data-column";
export class AllProcessesPanelMiddlewareService extends DataExplorerMiddlewareService {
constructor(private services: ServiceRepository, id: string) {
const getParams = ( dataExplorer: DataExplorer ) => ({
...dataExplorerToListParams(dataExplorer),
+ order: getOrder(dataExplorer),
filters: getFilters(dataExplorer)
});
const nameFilter = new FilterBuilder().addILike("name", dataExplorer.searchValue).getFilters();
const statusFilter = buildProcessStatusFilters(new FilterBuilder(), activeStatusFilter).getFilters();
+ const typeFilters = serializeOnlyProcessTypeFilters(getDataExplorerColumnFilters(columns, AllProcessesPanelColumnNames.TYPE));
return joinFilters(
nameFilter,
- statusFilter
+ // TODO: When 15019 is merged, this won't be necessary
+ joinFilters(
+ statusFilter,
+ typeFilters)
);
};
+const getOrder = (dataExplorer: DataExplorer) => {
+ const sortColumn = getSortColumn(dataExplorer);
+ const order = new OrderBuilder<ProcessResource>();
+ if (sortColumn) {
+ const sortDirection = sortColumn && sortColumn.sortDirection === SortDirection.ASC
+ ? OrderDirection.ASC
+ : OrderDirection.DESC;
+
+ const columnName = sortColumn && sortColumn.name === AllProcessesPanelColumnNames.NAME ? "name" : "createdAt";
+ return order
+ .addOrder(sortDirection, columnName)
+ .getOrder();
+ } else {
+ return order.getOrder();
+ }
+};
+
const allProcessesPanelDataExplorerIsNotSet = () =>
snackbarActions.OPEN_SNACKBAR({
message: 'All Processes panel is not ready.',
initFilter(ObjectTypeFilter.COLLECTION),
);
-// Using pipe() with more tha 7 arguments makes the return type be 'any',
+// Using pipe() with more than 7 arguments makes the return type be 'any',
// causing compile issues.
export const getInitialResourceTypeFilters = pipe(
(): DataTableFilters => createTree<DataTableFilterItem>(),
),
);
+export const getInitialProcessTypeFilters = pipe(
+ (): DataTableFilters => createTree<DataTableFilterItem>(),
+ initFilter(ProcessTypeFilter.MAIN_PROCESS),
+ initFilter(ProcessTypeFilter.CHILD_PROCESS, '', false)
+);
+
export const getInitialProcessStatusFilters = pipe(
(): DataTableFilters => createTree<DataTableFilterItem>(),
pipe(
() => getMatchingFilters(values(ProcessTypeFilter), selectedFilters),
filters => filters,
mappedFilters => ({
- fb: buildProcessTypeFilters({ fb, filters: mappedFilters }),
+ fb: buildProcessTypeFilters({ fb, filters: mappedFilters, use_prefix: true }),
selectedFilters
})
)();
const PROCESS_TYPES = values(ProcessTypeFilter);
const PROCESS_PREFIX = GroupContentsResourcePrefix.PROCESS;
-const buildProcessTypeFilters = ({ fb, filters }: { fb: FilterBuilder, filters: string[] }) => {
+const buildProcessTypeFilters = ({ fb, filters, use_prefix }: { fb: FilterBuilder, filters: string[], use_prefix: boolean }) => {
switch (true) {
case filters.length === 0 || filters.length === PROCESS_TYPES.length:
return fb;
case includes(ProcessTypeFilter.MAIN_PROCESS, filters):
- return fb.addEqual('requesting_container_uuid', null, PROCESS_PREFIX);
+ return fb.addEqual('requesting_container_uuid', null, use_prefix ? PROCESS_PREFIX : '');
case includes(ProcessTypeFilter.CHILD_PROCESS, filters):
- return fb.addDistinct('requesting_container_uuid', null, PROCESS_PREFIX);
+ return fb.addDistinct('requesting_container_uuid', null, use_prefix ? PROCESS_PREFIX : '');
default:
return fb;
}
({ fb }) => fb.getFilters(),
);
+export const serializeOnlyProcessTypeFilters = pipe(
+ createFiltersBuilder,
+ ({ fb, selectedFilters }: ReturnType<typeof createFiltersBuilder>) => pipe(
+ () => getMatchingFilters(values(ProcessTypeFilter), selectedFilters),
+ filters => filters,
+ mappedFilters => ({
+ fb: buildProcessTypeFilters({ fb, filters: mappedFilters, use_prefix: false }),
+ selectedFilters
+ })
+ )(),
+ ({ fb }) => fb.getFilters(),
+);
+
export const serializeSimpleObjectTypeFilters = (filters: Tree<DataTableFilterItem>) => {
return getSelectedNodes(filters)
.map(f => f.id)
import { ALL_PROCESSES_PANEL_ID } from '~/store/all-processes-panel/all-processes-panel-action';
import {
ProcessStatus,
- ResourceLastModifiedDate,
ResourceName,
ResourceOwner,
- ResourceType
+ ResourceType,
+ ResourceCreatedAtDate
} from '~/views-components/data-explorer/renderers';
import { ProcessIcon } from '~/components/icon/icon';
import { openContextMenu, resourceKindToContextMenuKind } from '~/store/context-menu/context-menu-actions';
import { RootState } from '~/store/store';
import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
import { createTree } from '~/models/tree';
-import { getSimpleObjectTypeFilters, getInitialProcessStatusFilters } from '~/store/resource-type-filters/resource-type-filters';
+import { getInitialProcessStatusFilters, getInitialProcessTypeFilters } from '~/store/resource-type-filters/resource-type-filters';
type CssRules = "toolbar" | "button";
STATUS = "Status",
TYPE = "Type",
OWNER = "Owner",
- LAST_MODIFIED = "Last modified"
+ CREATED_AT = "Started at"
}
export interface AllProcessesPanelFilter extends DataTableFilterItem {
name: AllProcessesPanelColumnNames.TYPE,
selected: true,
configurable: true,
- // TODO: Only filter by process type (main, subprocess)
- filters: getSimpleObjectTypeFilters(),
+ filters: getInitialProcessTypeFilters(),
render: uuid => <ResourceType uuid={uuid} />
},
{
render: uuid => <ResourceOwner uuid={uuid} />
},
{
- name: AllProcessesPanelColumnNames.LAST_MODIFIED,
+ name: AllProcessesPanelColumnNames.CREATED_AT,
selected: true,
configurable: true,
sortDirection: SortDirection.DESC,
filters: createTree(),
- render: uuid => <ResourceLastModifiedDate uuid={uuid} />
+ render: uuid => <ResourceCreatedAtDate uuid={uuid} />
}
];
dataTableDefaultView={
<DataTableDefaultView
icon={ProcessIcon}
- messages={['All Processes list empty.']}
+ messages={['Processes list empty.']}
/>
} />;
}