Skip to content

Commit c896259

Browse files
authored
Merge pull request #22229 from mvdbeek/fix-data-table-reload-admin-interface
[25.1] Use ``/api/tool_data`` endpoints in DataTables.vue & DataManagerTable.vue
2 parents 4a8d646 + 61e2b81 commit c896259

3 files changed

Lines changed: 60 additions & 159 deletions

File tree

client/src/components/admin/DataManager/DataManagerTable.vue

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
<div>
33
<b-breadcrumb v-if="dataTable && !loading" id="breadcrumb" :items="breadcrumbItems" />
44
<Alert :message="message" :variant="status" />
5-
<Alert v-if="viewOnly" message="Not implemented" variant="dark" />
6-
<Alert v-else-if="loading" message="Waiting for data" status="info" />
5+
<Alert v-if="loading" message="Waiting for data" status="info" />
76
<Alert
87
v-else-if="dataTable && !dataTable['data'].length"
98
message="There are currently no entries in this tool data table."
@@ -40,8 +39,7 @@
4039
</template>
4140

4241
<script>
43-
import axios from "axios";
44-
import { getAppRoot } from "onload/loadConfig";
42+
import { GalaxyApi } from "@/api";
4543
4644
import GButton from "@/components/BaseComponents/GButton.vue";
4745
import Alert from "components/Alert.vue";
@@ -60,7 +58,6 @@ export default {
6058
data() {
6159
return {
6260
dataTable: {},
63-
viewOnly: false,
6461
message: "",
6562
status: "",
6663
loading: true,
@@ -85,37 +82,42 @@ export default {
8582
];
8683
},
8784
},
88-
created() {
89-
axios
90-
.get(`${getAppRoot()}data_manager/tool_data_table_info?table_name=${this.name}`)
91-
.then((response) => {
92-
this.dataTable = response.data.dataTable;
93-
this.viewOnly = response.data.viewOnly;
94-
this.message = response.data.message;
95-
this.status = response.data.status;
96-
this.loading = false;
97-
})
98-
.catch((error) => {
99-
console.error(error);
100-
});
85+
async created() {
86+
const { data, error } = await GalaxyApi().GET("/api/tool_data/{table_name}", {
87+
params: { path: { table_name: this.name } },
88+
});
89+
if (error) {
90+
this.message = error.err_msg || "Failed to load tool data table.";
91+
this.status = "error";
92+
} else {
93+
this.dataTable = {
94+
name: data.name,
95+
columns: data.columns,
96+
data: data.fields,
97+
};
98+
}
99+
this.loading = false;
101100
},
102101
methods: {
103102
fields(columns) {
104103
return columns.map((elem, index) => ({ key: index.toString(), label: elem }));
105104
},
106-
reload() {
107-
axios
108-
.get(`${getAppRoot()}data_manager/reload_tool_data_tables?table_name=${this.dataTableName}`)
109-
.then((response) => {
110-
if (response.data.dataTable) {
111-
this.dataTable = response.data.dataTable;
112-
}
113-
this.message = response.data.message;
114-
this.status = response.data.status;
115-
})
116-
.catch((error) => {
117-
console.error(error);
118-
});
105+
async reload() {
106+
const { data, error } = await GalaxyApi().GET("/api/tool_data/{table_name}/reload", {
107+
params: { path: { table_name: this.dataTableName } },
108+
});
109+
if (error) {
110+
this.message = error.err_msg || "Failed to reload tool data table.";
111+
this.status = "error";
112+
} else {
113+
this.dataTable = {
114+
name: data.name,
115+
columns: data.columns,
116+
data: data.fields,
117+
};
118+
this.message = `Reloaded data table '${data.name}'.`;
119+
this.status = "done";
120+
}
119121
},
120122
},
121123
};

client/src/components/admin/DataTables.vue

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import axios from "axios";
1717
import { getAppRoot } from "onload/loadConfig";
1818
19+
import { GalaxyApi } from "@/api";
20+
1921
import Message from "../Message.vue";
2022
import DataManagerGrid from "./DataManagerGrid.vue";
2123
import DataTablesGrid from "./DataTablesGrid.vue";
@@ -76,45 +78,41 @@ export default {
7678
7779
methods: {
7880
showDataManager(dataManagerTableName) {
79-
axios
80-
.get(`${getAppRoot()}data_manager/tool_data_table_items`, {
81-
params: {
82-
table_name: dataManagerTableName,
83-
},
81+
GalaxyApi()
82+
.GET("/api/tool_data/{table_name}", {
83+
params: { path: { table_name: dataManagerTableName } },
8484
})
85-
.then((response) => {
86-
this.message = response.data.message;
87-
this.status = response.data.status;
88-
89-
if (response.data.status !== "error" && response.data.status !== "warning") {
85+
.then(({ data, error }) => {
86+
if (error) {
87+
this.message = error.err_msg || "Failed to load tool data table.";
88+
this.status = "error";
89+
} else {
9090
this.dataManagerTableName = dataManagerTableName;
91-
this.dataManagerColumns = response.data.data.columns;
92-
this.dataManagerItems = response.data.data.items;
91+
this.dataManagerColumns = data.columns;
92+
this.dataManagerItems = data.fields.map((row) =>
93+
Object.fromEntries(data.columns.map((col, i) => [col, row[i]])),
94+
);
9395
this.currentView = "data-manager-grid";
9496
}
95-
})
96-
.catch((error) => {
97-
console.error(error);
9897
});
9998
},
10099
101100
reloadDataManager(dataManagerTableName) {
102-
axios
103-
.get(`${getAppRoot()}data_manager/reload_tool_data_table`, {
104-
params: {
105-
table_name: dataManagerTableName,
106-
},
101+
GalaxyApi()
102+
.GET("/api/tool_data/{table_name}/reload", {
103+
params: { path: { table_name: dataManagerTableName } },
107104
})
108-
.then((response) => {
109-
this.message = response.data.message;
110-
this.status = response.data.status;
111-
112-
if (response.data.status !== "error" && response.data.status !== "warning") {
113-
this.dataManagerItems = response.data.data.items;
105+
.then(({ data, error }) => {
106+
if (error) {
107+
this.message = error.err_msg || "Failed to reload tool data table.";
108+
this.status = "error";
109+
} else {
110+
this.dataManagerItems = data.fields.map((row) =>
111+
Object.fromEntries(data.columns.map((col, i) => [col, row[i]])),
112+
);
113+
this.message = `Reloaded data table '${dataManagerTableName}'.`;
114+
this.status = "done";
114115
}
115-
})
116-
.catch((error) => {
117-
console.error(error);
118116
});
119117
},
120118
},

lib/galaxy/webapps/galaxy/controllers/data_manager.py

Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -164,102 +164,3 @@ def job_info(self, trans, **kwd):
164164
"message": message,
165165
"status": status,
166166
}
167-
168-
@web.expose
169-
@web.json
170-
def tool_data_table_info(self, trans, **kwd):
171-
return self.tool_data_table_info_1(trans, **kwd)
172-
173-
def tool_data_table_info_1(self, trans, **kwd):
174-
not_is_admin = not trans.user_is_admin
175-
if not_is_admin and not trans.app.config.enable_data_manager_user_view:
176-
raise paste.httpexceptions.HTTPUnauthorized(
177-
"This Galaxy instance is not configured to allow non-admins to view the data manager."
178-
)
179-
message = kwd.get("message", "")
180-
status = kwd.get("status", "info")
181-
data_table_name = kwd.get("table_name", None)
182-
if not data_table_name:
183-
return {"message": "No data table was requested.", "status": "error"}
184-
data_table = trans.app.tool_data_tables.get(data_table_name, None)
185-
if data_table is None:
186-
return {"message": f"Invalid data table '{data_table_name}' was requested.", "status": "error"}
187-
return {
188-
"dataTable": {
189-
"name": data_table.name,
190-
"columns": data_table.get_column_name_list(),
191-
"data": data_table.data,
192-
},
193-
"viewOnly": not_is_admin,
194-
"message": message,
195-
"status": status,
196-
}
197-
198-
@web.expose
199-
@web.json
200-
@web.require_admin
201-
def reload_tool_data_tables(self, trans, table_name=None, **kwd):
202-
if table_name and isinstance(table_name, str):
203-
table_name = table_name.split(",")
204-
# Reload the tool data tables
205-
table_names = self.app.tool_data_tables.reload_tables(table_names=table_name)
206-
trans.app.queue_worker.send_control_task(
207-
"reload_tool_data_tables", noop_self=True, kwargs={"table_name": table_name}
208-
)
209-
data = None
210-
if table_names:
211-
message = "Reloaded data table{} '{}'.".format("s"[len(table_names) == 1 :], ", ".join(table_names))
212-
data = self.tool_data_table_info_1(trans, table_name=table_names[0], message=message, status="done")
213-
else:
214-
data = {"message": "No data tables have been reloaded.", "status": "error"}
215-
return data
216-
217-
@web.expose
218-
@web.json
219-
@web.require_admin
220-
def tool_data_table_items(self, trans, **kwd):
221-
data = {"columns": [], "items": []}
222-
message = kwd.get("message", "")
223-
status = kwd.get("status", "info")
224-
table_name = kwd.get("table_name", None)
225-
226-
if not table_name:
227-
return {
228-
"data": data,
229-
"message": "No Data table name provided.",
230-
"status": "warning",
231-
}
232-
233-
data_table = trans.app.tool_data_tables.get(table_name, None)
234-
235-
if data_table is None:
236-
return {"data": data, "message": f"Invalid Data table ({table_name}) was requested", "status": "error"}
237-
238-
columns = data_table.get_column_name_list()
239-
rows = [dict(zip(columns, table_row)) for table_row in data_table.data]
240-
data["columns"] = columns
241-
data["items"] = rows
242-
243-
return {"data": data, "message": message, "status": status}
244-
245-
@web.expose
246-
@web.json
247-
@web.require_admin
248-
def reload_tool_data_table(self, trans, **kwd):
249-
table_name = kwd.get("table_name", None)
250-
251-
if not table_name:
252-
return {
253-
"message": "No data table has been reloaded.",
254-
"status": "error",
255-
}
256-
257-
redirect_url = web.url_for(
258-
controller="data_manager",
259-
action="tool_data_table_items",
260-
table_name=table_name,
261-
message=f'The data table "{table_name}" has been reloaded.',
262-
status="done",
263-
)
264-
265-
return trans.response.send_redirect(redirect_url)

0 commit comments

Comments
 (0)