diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py index ad0f892c62c49ab1aff85facfc0e59667e4cd482..037eb1269cc88e11e3b973172704588788ae21b1 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py @@ -4,7 +4,8 @@ This file contains the viewsets (based on the elsewhere defined data models and from django.shortcuts import get_object_or_404 from rest_framework import viewsets -from .lofar_viewset import LOFARViewSet, LOFARNestedViewSet, AbstractTemplateViewSet +from .lofar_viewset import LOFARViewSet, LOFARNestedViewSet, AbstractTemplateViewSet, FILTER_OVERRIDES +from .specification import NumberInFilter from .. import models from .. import serializers from django_filters import rest_framework as filters @@ -131,6 +132,12 @@ class DataproductFeedbackTemplateViewSet(AbstractTemplateViewSet): class SubTaskFilter(filters.FilterSet): + id = NumberInFilter(field_name='id', lookup_expr='in') + id_min = filters.NumberFilter(field_name='id', lookup_expr='gte') + id_max = filters.NumberFilter(field_name='id', lookup_expr='lte') + state = filters.ModelMultipleChoiceFilter(field_name='state', queryset=models.SubtaskState.objects.all()) + name = filters.CharFilter(field_name='task_blueprints__scheduling_unit_blueprint__name', lookup_expr='icontains') # todo: correct name? + class Meta: model = Subtask fields = { @@ -139,6 +146,7 @@ class SubTaskFilter(filters.FilterSet): 'stop_time': ['lt', 'gt'], 'cluster__name': ['exact', 'icontains'], } + filter_overrides = FILTER_OVERRIDES class SubtaskViewSet(LOFARViewSet): diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py index 1f4defdc79838614333a9dbb20f9a1b8a8b98e2d..d52d77d92abc9d2bb4de6520324950d8e7372ff8 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py @@ -948,7 +948,7 @@ class SchedulingUnitBlueprintPropertyFilter(property_filters.PropertyFilterSet): start_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='start_time') stop_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='stop_time') project = property_filters.PropertyCharFilter(field_name='project', lookup_expr='icontains') - status = property_filters.PropertyChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.SchedulingUnitBlueprint.Status), lookup_expr='iexact') + status = property_filters.PropertyMultipleChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.SchedulingUnitBlueprint.Status), lookup_expr='iexact') priority_rank = filters.RangeFilter(field_name='priority_rank') id = NumberInFilter(field_name='id', lookup_expr='in') id_min = filters.NumberFilter(field_name='id', lookup_expr='gte') @@ -1113,6 +1113,7 @@ class TaskDraftPropertyFilter(property_filters.PropertyFilterSet): scheduling_unit_draft_min = filters.NumberFilter(field_name='scheduling_unit_draft__id', lookup_expr='gte') scheduling_unit_draft_max = filters.NumberFilter(field_name='scheduling_unit_draft__id', lookup_expr='lte') scheduling_unit_draft_name = filters.CharFilter(field_name='scheduling_unit_draft__name', lookup_expr='icontains') + project = property_filters.PropertyCharFilter(field_name='scheduling_unit_draft__scheduling_set__project', lookup_expr='icontains') task_blueprints = filters.ModelMultipleChoiceFilter(field_name='task_blueprints', queryset=models.TaskBlueprint.objects.all()) duration_min = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='gte') duration_max = property_filters.PropertyDurationFilter(field_name='duration', lookup_expr='lte') @@ -1264,6 +1265,7 @@ class TaskBlueprintPropertyFilter(property_filters.PropertyFilterSet): scheduling_unit_blueprint_min = filters.NumberFilter(field_name='scheduling_unit_blueprint__id', lookup_expr='gte') scheduling_unit_blueprint_max = filters.NumberFilter(field_name='scheduling_unit_blueprint__id', lookup_expr='lte') scheduling_unit_blueprint_name = filters.CharFilter(field_name='scheduling_unit_blueprint__name', lookup_expr='icontains') + project = property_filters.PropertyCharFilter(field_name='draft__scheduling_unit_draft__scheduling_set__project', lookup_expr='icontains') draft = ModelChoiceInFilter(field_name='draft', lookup_expr='in', queryset=models.TaskDraft.objects.all()) draft_min = filters.NumberFilter(field_name='draft__id', lookup_expr='gte') draft_max = filters.NumberFilter(field_name='draft__id', lookup_expr='lte') @@ -1277,7 +1279,7 @@ class TaskBlueprintPropertyFilter(property_filters.PropertyFilterSet): relative_stop_time_max = property_filters.PropertyDurationFilter(field_name='relative_stop_time', lookup_expr='lte') start_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='start_time') stop_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='stop_time') - status = property_filters.PropertyChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.SubtaskState.Choices), lookup_expr='iexact') + status = property_filters.PropertyMultipleChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.SubtaskState.Choices), lookup_expr='iexact') subtasks = filters.ModelMultipleChoiceFilter(field_name='subtasks', queryset=models.Subtask.objects.all()) subtasks_min = filters.NumberFilter(field_name='subtasks__id', lookup_expr='gte') subtasks_max = filters.NumberFilter(field_name='subtasks__id', lookup_expr='lte') diff --git a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py index 05a4a49fd9ec04920bc124f172e8c2f110994a23..ee121b6da3a133ca799bdac9e49a994ed03e0586 100755 --- a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py +++ b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py @@ -1940,6 +1940,35 @@ class TaskDraftTestCase(unittest.TestCase): self.assertIn(task_draft_2.name, str(response_4)) self.assertNotIn(task_draft_3.name, str(response_4)) + def test_TaskDraft_filters_for_project(self): + """ + Test we can filter on this property, which is explicitly named on the model-specific property filter + """ + # setup + project_1 = models.Project.objects.create(**Project_test_data(name='myproject_draft_partial_1_%s' % uuid.uuid4())) + project_2 = models.Project.objects.create(**Project_test_data(name='myproject_draft_partial_2_%s' % uuid.uuid4())) + scheduling_set_1 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_1)) + scheduling_set_2 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_2)) + su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud1_%s' % uuid.uuid4(), scheduling_set=scheduling_set_1)) + su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(name='sud2_%s' % uuid.uuid4(), scheduling_set=scheduling_set_2)) + task_draft_1 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4(), scheduling_unit_draft=su_draft_1)) + task_draft_2 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4(), scheduling_unit_draft=su_draft_2)) + + # assert + response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?project=%s' % project_1.name, 200) + response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?project=%s' % project_2.name, 200) + response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?project=foo', 200) + response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/?project=myproject_draft_partia', 200) + + self.assertEqual(response_1['count'], 1) + self.assertEqual(response_1['results'][0]['name'], task_draft_1.name) + self.assertEqual(response_2['count'], 1) + self.assertEqual(response_2['results'][0]['name'], task_draft_2.name) + self.assertEqual(response_3['count'], 0) + self.assertEqual(response_4['count'], 2) + self.assertEqual({response_4['results'][0]['name'], response_4['results'][1]['name']}, + {task_draft_1.name, task_draft_2.name}) + class TaskRelationDraftTestCase(unittest.TestCase): @classmethod @@ -2705,12 +2734,45 @@ class TaskBlueprintTestCase(unittest.TestCase): task_blueprint_1 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4())) # assert - response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?status=defined', 200) + response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?status=defined&status=finished', 200) response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?status=obsolete', 200) GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?status=gibberish', 400) self.assertGreater(response_1['count'], 0) self.assertEqual(response_2['count'], 0) + def test_TaskBlueprint_filters_for_project(self): + """ + Test we can filter on this property, which is explicitly named on the model-specific property filter + """ + # setup + project_1 = models.Project.objects.create(**Project_test_data(name='myproject_partial_1_%s' % uuid.uuid4())) + project_2 = models.Project.objects.create(**Project_test_data(name='myproject_partial_2_%s' % uuid.uuid4())) + scheduling_set_1 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_1)) + scheduling_set_2 = models.SchedulingSet.objects.create(**SchedulingSet_test_data(project=project_2)) + su_draft_1 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(scheduling_set=scheduling_set_1)) + su_draft_2 = models.SchedulingUnitDraft.objects.create(**SchedulingUnitDraft_test_data(scheduling_set=scheduling_set_2)) + su_blueprint_1 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(draft=su_draft_1, name='mysub1_%s' % uuid.uuid4())) + su_blueprint_2 = models.SchedulingUnitBlueprint.objects.create(**SchedulingUnitBlueprint_test_data(draft=su_draft_2, name='mysub2_%s' % uuid.uuid4())) + task_draft_1 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4(), scheduling_unit_draft=su_draft_1)) + task_draft_2 = models.TaskDraft.objects.create(**TaskDraft_test_data("td_%s" % uuid.uuid4(), scheduling_unit_draft=su_draft_2)) + task_blueprint_1 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4(), task_draft=task_draft_1, scheduling_unit_blueprint=su_blueprint_1)) + task_blueprint_2 = models.TaskBlueprint.objects.create(**TaskBlueprint_test_data(name="tb_%s" % uuid.uuid4(), task_draft=task_draft_2, scheduling_unit_blueprint=su_blueprint_2)) + + # assert + response_1 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?project=%s' % project_1.name, 200) + response_2 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?project=%s' % project_2.name, 200) + response_3 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?project=foo', 200) + response_4 = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/?project=myproject_partia', 200) + + self.assertEqual(response_1['count'], 1) + self.assertEqual(response_1['results'][0]['name'], task_blueprint_1.name) + self.assertEqual(response_2['count'], 1) + self.assertEqual(response_2['results'][0]['name'], task_blueprint_2.name) + self.assertEqual(response_3['count'], 0) + self.assertEqual(response_4['count'], 2) + self.assertEqual(response_4['results'][0]['name'], task_blueprint_1.name) + self.assertEqual(response_4['results'][1]['name'], task_blueprint_2.name) + class TaskRelationBlueprintTestCase(unittest.TestCase): diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js b/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js index 0053d4e1c6233c46cf01ef7c8b38cc50692c1e35..211e39b479cb3a1881e2e546aacd79fd8567fda6 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/components/ViewTable.js @@ -428,6 +428,11 @@ function MultiSelectFilter({ }) { const [value, setValue] = useState(''); const [filtertype, setFiltertype] = useState('Any'); + const [filtered, setFiltered] = useState(false); + + function callSearchFunc(e) { + callServerFilter(e); + } React.useEffect(() => { if (!filterValue && value) { @@ -469,29 +474,57 @@ function MultiSelectFilter({ return [...options.values()] }, [id, preFilteredRows]); + // Function to call the server side filtering + const callServerFilter = (event, isCleared) => { + hasFilters = true; + //_.remove(tableOptionsState.filters, function(filter) { return filter.id === Header }); + //tableOptionsState.filters.push({id: Header, value: event.target.value}); + if (isCleared) { + hasFilters = false; + if (filtered) { + _.remove(tableOptionsState.filters, function(filter) { return filter.id === Header }); + filterCallback(tableOptionsState, setLoaderFunction); + } + } else { + filterCallback(tableOptionsState, setLoaderFunction); + } + }; + // Render a multi-select box return ( - <div onClick={e => { e.stopPropagation() }} > - <div style={{ position: 'relative' }} > - <MultiSelect data-testid="multi-select" id="multi-select-1" optionLabel="value" optionValue="value" filter={true} - value={value} - options={options} - onChange={e => { - setValue(e.target.value); - setFilter(e.target.value || undefined); - if(storeFilter) { - if (e.target.value.length > 0) { - TableUtil.saveFilter(currentTableName, Header, e.target.value); - } else { - TableUtil.clearColumnFilter(currentTableName, Header); + <div onClick={e => { e.stopPropagation()}}> + <div style={{ position: 'relative', display: 'flex'}} > + <diV> + <MultiSelect data-testid="multi-select" id="multi-select" optionLabel="name" optionValue="value" filter //={!doServersideFilter} + value={value} + options={options} + onChange={e => { + setValue(e.target.value); + setFilter(e.target.value || undefined); + if(storeFilter) { + if (e.target.value.length > 0) { + TableUtil.saveFilter(currentTableName, Header, e.target.value); + } else { + TableUtil.clearColumnFilter(currentTableName, Header); + } } - } - }} - maxSelectedLabels="1" - selectedItemsLabel="{0} Selected" - className="multi-select" - tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Select one or more value from list to search"} - /> + setFiltered(true); + //callServerFilter(e); + }} + maxSelectedLabels="1" + selectedItemsLabel="{0} Selected" + className="multi-select" + tooltip={(tableToolTipsState[Header])?tableToolTipsState[Header]:"Select one or more value from list and click search icon to search"} + style={{width: '8em'}} + /> + </diV> + {doServersideFilter && + <div> + <button className="p-link" onClick={callSearchFunc} > + <i className="pi pi-search search-btn" /> + </button> + </div> + } </div> </div> ) diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_viewtable.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_viewtable.scss index 6a283c3587cad532058feaefd54b1f905799e2f9..c0112826632ed7b79a4249e411793adea771bb04 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_viewtable.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_viewtable.scss @@ -199,3 +199,10 @@ body .p-paginator { .dialog-delete-msg { padding-left: 1em; } +.search-btn { + display: inline-block; + position: relative; + top: 6px; + color: dimgray; + left: 0.25em; +} \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js index 111cbfb24c68fcf5188034ef4caec1b7f22dcf7a..804838a703147d84cd988e75e94a45efdfc53815 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Scheduling/SchedulingUnitList.js @@ -35,7 +35,7 @@ class SchedulingUnitList extends Component{ super(props); this. setToggleBySorting(); this.defaultcolumns = { - status: {name: "Status",filter: "select"}, + status: {name: "Status",filter: "multiselect-filter"}, workflowStatus: {name: "Workflow Status",filter: "select"}, suid: {name: "Scheduling Unit ID", tooltip: this.COMMA_SEPARATE_TOOLTIP}, project:{name:"Project"}, @@ -147,7 +147,7 @@ class SchedulingUnitList extends Component{ "Linked Draft ID":"filter-input-100", "Linked Blueprint ID":"filter-input-100", "Type": "filter-input-75", - "Status":"filter-input-100", + "Status":"filter-input-125", "workflowStatus":"filter-input-100", "Stations (CS/RS/IS)":"filter-input-50", "Tasks content (O/P/I)":"filter-input-50", @@ -407,9 +407,11 @@ class SchedulingUnitList extends Component{ */ getStatusList(suFilters) { if (suFilters.data.filters['status']) { + this.statusList = []; suFilters.data.filters['status'].choices.forEach(choice => { - this.statusList.push(choice.value); - }) + const tmpVar = {name: _.startCase(choice.value), value: choice.value}; + this.statusList.push(tmpVar); + }); } } @@ -1200,6 +1202,10 @@ class SchedulingUnitList extends Component{ // Since it is ModelChoiceFilter, it will allow single parameter, so use last parameter if contains multi parameter const values = _.split(filter.value, ","); this.filterQry += 'observation_strategy_template='+values[values.length-1]+"&"; + } else if (filter.id.toLowerCase() === 'status') { + for ( const value of filter.value) { + this.filterQry += 'status='+value+"&"; + } } else { let columnDetails = _.find(this.state.columnMap, {displayName:filter.id}); if(columnDetails) { diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js index af675d1a59459e9251f0b09cf969471fe7d756db..db8455cd7a83b34cf74cc8b5464558a0926a0ffb 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/list.js @@ -76,7 +76,7 @@ export class TaskList extends Component { }, status: { name: "Status", - filter: "select" + filter: "multiselect-filter" }, scheduling_unit_draft: { name:"Scheduling Unit ID", @@ -184,7 +184,7 @@ export class TaskList extends Component { "Relative End Time (HH:mm:ss)": "filter-input-75", "Start Time": "filter-input-150", "End Time": "filter-input-150", - "Status": "filter-input-100", + "Status": "filter-input-125", "#Dataproducts": "filter-input-75", "Data size": "filter-input-50", "Data size on Disk": "filter-input-50", @@ -651,9 +651,11 @@ export class TaskList extends Component { */ getStatusList(taskFilters) { if (taskFilters.data.filters['status']) { + this.statusList = []; taskFilters.data.filters['status'].choices.forEach(choice => { - this.statusList.push(choice.value); - }) + const tmpVar = {name: _.startCase(choice.value), value: choice.value}; + this.statusList.push(tmpVar); + }); } } @@ -843,6 +845,10 @@ export class TaskList extends Component { let columnDetails = _.find(this.state.columnMap, {displayName:filter.id}); const values = UnitConverter.getSubbandOutput(filter.value); this.filterQry += columnDetails.orgField+'='+values.toString()+"&"; + } else if (filter.id.toLowerCase() === 'status') { + for ( const value of filter.value) { + this.filterQry += 'status='+value+"&"; + } } else { let columnDetails = _.find(this.state.columnMap, {displayName:filter.id}); if(columnDetails) { diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js index da7b6ff5f534d7a7f87df5ab5b31170c8021c47c..4be3566be8f1d9b73f068c97e27c9668bb6066e5 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js @@ -1202,19 +1202,21 @@ export class TimelineView extends Component { /** * Get Status list for UI drop down list */ - async getStatusList() { + async getStatusList() { let suStatusList = []; let taskStatusList = []; const suFilters = await ScheduleService.getSchedulingUnitFilterDefinition('blueprint'); if (suFilters && suFilters.data.filters['status']) { suFilters.data.filters['status'].choices.forEach(choice => { - suStatusList.push(choice.value); + const tmpVar = {name: _.startCase(choice.value), value: choice.value}; + suStatusList.push(tmpVar); }); } const taskFilters = await TaskService.getTaskFilterDefinition('blueprint'); if (taskFilters && taskFilters.data.filters['status']) { taskFilters.data.filters['status'].choices.forEach(choice => { - taskStatusList.push(choice.value); + const tmpVar = {name: _.startCase(choice.value), value: choice.value}; + taskStatusList.push(tmpVar); }); } this.setState({suStatusList: suStatusList, taskStatusList: taskStatusList}); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js index a4690fda9d0d2cf645b4dba37bddda93fe958de6..c33cd2a91c08c3af6c976a193570990288a63707 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js @@ -916,19 +916,21 @@ export class WeekTimelineView extends Component { /** * Get Status list for UI drop down list */ - async getStatusList() { + async getStatusList() { let suStatusList = []; let taskStatusList = []; const suFilters = await ScheduleService.getSchedulingUnitFilterDefinition('blueprint'); if (suFilters && suFilters.data.filters['status']) { suFilters.data.filters['status'].choices.forEach(choice => { - suStatusList.push(choice.value); + const tmpVar = {name: _.startCase(choice.value), value: choice.value}; + suStatusList.push(tmpVar); }); } const taskFilters = await TaskService.getTaskFilterDefinition('blueprint'); if (taskFilters && taskFilters.data.filters['status']) { taskFilters.data.filters['status'].choices.forEach(choice => { - taskStatusList.push(choice.value); + const tmpVar = {name: _.startCase(choice.value), value: choice.value}; + taskStatusList.push(tmpVar); }); } this.setState({suStatusList: suStatusList, taskStatusList: taskStatusList}); @@ -949,7 +951,6 @@ export class WeekTimelineView extends Component { } render() { - const {dynamicScheduler} = this.state.userrole.userRolePermission; if (this.state.redirect) { return <Redirect to={{ pathname: this.state.redirect }}></Redirect> } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js b/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js index 65d51fe61b2805b6ef729f418282f41f35309a06..9c592d65eb1f14c42f82dc9562a73836edf054d3 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/shared/timeline.constants.js @@ -4,7 +4,7 @@ const TimelineConstants = { SU_LIST_DEFAULT_COLUMNS: [{ status: { name:"Status", - filter: "select", + filter: "multiselect-filter", }, do_cancel: { name:"Cancelled" @@ -82,7 +82,7 @@ const TimelineConstants = { }], TASK_LIST_DEFAULT_COLUMNS: [{ status: { - name: "Status", filter: "select" + name: "Status", filter: "multiselect-filter" }, do_cancel: { name: "Cancelled"