Skip to content

Commit

Permalink
Merge pull request #3075 from SEED-platform/refactor/organize-filter-…
Browse files Browse the repository at this point in the history
…and-labels

Refactor/organize filter and labels
  • Loading branch information
Ryo committed Jan 12, 2022
2 parents 9d08a30 + ea47073 commit 80f4afa
Show file tree
Hide file tree
Showing 12 changed files with 289 additions and 103 deletions.
Binary file modified locale/en_US/LC_MESSAGES/django.mo
Binary file not shown.
24 changes: 24 additions & 0 deletions locale/en_US/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ msgstr "# of Records"
msgid "(field must contain this text)"
msgstr "(field must contain this text)"

msgid "(from table below)"
msgstr "(from table below)"

msgid "(no address 1)"
msgstr "(no address 1)"

Expand Down Expand Up @@ -568,6 +571,9 @@ msgstr "Cross-Cycles"
msgid "Current Column Mapping Profile"
msgstr "Current Column Mapping Profile"

msgid "Current Filters"
msgstr "Current Filters"

msgid "Current Name"
msgstr "Current Name"

Expand Down Expand Up @@ -691,6 +697,9 @@ msgstr "Deadline"
msgid "Deadline:"
msgstr "Deadline:"

msgid "Decode UBID/ULID"
msgstr "Decode UBID/ULID"

msgid "Default Display Fields"
msgstr "Default Display Fields"

Expand Down Expand Up @@ -1494,6 +1503,9 @@ msgstr "Member Role"
msgid "Members"
msgstr "Members"

msgid "Merge"
msgstr "Merge"

msgid "Merge Protection"
msgstr "Merge Protection"

Expand Down Expand Up @@ -1619,6 +1631,9 @@ msgstr "No Data"
msgid "No action was taken"
msgstr "No action was taken"

msgid "No filters added."
msgstr "No filters added."

msgid "No labels available. Add a label above to get started."
msgstr "No labels available. Add a label above to get started."

Expand Down Expand Up @@ -2239,6 +2254,12 @@ msgstr "Select the type of file(s) you would like to add to"
msgid "Select which columns to include in the list:"
msgstr "Select which columns to include in the list:"

msgid "Selected Properties"
msgstr "Selected Properties"

msgid "Selected Taxlots"
msgstr "Selected Taxlots"

msgid "Selecting Fields to Share"
msgstr "Selecting Fields to Share"

Expand Down Expand Up @@ -2322,6 +2343,9 @@ msgstr "Snapshot projects are useful when you want to freeze the building data a
msgid "Sorry!"
msgstr "Sorry!"

msgid "Sorting By (in order)"
msgstr "Sorting By (in order)"

msgid "Source EUI"
msgstr "Source EUI"

Expand Down
Binary file modified locale/fr_CA/LC_MESSAGES/django.mo
Binary file not shown.
24 changes: 24 additions & 0 deletions locale/fr_CA/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ msgstr "# d'Enregistrements"
msgid "(field must contain this text)"
msgstr "(le champ doit contenir ce texte)"

msgid "(from table below)"
msgstr "(à partir du tableau ci-dessous)"

msgid "(no address 1)"
msgstr "(pas d'adresse 1)"

Expand Down Expand Up @@ -576,6 +579,9 @@ msgstr "Entre les Cycles"
msgid "Current Column Mapping Profile"
msgstr "Profil de mappage de colonne actuel"

msgid "Current Filters"
msgstr "Filtres Actuel"

msgid "Current Name"
msgstr "Nom Actuel"

Expand Down Expand Up @@ -699,6 +705,9 @@ msgstr "Date limite"
msgid "Deadline:"
msgstr "Date limite:"

msgid "Decode UBID/ULID"
msgstr "Décoder UBID/ULID"

msgid "Default Display Fields"
msgstr "Champs d'affichage par défaut"

Expand Down Expand Up @@ -1507,6 +1516,9 @@ msgstr "Rôle de membre"
msgid "Members"
msgstr "Membres"

msgid "Merge"
msgstr "Fusionner"

msgid "Merge Protection"
msgstr "Protection contre les fusions"

Expand Down Expand Up @@ -1632,6 +1644,9 @@ msgstr "Pas de données"
msgid "No action was taken"
msgstr "Aucune action n'a été prise"

msgid "No filters added."
msgstr "Aucun filtre ajouté."

msgid "No labels available. Add a label above to get started."
msgstr "Pas d'étiquettes disponibles. Ajoutez une étiquette ci-dessus pour commencer."

