OAPI: include all info for the jobs table in the JobUpdate
schema
By having all info for the jobs table in the `JobUpdate` schema, it won't have to query for the full job when a new job is added. This fetching of the full job is now delayed until someone clicks on the table row.
This commit is contained in:
parent
3ab1e9a450
commit
e672289a11
@ -10,7 +10,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
__version__ = "930d7497-dirty"
|
__version__ = "61618531-dirty"
|
||||||
|
|
||||||
# import ApiClient
|
# import ApiClient
|
||||||
from flamenco.manager.api_client import ApiClient
|
from flamenco.manager.api_client import ApiClient
|
||||||
|
@ -76,7 +76,7 @@ class ApiClient(object):
|
|||||||
self.default_headers[header_name] = header_value
|
self.default_headers[header_name] = header_value
|
||||||
self.cookie = cookie
|
self.cookie = cookie
|
||||||
# Set default User-Agent.
|
# Set default User-Agent.
|
||||||
self.user_agent = 'Flamenco/930d7497-dirty (Blender add-on)'
|
self.user_agent = 'Flamenco/61618531-dirty (Blender add-on)'
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
return self
|
return self
|
||||||
|
@ -404,7 +404,7 @@ conf = flamenco.manager.Configuration(
|
|||||||
"OS: {env}\n"\
|
"OS: {env}\n"\
|
||||||
"Python Version: {pyversion}\n"\
|
"Python Version: {pyversion}\n"\
|
||||||
"Version of the API: 1.0.0\n"\
|
"Version of the API: 1.0.0\n"\
|
||||||
"SDK Package Version: 930d7497-dirty".\
|
"SDK Package Version: 61618531-dirty".\
|
||||||
format(env=sys.platform, pyversion=sys.version)
|
format(env=sys.platform, pyversion=sys.version)
|
||||||
|
|
||||||
def get_host_settings(self):
|
def get_host_settings(self):
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# JobUpdate
|
# JobUpdate
|
||||||
|
|
||||||
|
Subset of a Job, sent over SocketIO when a job changes. For new jobs, `previous_status` will be excluded.
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
Name | Type | Description | Notes
|
Name | Type | Description | Notes
|
||||||
@ -7,6 +8,8 @@ Name | Type | Description | Notes
|
|||||||
**id** | **str** | UUID of the Job |
|
**id** | **str** | UUID of the Job |
|
||||||
**updated** | **datetime** | Timestamp of last update |
|
**updated** | **datetime** | Timestamp of last update |
|
||||||
**status** | [**JobStatus**](JobStatus.md) | |
|
**status** | [**JobStatus**](JobStatus.md) | |
|
||||||
|
**type** | **str** | |
|
||||||
|
**priority** | **int** | | defaults to 50
|
||||||
**name** | **str** | Name of the job | [optional]
|
**name** | **str** | Name of the job | [optional]
|
||||||
**previous_status** | [**JobStatus**](JobStatus.md) | | [optional]
|
**previous_status** | [**JobStatus**](JobStatus.md) | | [optional]
|
||||||
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
|
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
|
||||||
|
@ -90,6 +90,8 @@ class JobUpdate(ModelNormal):
|
|||||||
'id': (str,), # noqa: E501
|
'id': (str,), # noqa: E501
|
||||||
'updated': (datetime,), # noqa: E501
|
'updated': (datetime,), # noqa: E501
|
||||||
'status': (JobStatus,), # noqa: E501
|
'status': (JobStatus,), # noqa: E501
|
||||||
|
'type': (str,), # noqa: E501
|
||||||
|
'priority': (int,), # noqa: E501
|
||||||
'name': (str,), # noqa: E501
|
'name': (str,), # noqa: E501
|
||||||
'previous_status': (JobStatus,), # noqa: E501
|
'previous_status': (JobStatus,), # noqa: E501
|
||||||
}
|
}
|
||||||
@ -103,6 +105,8 @@ class JobUpdate(ModelNormal):
|
|||||||
'id': 'id', # noqa: E501
|
'id': 'id', # noqa: E501
|
||||||
'updated': 'updated', # noqa: E501
|
'updated': 'updated', # noqa: E501
|
||||||
'status': 'status', # noqa: E501
|
'status': 'status', # noqa: E501
|
||||||
|
'type': 'type', # noqa: E501
|
||||||
|
'priority': 'priority', # noqa: E501
|
||||||
'name': 'name', # noqa: E501
|
'name': 'name', # noqa: E501
|
||||||
'previous_status': 'previous_status', # noqa: E501
|
'previous_status': 'previous_status', # noqa: E501
|
||||||
}
|
}
|
||||||
@ -114,15 +118,17 @@ class JobUpdate(ModelNormal):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@convert_js_args_to_python_args
|
@convert_js_args_to_python_args
|
||||||
def _from_openapi_data(cls, id, updated, status, *args, **kwargs): # noqa: E501
|
def _from_openapi_data(cls, id, updated, status, type, *args, **kwargs): # noqa: E501
|
||||||
"""JobUpdate - a model defined in OpenAPI
|
"""JobUpdate - a model defined in OpenAPI
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
id (str): UUID of the Job
|
id (str): UUID of the Job
|
||||||
updated (datetime): Timestamp of last update
|
updated (datetime): Timestamp of last update
|
||||||
status (JobStatus):
|
status (JobStatus):
|
||||||
|
type (str):
|
||||||
|
|
||||||
Keyword Args:
|
Keyword Args:
|
||||||
|
priority (int): defaults to 50 # noqa: E501
|
||||||
_check_type (bool): if True, values for parameters in openapi_types
|
_check_type (bool): if True, values for parameters in openapi_types
|
||||||
will be type checked and a TypeError will be
|
will be type checked and a TypeError will be
|
||||||
raised if the wrong type is input.
|
raised if the wrong type is input.
|
||||||
@ -157,6 +163,7 @@ class JobUpdate(ModelNormal):
|
|||||||
previous_status (JobStatus): [optional] # noqa: E501
|
previous_status (JobStatus): [optional] # noqa: E501
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
priority = kwargs.get('priority', 50)
|
||||||
_check_type = kwargs.pop('_check_type', True)
|
_check_type = kwargs.pop('_check_type', True)
|
||||||
_spec_property_naming = kwargs.pop('_spec_property_naming', False)
|
_spec_property_naming = kwargs.pop('_spec_property_naming', False)
|
||||||
_path_to_item = kwargs.pop('_path_to_item', ())
|
_path_to_item = kwargs.pop('_path_to_item', ())
|
||||||
@ -185,6 +192,8 @@ class JobUpdate(ModelNormal):
|
|||||||
self.id = id
|
self.id = id
|
||||||
self.updated = updated
|
self.updated = updated
|
||||||
self.status = status
|
self.status = status
|
||||||
|
self.type = type
|
||||||
|
self.priority = priority
|
||||||
for var_name, var_value in kwargs.items():
|
for var_name, var_value in kwargs.items():
|
||||||
if var_name not in self.attribute_map and \
|
if var_name not in self.attribute_map and \
|
||||||
self._configuration is not None and \
|
self._configuration is not None and \
|
||||||
@ -205,15 +214,17 @@ class JobUpdate(ModelNormal):
|
|||||||
])
|
])
|
||||||
|
|
||||||
@convert_js_args_to_python_args
|
@convert_js_args_to_python_args
|
||||||
def __init__(self, id, updated, status, *args, **kwargs): # noqa: E501
|
def __init__(self, id, updated, status, type, *args, **kwargs): # noqa: E501
|
||||||
"""JobUpdate - a model defined in OpenAPI
|
"""JobUpdate - a model defined in OpenAPI
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
id (str): UUID of the Job
|
id (str): UUID of the Job
|
||||||
updated (datetime): Timestamp of last update
|
updated (datetime): Timestamp of last update
|
||||||
status (JobStatus):
|
status (JobStatus):
|
||||||
|
type (str):
|
||||||
|
|
||||||
Keyword Args:
|
Keyword Args:
|
||||||
|
priority (int): defaults to 50 # noqa: E501
|
||||||
_check_type (bool): if True, values for parameters in openapi_types
|
_check_type (bool): if True, values for parameters in openapi_types
|
||||||
will be type checked and a TypeError will be
|
will be type checked and a TypeError will be
|
||||||
raised if the wrong type is input.
|
raised if the wrong type is input.
|
||||||
@ -248,6 +259,7 @@ class JobUpdate(ModelNormal):
|
|||||||
previous_status (JobStatus): [optional] # noqa: E501
|
previous_status (JobStatus): [optional] # noqa: E501
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
priority = kwargs.get('priority', 50)
|
||||||
_check_type = kwargs.pop('_check_type', True)
|
_check_type = kwargs.pop('_check_type', True)
|
||||||
_spec_property_naming = kwargs.pop('_spec_property_naming', False)
|
_spec_property_naming = kwargs.pop('_spec_property_naming', False)
|
||||||
_path_to_item = kwargs.pop('_path_to_item', ())
|
_path_to_item = kwargs.pop('_path_to_item', ())
|
||||||
@ -274,6 +286,8 @@ class JobUpdate(ModelNormal):
|
|||||||
self.id = id
|
self.id = id
|
||||||
self.updated = updated
|
self.updated = updated
|
||||||
self.status = status
|
self.status = status
|
||||||
|
self.type = type
|
||||||
|
self.priority = priority
|
||||||
for var_name, var_value in kwargs.items():
|
for var_name, var_value in kwargs.items():
|
||||||
if var_name not in self.attribute_map and \
|
if var_name not in self.attribute_map and \
|
||||||
self._configuration is not None and \
|
self._configuration is not None and \
|
||||||
|
@ -4,7 +4,7 @@ Render Farm manager API
|
|||||||
The `flamenco.manager` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
|
The `flamenco.manager` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
|
||||||
|
|
||||||
- API version: 1.0.0
|
- API version: 1.0.0
|
||||||
- Package version: 930d7497-dirty
|
- Package version: 61618531-dirty
|
||||||
- Build package: org.openapitools.codegen.languages.PythonClientCodegen
|
- Build package: org.openapitools.codegen.languages.PythonClientCodegen
|
||||||
For more information, please visit [https://flamenco.io/](https://flamenco.io/)
|
For more information, please visit [https://flamenco.io/](https://flamenco.io/)
|
||||||
|
|
||||||
|
@ -14,10 +14,12 @@ import (
|
|||||||
// the caller.
|
// the caller.
|
||||||
func NewJobUpdate(job *persistence.Job) api.JobUpdate {
|
func NewJobUpdate(job *persistence.Job) api.JobUpdate {
|
||||||
jobUpdate := api.JobUpdate{
|
jobUpdate := api.JobUpdate{
|
||||||
Id: job.UUID,
|
Id: job.UUID,
|
||||||
Name: &job.Name,
|
Name: &job.Name,
|
||||||
Updated: job.UpdatedAt,
|
Updated: job.UpdatedAt,
|
||||||
Status: job.Status,
|
Status: job.Status,
|
||||||
|
Type: job.JobType,
|
||||||
|
Priority: job.Priority,
|
||||||
}
|
}
|
||||||
return jobUpdate
|
return jobUpdate
|
||||||
}
|
}
|
||||||
|
@ -910,6 +910,9 @@ components:
|
|||||||
|
|
||||||
JobUpdate:
|
JobUpdate:
|
||||||
type: object
|
type: object
|
||||||
|
description: >
|
||||||
|
Subset of a Job, sent over SocketIO when a job changes.
|
||||||
|
For new jobs, `previous_status` will be excluded.
|
||||||
properties:
|
properties:
|
||||||
"id":
|
"id":
|
||||||
type: string
|
type: string
|
||||||
@ -922,7 +925,9 @@ components:
|
|||||||
description: Timestamp of last update
|
description: Timestamp of last update
|
||||||
"status": {$ref: "#/components/schemas/JobStatus"}
|
"status": {$ref: "#/components/schemas/JobStatus"}
|
||||||
"previous_status": {$ref: "#/components/schemas/JobStatus"}
|
"previous_status": {$ref: "#/components/schemas/JobStatus"}
|
||||||
required: [id, updated, status]
|
"type": {type: string}
|
||||||
|
"priority": {type: integer, default: 50}
|
||||||
|
required: [id, updated, status, type, priority]
|
||||||
|
|
||||||
securitySchemes:
|
securitySchemes:
|
||||||
worker_auth:
|
worker_auth:
|
||||||
|
@ -18,104 +18,105 @@ import (
|
|||||||
// Base64 encoded, gzipped, json marshaled Swagger object
|
// Base64 encoded, gzipped, json marshaled Swagger object
|
||||||
var swaggerSpec = []string{
|
var swaggerSpec = []string{
|
||||||
|
|
||||||
"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",
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSwagger returns the content of the embedded swagger specification file
|
// GetSwagger returns the content of the embedded swagger specification file
|
||||||
|
@ -227,7 +227,7 @@ type JobSettings struct {
|
|||||||
// JobStatus defines model for JobStatus.
|
// JobStatus defines model for JobStatus.
|
||||||
type JobStatus string
|
type JobStatus string
|
||||||
|
|
||||||
// JobUpdate defines model for JobUpdate.
|
// Subset of a Job, sent over SocketIO when a job changes. For new jobs, `previous_status` will be excluded.
|
||||||
type JobUpdate struct {
|
type JobUpdate struct {
|
||||||
// UUID of the Job
|
// UUID of the Job
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
@ -235,7 +235,9 @@ type JobUpdate struct {
|
|||||||
// Name of the job
|
// Name of the job
|
||||||
Name *string `json:"name,omitempty"`
|
Name *string `json:"name,omitempty"`
|
||||||
PreviousStatus *JobStatus `json:"previous_status,omitempty"`
|
PreviousStatus *JobStatus `json:"previous_status,omitempty"`
|
||||||
|
Priority int `json:"priority"`
|
||||||
Status JobStatus `json:"status"`
|
Status JobStatus `json:"status"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
|
||||||
// Timestamp of last update
|
// Timestamp of last update
|
||||||
Updated time.Time `json:"updated"`
|
Updated time.Time `json:"updated"`
|
||||||
|
@ -4,17 +4,17 @@
|
|||||||
<span class='flamenco-version'>version: {{ flamencoVersion }}</span>
|
<span class='flamenco-version'>version: {{ flamencoVersion }}</span>
|
||||||
</header>
|
</header>
|
||||||
<div class="col-1">
|
<div class="col-1">
|
||||||
<jobs-table ref="jobsTable" :apiClient="apiClient" @activeJobChange="onActiveJobChanged" />
|
<jobs-table ref="jobsTable" :apiClient="apiClient" @selectedJobChange="onSelectedJobChanged" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
<job-details :apiClient="apiClient" :jobSummary="activeJobSummary" />
|
<job-details :apiClient="apiClient" :jobData="selectedJob" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-3">
|
<div class="col-3">
|
||||||
<task-details :apiClient="apiClient" />
|
<task-details :apiClient="apiClient" />
|
||||||
</div>
|
</div>
|
||||||
<footer>Footer
|
<footer>Footer
|
||||||
<update-listener ref="updateListener" :websocketURL="websocketURL" @jobUpdate="onJobUpdate" @message="onChatMessage"
|
<update-listener ref="updateListener" :websocketURL="websocketURL" @jobUpdate="onSioJobUpdate"
|
||||||
@sioReconnected="onSIOReconnected" @sioDisconnected="onSIODisconnected" />
|
@message="onChatMessage" @sioReconnected="onSIOReconnected" @sioDisconnected="onSIODisconnected" />
|
||||||
</footer>
|
</footer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ export default {
|
|||||||
websocketURL: urls.ws(),
|
websocketURL: urls.ws(),
|
||||||
messages: [],
|
messages: [],
|
||||||
|
|
||||||
activeJobSummary: {},
|
selectedJob: {},
|
||||||
flamencoName: DEFAULT_FLAMENCO_NAME,
|
flamencoName: DEFAULT_FLAMENCO_NAME,
|
||||||
flamencoVersion: DEFAULT_FLAMENCO_VERSION,
|
flamencoVersion: DEFAULT_FLAMENCO_VERSION,
|
||||||
|
|
||||||
@ -53,23 +53,42 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// UI component event handlers:
|
// UI component event handlers:
|
||||||
onActiveJobChanged(jobSummary) {
|
onSelectedJobChanged(jobSummary) {
|
||||||
this.activeJobSummary = jobSummary;
|
const jobsAPI = new API.JobsApi(this.apiClient);
|
||||||
|
this._wrap(jobsAPI.fetchJob(jobSummary.id))
|
||||||
|
.then((job) => {
|
||||||
|
this.selectedJob = job;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// SocketIO data event handlers:
|
|
||||||
sendMessage(message) {
|
sendMessage(message) {
|
||||||
this.$refs.jobsListener.sendBroadcastMessage("typer", message);
|
this.$refs.jobsListener.sendBroadcastMessage("typer", message);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// SocketIO data event handlers:
|
||||||
|
onSioJobUpdate(jobUpdate) {
|
||||||
|
if (!jobUpdate.previous_status)
|
||||||
|
return this.onJobNew(jobUpdate);
|
||||||
|
return this.onJobUpdate(jobUpdate);
|
||||||
|
},
|
||||||
onJobUpdate(jobUpdate) {
|
onJobUpdate(jobUpdate) {
|
||||||
console.log("job update received:", jobUpdate);
|
// this.messages.push(`Job update: ${jobUpdate.id} (${jobUpdate.previous_status} → ${jobUpdate.status})`);
|
||||||
if (jobUpdate.previous_status) {
|
if (this.$refs.jobsTable) {
|
||||||
this.messages.push(`Job update: ${jobUpdate.id} (${jobUpdate.previous_status} → ${jobUpdate.status})`);
|
|
||||||
this.$refs.jobsTable.processJobUpdate(jobUpdate);
|
this.$refs.jobsTable.processJobUpdate(jobUpdate);
|
||||||
} else {
|
} else {
|
||||||
this.messages.push(`New job: ${jobUpdate.id} (${jobUpdate.status})`);
|
console.warn("App: this.$refs.jobsTable is", this.$refs.jobsTable);
|
||||||
this.$refs.jobsTable.processNewJob(jobUpdate);
|
|
||||||
}
|
}
|
||||||
|
if (this.selectedJob && this.selectedJob.id == jobUpdate.id) {
|
||||||
|
this.onSelectedJobChanged(jobUpdate);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onJobNew(jobUpdate) {
|
||||||
|
if (!this.$refs.jobsTable) {
|
||||||
|
console.warn("App: this.$refs.jobsTable is", this.$refs.jobsTable);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this.messages.push(`New job: ${jobUpdate.id} (${jobUpdate.status})`);
|
||||||
|
this.$refs.jobsTable.processNewJob(jobUpdate);
|
||||||
},
|
},
|
||||||
onChatMessage(message) {
|
onChatMessage(message) {
|
||||||
console.log("chat message received:", message);
|
console.log("chat message received:", message);
|
||||||
|
@ -60,69 +60,20 @@
|
|||||||
<script lang="js">
|
<script lang="js">
|
||||||
import * as datetime from "../datetime";
|
import * as datetime from "../datetime";
|
||||||
|
|
||||||
import {
|
|
||||||
JobsApi,
|
|
||||||
} from '../manager-api'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: [
|
props: [
|
||||||
"apiClient", // Flamenco Manager API client.
|
"apiClient", // Flamenco Manager API client.
|
||||||
|
"jobData", // Job data to show.
|
||||||
// Object, subset of job info, should at least contain an 'id' key. This ID
|
|
||||||
// determines the job that's shown here. The rest of the fields are used to
|
|
||||||
// initialise the details until the full job has been fetched from the API.
|
|
||||||
"jobSummary",
|
|
||||||
],
|
],
|
||||||
data: () => {
|
data: () => {
|
||||||
return {
|
return {
|
||||||
jobData: {},
|
datetime: datetime, // So that the template can access it.
|
||||||
datetime: datetime,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
// Allow testing from the JS console:
|
// Allow testing from the JS console:
|
||||||
window.jobDetailsVue = this;
|
window.jobDetailsVue = this;
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
jobSummary(newSummary, oldSummary) {
|
|
||||||
console.log("Updating job details:", JSON.parse(JSON.stringify(newSummary)));
|
|
||||||
this.jobData = newSummary;
|
|
||||||
// TODO later: Fetch the rest of the job. This isn't necessary now,
|
|
||||||
// because the jobs table already performs the fetch and the "summary" is
|
|
||||||
// actually the entire job. If this changes, this is the place to trigger
|
|
||||||
// an actual fetch.
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
onReconnected() {
|
|
||||||
// If the connection to the backend was lost, we have likely missed some
|
|
||||||
// updates. Just fetch the data and start from scratch.
|
|
||||||
this.fetchJob();
|
|
||||||
},
|
|
||||||
fetchJob() {
|
|
||||||
if (!this.apiClient) {
|
|
||||||
throw "no apiClient set on JobDetails component";
|
|
||||||
}
|
|
||||||
if (!this.jobSummary || !this.jobSummary.id) {
|
|
||||||
// no job selected, which is fine.
|
|
||||||
this.clearJobDetails();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const jobsApi = new JobsApi(this.apiClient);
|
|
||||||
const jobID = this.jobSummary.id;
|
|
||||||
jobsApi.fetchJob(jobID).then(this.onJobFetched, function (error) {
|
|
||||||
// TODO: error handling.
|
|
||||||
console.error(error);
|
|
||||||
});
|
|
||||||
return jobID;
|
|
||||||
},
|
|
||||||
onJobFetched(data) {
|
|
||||||
console.log("Job fetched:", data);
|
|
||||||
},
|
|
||||||
clearJobDetails() {
|
|
||||||
this.jobData = {};
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -5,13 +5,10 @@
|
|||||||
<script lang="js">
|
<script lang="js">
|
||||||
import { TabulatorFull as Tabulator } from 'tabulator-tables';
|
import { TabulatorFull as Tabulator } from 'tabulator-tables';
|
||||||
import * as datetime from "../datetime";
|
import * as datetime from "../datetime";
|
||||||
|
import * as API from '../manager-api'
|
||||||
import {
|
|
||||||
JobsApi,
|
|
||||||
} from '../manager-api'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
emits: ["activeJobChange"],
|
emits: ["selectedJobChange"],
|
||||||
props: ["apiClient"],
|
props: ["apiClient"],
|
||||||
data: () => {
|
data: () => {
|
||||||
const options = {
|
const options = {
|
||||||
@ -69,7 +66,7 @@ export default {
|
|||||||
if (!this.apiClient) {
|
if (!this.apiClient) {
|
||||||
throw "no apiClient set on JobsTable component";
|
throw "no apiClient set on JobsTable component";
|
||||||
}
|
}
|
||||||
const jobsApi = new JobsApi(this.apiClient);
|
const jobsApi = new API.JobsApi(this.apiClient);
|
||||||
const jobsQuery = {};
|
const jobsQuery = {};
|
||||||
jobsApi.queryJobs(jobsQuery).then(this.onJobsFetched, function (error) {
|
jobsApi.queryJobs(jobsQuery).then(this.onJobsFetched, function (error) {
|
||||||
// TODO: error handling.
|
// TODO: error handling.
|
||||||
@ -87,25 +84,15 @@ export default {
|
|||||||
.then(this.sortData);
|
.then(this.sortData);
|
||||||
},
|
},
|
||||||
processNewJob(jobUpdate) {
|
processNewJob(jobUpdate) {
|
||||||
// The update doesn't have all the info we need, so just fetch the job via
|
this.tabulator.addData([jobUpdate])
|
||||||
// an API call. If this is ever changed, and the jobUpdate does have
|
.then(this.sortData);
|
||||||
// everything needed for this table, JobDetails.vue also needs to be
|
|
||||||
// adjusted for this.
|
|
||||||
const jobsApi = new JobsApi(this.apiClient);
|
|
||||||
jobsApi.fetchJob(jobUpdate.id).then((job) => {
|
|
||||||
console.log("Fetched job:", JSON.parse(JSON.stringify(job)));
|
|
||||||
this.tabulator.addData([job])
|
|
||||||
.then(this.sortData);
|
|
||||||
}, (error) => {
|
|
||||||
console.error(error);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Selection handling.
|
// Selection handling.
|
||||||
onRowSelected(row) {
|
onRowSelected(row) {
|
||||||
this.storeRowSelection();
|
this.storeRowSelection();
|
||||||
const rowData = row.getData();
|
const rowData = row.getData();
|
||||||
this.$emit("activeJobChange", rowData);
|
this.$emit("selectedJobChange", rowData);
|
||||||
},
|
},
|
||||||
storeRowSelection() {
|
storeRowSelection() {
|
||||||
const selectedData = this.tabulator.getSelectedData();
|
const selectedData = this.tabulator.getSelectedData();
|
||||||
|
@ -55,7 +55,7 @@ class ApiClient {
|
|||||||
* @default {}
|
* @default {}
|
||||||
*/
|
*/
|
||||||
this.defaultHeaders = {
|
this.defaultHeaders = {
|
||||||
'User-Agent': 'Flamenco/fc363732-dirty / webbrowser'
|
'User-Agent': 'Flamenco/61618531-dirty / webbrowser'
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,14 +22,17 @@ import JobStatus from './JobStatus';
|
|||||||
class JobUpdate {
|
class JobUpdate {
|
||||||
/**
|
/**
|
||||||
* Constructs a new <code>JobUpdate</code>.
|
* Constructs a new <code>JobUpdate</code>.
|
||||||
|
* Subset of a Job, sent over SocketIO when a job changes. For new jobs, `previous_status` will be excluded.
|
||||||
* @alias module:model/JobUpdate
|
* @alias module:model/JobUpdate
|
||||||
* @param id {String} UUID of the Job
|
* @param id {String} UUID of the Job
|
||||||
* @param updated {Date} Timestamp of last update
|
* @param updated {Date} Timestamp of last update
|
||||||
* @param status {module:model/JobStatus}
|
* @param status {module:model/JobStatus}
|
||||||
|
* @param type {String}
|
||||||
|
* @param priority {Number}
|
||||||
*/
|
*/
|
||||||
constructor(id, updated, status) {
|
constructor(id, updated, status, type, priority) {
|
||||||
|
|
||||||
JobUpdate.initialize(this, id, updated, status);
|
JobUpdate.initialize(this, id, updated, status, type, priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,10 +40,12 @@ class JobUpdate {
|
|||||||
* This method is used by the constructors of any subclasses, in order to implement multiple inheritance (mix-ins).
|
* This method is used by the constructors of any subclasses, in order to implement multiple inheritance (mix-ins).
|
||||||
* Only for internal use.
|
* Only for internal use.
|
||||||
*/
|
*/
|
||||||
static initialize(obj, id, updated, status) {
|
static initialize(obj, id, updated, status, type, priority) {
|
||||||
obj['id'] = id;
|
obj['id'] = id;
|
||||||
obj['updated'] = updated;
|
obj['updated'] = updated;
|
||||||
obj['status'] = status;
|
obj['status'] = status;
|
||||||
|
obj['type'] = type;
|
||||||
|
obj['priority'] = priority || 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,6 +74,12 @@ class JobUpdate {
|
|||||||
if (data.hasOwnProperty('previous_status')) {
|
if (data.hasOwnProperty('previous_status')) {
|
||||||
obj['previous_status'] = JobStatus.constructFromObject(data['previous_status']);
|
obj['previous_status'] = JobStatus.constructFromObject(data['previous_status']);
|
||||||
}
|
}
|
||||||
|
if (data.hasOwnProperty('type')) {
|
||||||
|
obj['type'] = ApiClient.convertToType(data['type'], 'String');
|
||||||
|
}
|
||||||
|
if (data.hasOwnProperty('priority')) {
|
||||||
|
obj['priority'] = ApiClient.convertToType(data['priority'], 'Number');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -104,6 +115,17 @@ JobUpdate.prototype['status'] = undefined;
|
|||||||
*/
|
*/
|
||||||
JobUpdate.prototype['previous_status'] = undefined;
|
JobUpdate.prototype['previous_status'] = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @member {String} type
|
||||||
|
*/
|
||||||
|
JobUpdate.prototype['type'] = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @member {Number} priority
|
||||||
|
* @default 50
|
||||||
|
*/
|
||||||
|
JobUpdate.prototype['priority'] = 50;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user