diff --git a/client/src/mvc/grid/grid-model.js b/client/src/mvc/grid/grid-model.js
deleted file mode 100644
index 5f618b502cf..00000000000
--- a/client/src/mvc/grid/grid-model.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import Backbone from "backbone";
-import $ from "jquery";
-import _ from "underscore";
-
-export default Backbone.Model.extend({
- defaults: {
- url_base: "",
- title_id: undefined,
- async: false,
- async_ops: [],
- categorical_filters: [],
- filters: {},
- sort_key: null,
- show_item_checkboxes: false,
- advanced_search: false,
- cur_page: 1,
- num_pages: 1,
- operation: undefined,
- item_ids: undefined,
- },
-
- /**
- * Add filtering criterion.
- */
- add_filter: function (key, value, append) {
- // Update URL arg with new condition.
- if (append) {
- // Update or append value.
- var cur_val = this.attributes.filters[key];
-
- var new_val;
- if (cur_val === null || cur_val === undefined) {
- new_val = value;
- } else if (typeof cur_val == "string") {
- if (cur_val == "All" || cur_val == value) {
- new_val = value;
- } else {
- // Replace string with array.
- var values = [];
- values[0] = cur_val;
- values[1] = value;
- new_val = values;
- }
- } else {
- // Current value is an array.
- new_val = cur_val;
- if (new_val.indexOf(value) === -1) {
- new_val.push(value);
- }
- }
- this.attributes.filters[key] = new_val;
- } else {
- // Replace value.
- this.attributes.filters[key] = value;
- }
- },
-
- /**
- * Remove filtering criterion.
- */
- remove_filter: function (key, condition) {
- var cur_val = this.attributes.filters[key];
- if (cur_val === null || cur_val === undefined) {
- return false;
- }
-
- if (typeof cur_val === "string") {
- // overwrite/remove condition.
- this.attributes.filters[key] = "";
- } else {
- // filter contains an array of conditions.
- var condition_index = _.indexOf(cur_val, condition);
- if (condition_index !== -1) {
- cur_val[condition_index] = "";
- }
- }
- },
-
- /**
- * Returns URL data for obtaining a new grid.
- */
- get_url_data: function () {
- var url_data = {
- async: this.attributes.async,
- sort: this.attributes.sort_key,
- page: this.attributes.cur_page,
- show_item_checkboxes: this.attributes.show_item_checkboxes,
- advanced_search: this.attributes.advanced_search,
- };
-
- // Add operation, item_ids only if they have values.
- if (this.attributes.operation) {
- url_data.operation = this.attributes.operation;
- }
- if (this.attributes.item_ids) {
- url_data.id = this.attributes.item_ids;
- }
-
- // Add filter arguments to data, placing "f-" in front of all arguments.
- var self = this;
- _.each(_.pairs(self.attributes.filters), (k) => {
- url_data[`f-${k[0]}`] = k[1];
- });
- return url_data;
- },
-
- // Return URL for obtaining a new grid
- get_url: function (args) {
- return `${this.get("url_base")}?${$.param(this.get_url_data())}&${$.param(args)}`;
- },
-});
diff --git a/client/src/mvc/grid/grid-template.js b/client/src/mvc/grid/grid-template.js
deleted file mode 100644
index cedaa1a07e9..00000000000
--- a/client/src/mvc/grid/grid-template.js
+++ /dev/null
@@ -1,556 +0,0 @@
-import { sanitize } from "dompurify";
-import $ from "jquery";
-import _ from "underscore";
-
-// grid view templates
-export default {
- // template
- grid: function (options) {
- let tmpl;
- if (options.embedded) {
- tmpl = this.grid_header(options) + this.grid_table(options);
- } else {
- tmpl = `
-
-
-
- | ${this.grid_header(options)} |
- |
- |
-
-
- |
- |
- |
-
-
- ${this.grid_table(options)}
- `;
- }
-
- // add info text
- if (options.info_text) {
- tmpl += `
${options.info_text}
`;
- }
-
- // return
- return tmpl;
- },
-
- // template
- grid_table: function () {
- return `
- `;
- },
-
- // template
- grid_header: function (options) {
- var tmpl = '";
-
- // return template
- return tmpl;
- },
-
- // template
- header: function (options) {
- // start
- var tmpl = "";
-
- // add checkbox
- if (options.show_item_checkboxes) {
- tmpl += "| ";
- if (options.items.length > 0) {
- tmpl +=
- '' +
- '';
- }
- tmpl += " | ";
- }
-
- // create header elements
- for (const column of options.columns) {
- if (column.visible) {
- tmpl += ``;
- if (column.sortable) {
- tmpl += `${column.label}`;
- } else {
- tmpl += column.label;
- }
- tmpl += `${column.extra} | `;
- }
- }
-
- // finalize
- tmpl += "
";
-
- // return template
- return tmpl;
- },
-
- // template
- body: function (options) {
- // initialize
- var tmpl = "";
- var items_length = options.items.length;
-
- // empty grid?
- if (items_length === 0) {
- // No results.
- const filters = options.filters;
- const searchTerm = filters["free-text-search"] || "";
- const tags = filters.tags && filters.tags !== "All" ? `tags:${filters.tags} ` : "";
- const name = filters.name && filters.name !== "All" ? `name:${filters.name}` : "";
- const searchMsg = searchTerm || `${tags}${name}`;
- const noItemsMsg = searchMsg ? `No matching entries found for ${searchMsg}` : "No items";
-
- tmpl += `| ${noItemsMsg} |
`;
- }
-
- // create rows
- for (const item of options.items) {
- // Tag current
- tmpl += "";
-
- // Item selection column
- if (options.show_item_checkboxes) {
- tmpl += ` | `;
- }
-
- // Data columns
- for (const column of options.columns) {
- if (column.visible) {
- // Nowrap
- var nowrap = "";
- if (column.nowrap) {
- nowrap = 'style="white-space:nowrap;"';
- }
-
- // get column settings
- var column_settings = item.column_config[column.label];
-
- // load attributes
- var link = column_settings.link;
- var value = column_settings.value;
- var target = column_settings.target;
-
- // unescape value
- if ($.type(value) === "string") {
- value = value.replace(/\/\//g, "/");
- }
-
- // Attach popup menu?
- var popup_id = "";
- if (column.attach_popup) {
- popup_id = `grid-${item.encode_id}-popup`;
- }
-
- // Check for row wrapping
- tmpl += ``;
-
- // Determine cell content
- if (column.delayed) {
- tmpl += ` `;
- } else if (column.attach_popup && link) {
- tmpl += `
-
-
- `;
- } else if (column.attach_popup) {
- tmpl += ``;
- } else if (link) {
- tmpl += `${value}`;
- } else {
- tmpl += ``;
- }
- tmpl += " | ";
- }
- }
- tmpl += "
";
- }
- return tmpl;
- },
-
- // template
- footer: function (options) {
- // create template string
- var tmpl = "";
-
- // paging
- if (options.use_paging && options.num_pages > 1) {
- // get configuration
- var num_page_links = options.num_page_links;
- var cur_page_num = options.cur_page_num;
- var num_pages = options.num_pages;
-
- // First pass on min page.
- var page_link_range = num_page_links / 2;
- var min_page = cur_page_num - page_link_range;
- var min_offset = 0;
- if (min_page <= 0) {
- // Min page is too low.
- min_page = 1;
- min_offset = page_link_range - (cur_page_num - min_page);
- }
-
- // Set max page.
- var max_range = page_link_range + min_offset;
- var max_page = cur_page_num + max_range;
- var max_offset;
- if (max_page <= num_pages) {
- // Max page is fine.
- max_offset = 0;
- } else {
- // Max page is too high.
- max_page = num_pages;
- // +1 to account for the +1 in the loop below.
- max_offset = max_range - (max_page + 1 - cur_page_num);
- }
-
- // Second and final pass on min page to add any unused
- // offset from max to min.
- if (max_offset !== 0) {
- min_page -= max_offset;
- if (min_page < 1) {
- min_page = 1;
- }
- }
-
- // template header
- tmpl += '';
- if (options.show_item_checkboxes) {
- tmpl += " | ";
- }
- tmpl += '' + '' + "Page:";
-
- if (min_page > 1) {
- tmpl +=
- '1 ...';
- }
-
- // create page urls
- for (var page_index = min_page; page_index < max_page + 1; page_index++) {
- if (page_index == options.cur_page_num) {
- tmpl += `${page_index}`;
- } else {
- tmpl += `${page_index}`;
- }
- }
-
- // show last page
- if (max_page < num_pages) {
- tmpl += `...${num_pages}`;
- }
- tmpl += "";
-
- // Show all link
- tmpl += `
- | Show All
- |
-
`;
- }
-
- // Grid operations for multiple items.
- if (options.show_item_checkboxes) {
- // start template
- tmpl += `
-
-
- |
-
- For selected items:
- `;
-
- // configure buttons for operations
- for (const operation of options.operations) {
- if (operation.allow_multiple) {
- tmpl += ` `;
- }
- }
-
- // finalize template
- tmpl += " | " + "
";
- }
-
- // count global operations
- var found_global = false;
- for (const operation of options.operations) {
- if (operation.global_operation) {
- found_global = true;
- break;
- }
- }
-
- // add global operations
- if (found_global) {
- tmpl += "" + '| ';
- for (const operation of options.operations) {
- if (operation.global_operation) {
- tmpl += `${operation.label}`;
- }
- }
- tmpl += " | " + "
";
- }
-
- // add legend
- if (options.legend) {
- tmpl += `| ${options.legend} |
`;
- }
-
- // return
- return tmpl;
- },
-
- // template
- message: function (options) {
- var status = options.status;
- if (["success", "ok"].indexOf(status) != -1) {
- status = "done";
- }
- return `${_.escape(
- options.message
- )}
`;
- },
-
- // template
- grid_filters: function (options) {
- // get filters
- var default_filter_dict = options.default_filter_dict;
- var filters = options.filters;
-
- // show advanced search if flag set or if there are filters for advanced search fields
- var advanced_search_display = "none";
- if (options.advanced_search) {
- advanced_search_display = "block";
- }
-
- // identify columns with advanced filtering
- var show_advanced_search_link = false;
- for (const column of options.columns) {
- if (column.filterable == "advanced") {
- var column_key = column.key;
- var f_key = filters[column_key];
- var d_key = default_filter_dict[column_key];
- if (f_key && d_key && f_key != d_key) {
- advanced_search_display = "block";
- }
- show_advanced_search_link = true;
- }
- }
-
- // hide standard search if advanced is shown
- var standard_search_display = "block";
- if (advanced_search_display == "block") {
- standard_search_display = "none";
- }
-
- //
- // standard search
- //
- var tmpl = ``;
-
- // add standard filters
- for (const column of options.columns) {
- if (column.filterable == "standard") {
- tmpl += this.grid_column_filter(options, column);
- }
- }
-
- // finalize standard search
- tmpl += " " + " | " + "
" + "" + "| ";
-
- // show advanced search link in standard display
- if (show_advanced_search_link) {
- tmpl += 'Advanced Search';
- }
-
- // finalize standard search display
- tmpl += " | " + "
" + "
" + "
";
-
- //
- // advanced search
- //
- tmpl += `| Close Advanced Search |
`;
-
- // add advanced filters
- for (const column of options.columns) {
- if (column.filterable == "advanced") {
- tmpl += this.grid_column_filter(options, column);
- }
- }
-
- // finalize advanced search template
- tmpl += "
" + "
";
-
- // return template
- return tmpl;
- },
-
- // template
- grid_column_filter: function (options, column) {
- // collect parameters
- var filters = options.filters;
- var column_label = column.label;
- var column_key = column.key;
- if (column.filterable == "advanced") {
- column_label = column_label.toLowerCase();
- }
-
- // start
- var tmpl = "";
-
- if (column.filterable == "advanced") {
- tmpl += `| ${column_label}: | `;
- }
- tmpl += '';
- if (column.is_text) {
- tmpl += ``;
- } else {
- // filter criteria
- tmpl += ``;
-
- // add category filters
- var seperator = false;
- for (var cf_label in options.categorical_filters[column_key]) {
- // get category filter
- var cf = options.categorical_filters[column_key][cf_label];
-
- // each filter will have only a single argument, so get that single argument
- var cf_key = "";
- var cf_arg = "";
- for (var key in cf) {
- cf_key = key;
- cf_arg = cf[key];
- }
-
- // add seperator
- if (seperator) {
- tmpl += " | ";
- }
- seperator = true;
-
- // add category
- var filter = filters[column_key];
- if (filter && cf[column_key] && filter == cf_arg) {
- tmpl += `${cf_label}`;
- } else {
- tmpl += `${cf_label}`;
- }
- }
- tmpl += "";
- }
- tmpl += " | " + "
";
-
- // return template
- return tmpl;
- },
-
- // template for filter items
- filter_element: function (filter_key, filter_value) {
- filter_value = sanitize(filter_value);
- return `${filter_value}`;
- },
-};
diff --git a/client/src/mvc/grid/grid-view.js b/client/src/mvc/grid/grid-view.js
deleted file mode 100644
index 26ce8bd101d..00000000000
--- a/client/src/mvc/grid/grid-view.js
+++ /dev/null
@@ -1,681 +0,0 @@
-import { getGalaxyInstance } from "app";
-import Backbone from "backbone";
-import $ from "jquery";
-import GridModel from "mvc/grid/grid-model";
-import Templates from "mvc/grid/grid-template";
-import PopupMenu from "mvc/ui/popup-menu";
-import { init_refresh_on_change } from "onload/globalInits/init_refresh_on_change";
-import slugify from "slugify";
-import LoadingIndicator from "ui/loading-indicator";
-import _ from "underscore";
-import Utils from "utils/utils";
-
-// This is necessary so that, when nested arrays are used in ajax/post/get methods, square brackets ('[]') are
-// not appended to the identifier of a nested array.
-$.ajaxSettings.traditional = true;
-
-// grid view
-export default Backbone.View.extend({
- // model
- grid: null,
-
- // Initialize
- initialize: function (grid_config) {
- this.grid = new GridModel();
- this.title = grid_config.title;
- this.active_tab = grid_config.active_tab;
- var self = this;
-
- if (grid_config.url_base && !grid_config.items) {
- LoadingIndicator.markViewAsLoading(this);
- var url_data = grid_config.url_data || {};
- _.each(grid_config.filters, (v, k) => {
- url_data[`f-${k}`] = v;
- });
- $.ajax({
- url: `${grid_config.url_base}?${$.param(url_data)}`,
- success: function (response) {
- response.embedded = grid_config.embedded;
- response.filters = grid_config.filters || {};
- self.init_grid(response);
- },
- });
- } else {
- // set element
- this.setElement("");
- this.init_grid(grid_config);
- }
-
- // fix padding
- if (grid_config.use_panels) {
- $("#center").css({
- padding: "10px",
- overflow: "auto",
- });
- }
- },
-
- openAdvancedSearch: function () {
- var isOpen = $("#advanced-search").is(":visible");
- if (!isOpen) {
- $("#standard-search").slideToggle("fast");
- $("#advanced-search").slideToggle("fast");
- }
- },
-
- // refresh frames
- handle_refresh: function (refresh_frames) {
- if (refresh_frames) {
- if ($.inArray("history", refresh_frames) > -1) {
- const Galaxy = getGalaxyInstance();
- if (Galaxy && Galaxy.currHistoryPanel) {
- Galaxy.currHistoryPanel.loadCurrentHistory();
- }
- }
- }
- },
-
- // Initialize
- init_grid: function (grid_config) {
- this.grid.set(grid_config);
-
- // get options
- var options = this.grid.attributes;
-
- if (this.allow_title_display && options.title) {
- Utils.setWindowTitle(options.title);
- }
- // handle refresh requests
- this.handle_refresh(options.refresh_frames);
-
- // strip protocol and domain
- var url = this.grid.get("url_base");
- url = url.replace(/^.*\/\/[^/]+/, "");
- this.grid.set("url_base", url);
-
- // append main template
- this.$el.html(Templates.grid(options));
-
- // add a class identifier for styling purposes
- this.$el.addClass(this.getRootClassName(grid_config));
-
- // update div contents
- this.$el.find("#grid-table-header").html(Templates.header(options));
- this.$el.find("#grid-table-body").html(Templates.body(options));
- this.$el.find("#grid-table-footer").html(Templates.footer(options));
-
- // update message
- if (options.message) {
- this.$el.find("#grid-message").html(Templates.message(options));
- var self = this;
- if (options.use_hide_message) {
- window.setTimeout(() => {
- self.$el.find("#grid-message").html("");
- }, 5000);
- }
- }
-
- // configure elements
- this.init_grid_elements();
- this.init_grid_controls();
-
- // attach global event handler
- // TODO: redundant (the onload/standard page handlers do this) - but needed because these are constructed after page ready
- init_refresh_on_change();
- },
-
- // Initialize grid controls
- init_grid_controls: function () {
- // link
- var self = this;
-
- // Initialize grid operation button.
- this.$el.find(".operation-button").each(function () {
- $(this).off();
- $(this).click(function () {
- self.submit_operation(this);
- return false;
- });
- });
-
- // Initialize text filters to select text on click and use normal font when user is typing.
- this.$el.find("input[type=text]").each(function () {
- $(this).off();
- $(this)
- .click(function () {
- $(this).select();
- })
- .keyup(function () {
- $(this).css("font-style", "normal");
- });
- });
-
- // Initialize sort links.
- this.$el.find(".sort-link").each(function () {
- $(this).off();
- $(this).click(function () {
- self.set_sort_condition($(this).attr("sort_key"));
- return false;
- });
- });
-
- // Initialize text filters.
- this.$el.find(".text-filter-form").each(function () {
- $(this).off();
- $(this).submit(function () {
- var column_key = $(this).attr("column_key");
- var text_input_obj = $(`#input-${column_key}-filter`);
- var text_input = text_input_obj.val();
- text_input_obj.val("");
- self.add_filter_condition(column_key, text_input);
- return false;
- });
- });
-
- // Initialize categorical filters.
- this.$el.find(".text-filter-val > a").each(function () {
- $(this).off();
- $(this).click(function () {
- // Remove visible element.
- $(this).parent().remove();
-
- // Remove filter condition.
- self.remove_filter_condition($(this).attr("filter_key"), $(this).attr("filter_val"));
-
- // Return
- return false;
- });
- });
-
- // Initialize categorical filters.
- this.$el.find(".categorical-filter > a").each(function () {
- $(this).off();
- $(this).click(function () {
- self.set_categorical_filter($(this).attr("filter_key"), $(this).attr("filter_val"));
- return false;
- });
- });
-
- // Initialize standard, advanced search toggles.
- this.$el.find(".advanced-search-toggle").each(function () {
- $(this).off();
- $(this).click(() => {
- self.$el.find("#standard-search").slideToggle("fast");
- self.$el.find("#advanced-search").slideToggle("fast");
- return false;
- });
- });
-
- // Add event to check all box
- this.$el.find("#check_all").off();
- this.$el.find("#check_all").on("click", () => {
- self.check_all_items();
- });
- },
-
- // Initialize grid elements.
- init_grid_elements: function () {
- // Initialize grid selection checkboxes.
- this.$el.find(".grid").each(function () {
- var checkboxes = $(this).find("input.grid-row-select-checkbox");
- var check_count = $(this).find("span.grid-selected-count");
- var update_checked = () => {
- check_count.text($(checkboxes).filter(":checked").length);
- };
-
- $(checkboxes).each(function () {
- $(this).change(update_checked);
- });
- update_checked();
- });
-
- // Initialize ratings.
- if (this.$el.find(".community_rating_star").length !== 0) {
- this.$el.find(".community_rating_star").rating({});
- }
-
- // get options
- var options = this.grid.attributes;
- var self = this;
-
- //
- // add page click events
- //
- this.$el.find(".page-link-grid > a").each(function () {
- $(this).click(function () {
- self.set_page($(this).attr("page_num"));
- return false;
- });
- });
-
- //
- // add inbound/outbound events
- //
- this.$el.find(".use-target").each(function () {
- $(this).click(function () {
- self.execute({
- href: $(this).attr("href"),
- target: $(this).attr("target"),
- });
- return false;
- });
- });
-
- // empty grid?
- var items_length = options.items.length;
- if (items_length === 0) {
- return;
- }
-
- // add operation popup menus
- _.each(options.items, (item, index) => {
- var button = self.$(`#grid-${item.encode_id}-popup`).off();
- var popup = new PopupMenu(button);
- _.each(options.operations, (operation) => {
- self.add_operation(popup, operation, item);
- });
- });
- },
-
- /** Add an operation to the items menu */
- add_operation: function (popup, operation, item) {
- var self = this;
- var settings = item.operation_config[operation.label];
- if (settings.allowed && operation.allow_popup) {
- popup.addItem({
- html: operation.label,
- href: settings.url_args,
- target: settings.target,
- confirmation_text: operation.confirm,
- func: function (e) {
- e.preventDefault();
- var label = $(e.target).html();
- if (operation.onclick) {
- operation.onclick(item.encode_id);
- } else {
- self.execute(this.findItemByHtml(label));
- }
- },
- });
- }
- },
-
- // Add a condition to the grid filter; this adds the condition and refreshes the grid.
- add_filter_condition: function (name, value) {
- // Do nothing is value is empty.
- if (value === "") {
- return false;
- }
-
- // Add condition to grid.
- this.grid.add_filter(name, value, true);
-
- this.render_filter_button(name, value);
-
- // execute
- this.go_page_one();
- this.execute();
- },
-
- render_filter_button: function (name, value) {
- // Add button that displays filter and provides a button to delete it.
- var t = $(Templates.filter_element(name, value));
- var self = this;
- t.click(function () {
- // Remove visible element.
- $(this).remove();
-
- // Remove filter condition.
- self.remove_filter_condition(name, value);
- });
-
- // append to container
- var container = this.$el.find(`#${name}-filtering-criteria`);
- container.append(t);
- },
-
- // Remove a condition to the grid filter; this adds the condition and refreshes the grid.
- remove_filter_condition: function (name, value) {
- // Remove filter condition.
- this.grid.remove_filter(name, value);
-
- // Execute
- this.go_page_one();
- this.execute();
- },
-
- // Set sort condition for grid.
- set_sort_condition: function (col_key) {
- // Set new sort condition. New sort is col_key if sorting new column; if reversing sort on
- // currently sorted column, sort is reversed.
- var cur_sort = this.grid.get("sort_key");
- var new_sort = col_key;
- if (cur_sort.indexOf(col_key) !== -1) {
- // Reverse sort.
- if (cur_sort.substring(0, 1) !== "-") {
- new_sort = `-${col_key}`;
- }
- }
-
- // Remove sort arrows elements.
- this.$el.find(".sort-arrow").remove();
-
- // Add sort arrow element to new sort column.
- var sort_arrow = new_sort.substring(0, 1) == "-" ? "↑" : "↓";
- var t = $(`
${sort_arrow}`).addClass("sort-arrow");
-
- // Add to header
- this.$el.find(`#${col_key}-header`).append(t);
-
- // Update grid.
- this.grid.set("sort_key", new_sort);
- this.go_page_one();
- this.execute();
- },
-
- // Set new value for categorical filter.
- set_categorical_filter: function (name, new_value) {
- // Update filter hyperlinks to reflect new filter value.
- var category_filter = this.grid.get("categorical_filters")[name];
-
- var cur_value = this.grid.get("filters")[name];
- var self = this;
- this.$el.find(`.${name}-filter`).each(function () {
- var text = $.trim($(this).text());
- var filter = category_filter[text];
- var filter_value = filter[name];
- if (filter_value == new_value) {
- // Remove filter link since grid will be using this filter. It is assumed that
- // this element has a single child, a hyperlink/anchor with text.
- $(this).empty();
- $(this).addClass("current-filter");
- $(this).append(text);
- } else if (filter_value == cur_value) {
- // Add hyperlink for this filter since grid will no longer be using this filter. It is assumed that
- // this element has a single child, a hyperlink/anchor.
- $(this).empty();
- var t = $(`
${text}`);
- t.click(() => {
- self.set_categorical_filter(name, filter_value);
- });
- $(this).removeClass("current-filter");
- $(this).append(t);
- }
- });
-
- // Update grid.
- this.grid.add_filter(name, new_value);
- this.go_page_one();
- this.execute();
- },
-
- // Set page to view.
- set_page: function (new_page) {
- // Update page hyperlink to reflect new page.
- var self = this;
- this.$el.find(".page-link").each(function () {
- var id = $(this).attr("id");
-
- var // Id has form 'page-link-
- page_num = parseInt(id.split("-")[2], 10);
-
- var cur_page = self.grid.get("cur_page");
- var text;
- if (page_num === new_page) {
- // Remove link to page since grid will be on this page. It is assumed that
- // this element has a single child, a hyperlink/anchor with text.
- text = $(this).children().text();
- $(this).empty();
- $(this).addClass("inactive-link");
- $(this).text(text);
- } else if (page_num === cur_page) {
- // Add hyperlink to this page since grid will no longer be on this page. It is assumed that
- // this element has a single child, a hyperlink/anchor.
- text = $(this).text();
- $(this).empty();
- $(this).removeClass("inactive-link");
- var t = $(`${text}`);
- t.click(() => {
- self.set_page(page_num);
- });
- $(this).append(t);
- }
- });
-
- if (new_page === "all") {
- this.grid.set("cur_page", new_page);
- } else {
- this.grid.set("cur_page", parseInt(new_page, 10));
- }
- this.execute();
- },
-
- // confirmation/submission of operation request
- submit_operation: function (operation_button, confirmation_text) {
- // identify operation
- var operation_name = $(operation_button).val();
-
- // verify any item is selected
- var number_of_checked_ids = this.$el.find('input[name="id"]:checked').length;
- if (number_of_checked_ids < 1) {
- return false;
- }
-
- // Check to see if there's grid confirmation text for this operation
- var operation = _.findWhere(this.grid.attributes.operations, {
- label: operation_name,
- });
- if (operation && !confirmation_text) {
- confirmation_text = operation.confirm || "";
- }
-
- // collect ids
- var item_ids = [];
- this.$el.find("input[name=id]:checked").each(function () {
- item_ids.push($(this).val());
- });
-
- // execute operation
- var options = {
- operation: operation_name,
- id: item_ids,
- confirmation_text: confirmation_text,
- };
- if (operation.target == "top" || operation.target == "center") {
- options = _.extend(options, {
- href: operation.href,
- target: operation.target,
- });
- }
- this.execute(options);
- return true;
- },
-
- check_all_items: function () {
- var check = this.$(".grid-row-select-checkbox");
- var state = this.$("#check_all").prop("checked");
- _.each(check, (c) => {
- $(c).prop("checked", state);
- });
- this.init_grid_elements();
- },
-
- // Go back to page one; this is useful when a filter is applied.
- go_page_one: function () {
- // Need to go back to page 1 if not showing all.
- var cur_page = this.grid.get("cur_page");
- if (cur_page !== null && cur_page !== undefined && cur_page !== "all") {
- this.grid.set("cur_page", 1);
- }
- },
-
- //
- // execute operations and hyperlink requests
- //
- execute: function (options) {
- // get url
- var id = null;
- var href = null;
- var operation = null;
- var confirmation_text = null;
- var target = null;
-
- // check for options
- if (options) {
- // get options
- href = options.href;
- operation = options.operation;
- id = options.id;
- confirmation_text = options.confirmation_text;
- target = options.target;
-
- // check if input contains the operation tag
- if (href !== undefined && href.indexOf("operation=") != -1) {
- // Get operation, id in hyperlink's href.
- var href_parts = href.split("?");
- if (href_parts.length > 1) {
- var href_parms_str = href_parts[1];
- var href_parms = href_parms_str.split("&");
- for (var index = 0; index < href_parms.length; index++) {
- if (href_parms[index].indexOf("operation") != -1) {
- // Found operation parm; get operation value.
- operation = href_parms[index].split("=")[1];
- operation = operation.replace(/\+/g, " ");
- } else if (href_parms[index].indexOf("id") != -1) {
- // Found id parm; get id value.
- id = href_parms[index].split("=")[1];
- }
- }
- }
- }
- }
-
- // check for operation details
- if (operation && id) {
- // show confirmation box
- if (
- confirmation_text &&
- confirmation_text !== "" &&
- confirmation_text != "None" &&
- confirmation_text != "null"
- ) {
- if (!window.confirm(confirmation_text)) {
- return false;
- }
- }
-
- // use small characters for operation?!
- operation = operation.toLowerCase();
-
- // Update grid.
- this.grid.set({
- operation: operation,
- item_ids: id,
- });
-
- // Do operation. If operation cannot be performed asynchronously, redirect to location.
- if (target == "top") {
- window.top.location = `${href}?${$.param(this.grid.get_url_data())}`;
- } else if (target == "center") {
- $("#galaxy_main").attr("src", `${href}?${$.param(this.grid.get_url_data())}`);
- } else {
- this.update_grid();
- }
-
- // done
- return false;
- }
-
- // refresh grid
- if (href) {
- this.go_to(target, href);
- return false;
- }
-
- // refresh grid
- this.update_grid();
-
- // done
- return false;
- },
-
- // go to url
- go_to: function (target, href) {
- // get slide status
- var advanced_search = this.$el.find("#advanced-search").is(":visible");
- this.grid.set("advanced_search", advanced_search);
-
- // get default url
- if (!href) {
- href = `${this.grid.get("url_base")}?${$.param(this.grid.get_url_data())}`;
- }
-
- // clear grid of transient request attributes.
- this.grid.set({
- operation: undefined,
- item_ids: undefined,
- });
- switch (target) {
- case "center":
- $("#galaxy_main").attr("src", href);
- break;
- case "top":
- window.top.location = href;
- break;
- default:
- window.location = href;
- }
- },
-
- // Update grid.
- update_grid: function () {
- // If there's an operation, do POST; otherwise, do GET.
- var method = this.grid.get("operation") ? "POST" : "GET";
-
- // Show overlay to indicate loading and prevent user actions.
- this.$el.find(".loading-elt-overlay").show();
- var self = this;
- $.ajax({
- type: method,
- url: self.grid.get("url_base"),
- data: self.grid.get_url_data(),
- error: function () {
- alert("Grid refresh failed");
- },
- success: function (response_text) {
- // backup
- var embedded = self.grid.get("embedded");
- var insert = self.grid.get("insert");
- var advanced_search = self.$el.find("#advanced-search").is(":visible");
-
- // request new configuration
- var json = response_text;
-
- // update
- json.embedded = embedded;
- json.insert = insert;
- json.advanced_search = advanced_search;
-
- // Initialize new grid config
- self.init_grid(json);
-
- // Hide loading overlay.
- self.$el.find(".loading-elt-overlay").hide();
- },
- complete: function () {
- // Clear grid of transient request attributes.
- self.grid.set({
- operation: undefined,
- item_ids: undefined,
- });
- },
- });
- },
-
- // Generates a class name at the root of the view that we can
- // use for conditional styling in the various kinds of grids
- // instead of acres of if/then statements in javascript
- getRootClassName({ title = "grid" }) {
- return slugify(title).toLowerCase();
- },
-});