Expand Down Expand Up @@ -2259,6 +2274,12 @@ msgstr "Sélectionnez le type de fichier (s) que vous souhaitez ajouter à"
msgid "Select which columns to include in the list:"
msgstr "Sélectionnez les colonnes à inclure dans la liste:"

msgid "Selected Properties"
msgstr "Propriétés Sélectionnées"

msgid "Selected Taxlots"
msgstr "Lots d'impôt Sélectionnés"

msgid "Selecting Fields to Share"
msgstr "Sélection des champs à partager"

Expand Down Expand Up @@ -2342,6 +2363,9 @@ msgstr "Les projets Snapshot sont utiles lorsque vous souhaitez geler les donné
msgid "Sorry!"
msgstr "Désolée!"

msgid "Sorting By (in order)"
msgstr "Trier Par (dans l'ordre)"

msgid "Source EUI"
msgstr "IUE source"

Expand Down
127 changes: 106 additions & 21 deletions seed/static/seed/js/controllers/inventory_list_beta_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ angular.module('BE.seed.controller.inventory_list_beta', [])
$scope.selectedCount = 0;
$scope.selectedParentCount = 0;
$scope.selectedOrder = [];
$scope.columnDisplayByName = {};
for (i in all_columns) {
$scope.columnDisplayByName[all_columns[i].name] = all_columns[i].displayName;
};

$scope.inventory_type = $stateParams.inventory_type;
$scope.data = [];
Expand Down Expand Up @@ -143,6 +147,24 @@ angular.module('BE.seed.controller.inventory_list_beta', [])
$scope.column_filters = []
$scope.column_sorts = []

// remove editing on list inputs (ngTagsInput doesn't support readonly yet)
let findFiltersListAttempts = 0;
findList = {};
for (const elementId of ['filters-list', 'sort-list']) {
findList[elementId] = {'attempts': 0};
findList[elementId].interval = setInterval(() => {
let listInput = document.getElementById(elementId).getElementsByTagName('input')[0];
if (listInput) {
listInput.readOnly = true;
clearInterval(findList[elementId].interval);
}
findList[elementId].attempts++;
if (findList[elementId].attempts > 10) {
clearInterval(findList[elementId].interval);
}
}, 1000);
}

// Find labels that should be displayed and organize by applied inventory id
$scope.show_labels_by_inventory_id = {};
$scope.build_labels = function() {
Expand Down Expand Up @@ -880,9 +902,17 @@ angular.module('BE.seed.controller.inventory_list_beta', [])
};

$scope.filters_exist = function () {
return !!_.find($scope.gridApi.grid.columns, function (col) {
return !_.isEmpty(col.filter.term);
});
return !$scope.column_filters.length;
};

$scope.sorts_exist = function () {
return !$scope.column_sorts.length;
};

// it appears resetColumnSorting() doesn't trigger on.sortChanged so we do it manually
$scope.reset_column_sorting = function () {
$scope.gridApi.grid.resetColumnSorting();
$scope.gridApi.core.raise.sortChanged();
};

var get_labels = function () {
Expand Down Expand Up @@ -1076,6 +1106,25 @@ angular.module('BE.seed.controller.inventory_list_beta', [])
});
};

$scope.model_actions = 'none';
elSelectActions = document.getElementById('select-actions');
$scope.run_action = function () {
switch (elSelectActions.value) {
case 'open_merge_modal': $scope.open_merge_modal(); break;
case 'open_delete_modal': $scope.open_delete_modal(); break;
case 'open_export_modal': $scope.open_export_modal(); break;
case 'open_update_labels_modal': $scope.open_update_labels_modal(); break;
case 'run_data_quality_check': $scope.run_data_quality_check(); break;
case 'open_postoffice_modal': $scope.open_postoffice_modal(); break;
case 'open_analyses_modal': $scope.open_analyses_modal(); break;
case 'open_geocode_modal': $scope.open_geocode_modal(); break;
case 'open_ubid_modal': $scope.open_ubid_modal(); break;
case 'open_show_populated_columns_modal': $scope.open_show_populated_columns_modal(); break;
default: console.error('Unknown action!', elSelectActions.value, 'Update "run_action()"');
}
$scope.model_actions = 'none';
};

$scope.open_analyses_modal = function () {
const modalInstance = $uibModal.open({
templateUrl: urls.static_url + 'seed/partials/inventory_detail_analyses_modal.html',
Expand Down Expand Up @@ -1164,6 +1213,38 @@ angular.module('BE.seed.controller.inventory_list_beta', [])
}
};

const operatorLookup = {
'ne': '!=',
'exact': '=',
'lt': '<',
'lte': '<=',
'gt': '<',
'gte': '<=',
'icontains': ''
};

$scope.delete_filter = function (filterToDelete) {
const column = $scope.gridApi.grid.getColumn(filterToDelete.name);
if (!column || column.filters.size < 1) {
return false;
}
let newTerm = [];
for (i in $scope.column_filters) {
filter = $scope.column_filters[i];
if (filter.name != filterToDelete.name || filter == filterToDelete) {
continue;
}
newTerm.push(operatorLookup[filter.operator] + filter.value);
}
column.filters[0].term = newTerm.join(', ');
return false;
};

$scope.delete_sort = function (sortToDelete) {
$scope.gridApi.grid.getColumn(sortToDelete.name).unsort();
return true;
};

// https://regexr.com/6cka2
const combinedRegex = /^(!?)=\s*(-?\d+(?:\\\.\d+)?)$|^(!?)=?\s*"((?:[^"]|\\")*)"$|^(<=?|>=?)\s*((-?\d+(?:\\\.\d+)?)|(\d{4}-\d{2}-\d{2}))$/;
const parseFilter = function (expression) {
Expand All @@ -1175,53 +1256,53 @@ angular.module('BE.seed.controller.inventory_list_beta', [])
operator = filterData[1];
value = Number(filterData[2].replace('\\.', '.'));
if (operator === '!') {
return {operator: 'ne', value};
return {string: 'is not', operator: 'ne', value};
} else {
return {operator: 'exact', value};
return {string: 'is', operator: 'exact', value};
}
} else if (!_.isUndefined(filterData[4])) {
// Text Equality
operator = filterData[3];
value = filterData[4];
if (operator === '!') {
return {operator: 'ne', value};
return {string: 'is not', operator: 'ne', value};
} else {
return {operator: 'exact', value};
return {string: 'is', operator: 'exact', value};
}
} else if (!_.isUndefined(filterData[7])) {
// Numeric Comparison
operator = filterData[5];
value = Number(filterData[6].replace('\\.', '.'));
switch (operator) {
case '<':
return {operator: 'lt', value};
return {string: '<', operator: 'lt', value};
case '<=':
return {operator: 'lte', value};
return {string: '<=', operator: 'lte', value};
case '>':
return {operator: 'gt', value};
return {string: '>', operator: 'gt', value};
case '>=':
return {operator: 'gte', value};
return {string: '>=', operator: 'gte', value};
}
} else {
// Date Comparison
operator = filterData[5];
value = filterData[8];
switch (operator) {
case '<':
return {operator: 'lt', value};
return {string: '<', operator: 'lt', value};
case '<=':
return {operator: 'lte', value};
return {string: '<=', operator: 'lte', value};
case '>':
return {operator: 'gt', value};
return {string: '>', operator: 'gt', value};
case '>=':
return {operator: 'gte', value};
return {string: '>=', operator: 'gte', value};
}
}
} else {
// Case-insensitive Contains
return {operator: 'icontains', value: expression}
return {string: 'contains', operator: 'icontains', value: expression};
}
}
};

var updateColumnFilterSort = function () {
var columns = _.filter($scope.gridApi.saveState.save().columns, function (col) {
Expand Down Expand Up @@ -1249,16 +1330,20 @@ angular.module('BE.seed.controller.inventory_list_beta', [])
const subFilters = _.map(_.split(filter.term, ','), _.trim);
for (const subFilter of subFilters) {
if (subFilter) {
const {operator, value} = parseFilter(subFilter)
$scope.column_filters.push({column_name, operator, value})
const {string, operator, value} = parseFilter(subFilter)
var index = all_columns.findIndex(p => p.name == column_name);
const display = [$scope.columnDisplayByName[name], string, value].join(' ');
$scope.column_filters.push({name, column_name, operator, value, display})
}
}
}

if (sort.direction) {
if (sort.direction) {
// remove the column id at the end of the name
const column_name = name.split("_").slice(0, -1).join("_");
$scope.column_sorts.push({column_name, direction: sort.direction});
const display = [$scope.columnDisplayByName[name], sort.direction].join(' ');
$scope.column_sorts.push({name, column_name, direction: sort.direction, display, priority: sort.priority});
$scope.column_sorts.sort((a, b) => (a.priority > b.priority) ? true : false);
}
}
};
Expand Down

0 comments on commit 80f4afa

Please sign in to comment.