strolch-wc-inspector/strolch-wc-inspector-object...

382 lines
13 KiB
HTML
Raw Normal View History

<link rel="import" href="../polymer/polymer.html">
2017-02-06 10:52:53 +01:00
2017-02-06 18:13:36 +01:00
<link rel="import" href="../paper-toolbar/paper-toolbar.html">
<link rel="import" href="../paper-input/paper-input.html">
2017-02-06 18:13:36 +01:00
<link rel="import" href="../iron-ajax/iron-ajax.html">
<link rel="import" href="../iron-icon/iron-icon.html">
<link rel="import" href="../iron-pages/iron-pages.html">
2017-02-06 10:52:53 +01:00
<link rel="import" href="../strolch-wc-styles/strolch-wc-styles.html">
<link rel="import" href="strolch-wc-inspector-object.html">
2017-02-06 10:52:53 +01:00
<dom-module id="strolch-wc-inspector-objects">
<template>
<style is="strolch-wc-styles">
2017-02-06 10:52:53 +01:00
:host {
display: block;
margin: 0;
padding: 0;
height: 100%;
--focus-color: white;
--regular-color: lightgrey;
--disabled-color: darkgrey;
2017-02-06 10:52:53 +01:00
}
.title {
margin-top: 2em;
font-weight: bold;
font-size: 1rem;
}
2017-02-06 18:13:36 +01:00
.card {
background-color: #ffffff;
2017-02-06 10:52:53 +01:00
cursor: pointer;
border-style: none;
}
2017-02-06 18:13:36 +01:00
paper-toolbar {
--paper-toolbar-height: 42px;
}
paper-input {
position: absolute;
right: 20px;
--paper-input-container-color: var(--regular-color);
--paper-input-container-focus-color: var(--focus-color);
--paper-input-container-input-color: var(--focus-color);
--paper-input-container-input: {
font-size: 18px;
padding: 4px;
};
--paper-input-container-underline-disabled: {
border-bottom-style: solid;
}
}
paper-input::shadow input::-ms-clear {
display: none;
width: 0;
height: 0;
}
paper-input iron-icon {
padding: 4px;
}
paper-input:not([focused]) iron-icon {
color: var(--regular-color);
}
paper-input[focused] iron-icon {
color: var(--focus-color);
}
#clear {
cursor: pointer;
}
2017-02-06 10:52:53 +01:00
</style>
2017-02-08 20:17:30 +01:00
<template is="dom-if" if="[[_noElements(objectSummaries)]]" restamp>
<p class="title g-center">No [[objectType]] objects exists.</p>
2017-02-06 10:52:53 +01:00
</template>
2017-02-08 20:17:30 +01:00
<template is="dom-if" if="[[!_noElements(objectSummaries)]]" restamp>
2017-02-06 10:52:53 +01:00
<iron-pages selected="{{section}}" attr-for-selected="name">
2017-02-08 12:18:50 +01:00
<section name="typesSummary" class="g-pt-4">
2017-02-06 18:13:36 +01:00
2017-02-08 20:17:30 +01:00
<template is="dom-repeat" items="[[objectSummaries.types]]">
<div class="g-row">
<div class="g-offset-4 g-4">
2017-02-08 12:18:50 +01:00
<paper-material class="card g-m-2 g-p-4" elevation="1" on-tap="_showTypeDetails">
<p class="g-mb-0">[[objectType]] of type <b>[[item.type]]</b> ([[item.size]])</p>
2017-02-06 18:13:36 +01:00
</paper-material>
</div>
</div>
</template>
2017-02-06 10:52:53 +01:00
</section>
<section name="typeDetails">
<div class="g-row">
<div class="g-12">
<paper-toolbar>
<paper-icon-button icon="arrow-back" on-tap="_closeTypeDetails"></paper-icon-button>
<span class="align-text-bottom">Showing [[objectType]] objects of type [[selectedType]]</span>
<paper-input no-label-float value="{{searchTerm}}" class="searchField">
<template is="dom-if" if="[[isEmptyString(searchTerm)]]">
<iron-icon suffix icon="search"></iron-icon>
</template>
<template is="dom-if" if="[[!isEmptyString(searchTerm)]]">
<iron-icon suffix icon="clear" id="clear" on-tap="onClearTapped"></iron-icon>
</template>
</paper-input>
2017-02-06 18:13:36 +01:00
</paper-toolbar>
2017-02-06 10:52:53 +01:00
2017-02-08 20:17:30 +01:00
<template is="dom-repeat" items="[[objects.data]]">
<strolch-wc-inspector-object base-path="[[basePath]]"
app="[[app]]"
2017-02-06 10:52:53 +01:00
realm="[[realm]]"
is-root-element="true"
2017-08-17 13:54:19 +02:00
on-strolch-wc-obj-remove="onRemoveElement"
2017-02-08 20:17:30 +01:00
object="[[item]]"></strolch-wc-inspector-object>
2017-02-06 10:52:53 +01:00
</template>
</div>
</div>
2017-02-08 20:17:30 +01:00
<div class="g-row">
<div class="g-12">
<div class="g-m-2 g-center">
<paper-icon-button icon="first-page" on-tap="_toFirstPage"></paper-icon-button>
<paper-icon-button icon="chevron-left" on-tap="_toPreviousPage"></paper-icon-button>
<span>[[objects.offset]] to [[_getEnd(objects)]] of [[objects.size]]</span>
<paper-icon-button icon="chevron-right" on-tap="_toNextPage"></paper-icon-button>
<paper-icon-button icon="last-page" on-tap="_toLastPage"></paper-icon-button>
</div>
</div>
</div>
2017-02-06 10:52:53 +01:00
</section>
</iron-pages>
</template>
<iron-ajax id="ajax"
content-type="application/json"
handle-as="json"
on-response="_handleAjaxResponse"
on-error="_handleAjaxError"></iron-ajax>
</template>
<script>
Polymer({
is: 'strolch-wc-inspector-objects',
properties: {
app: {
type: Object,
value: function () {
return null;
}
},
basePath: {
type: String,
value: './'
},
2017-02-06 10:52:53 +01:00
realm: {
type: String,
value: function () {
return null;
}
},
searchTerm: {
type: String,
observer: "observeSearchTerm",
value: function () {
return "";
}
},
2017-02-06 10:52:53 +01:00
objectType: {
type: String,
value: function () {
return null;
}
},
2017-02-08 20:17:30 +01:00
objectSummaries: {
2017-02-06 10:52:53 +01:00
type: Object,
value: function () {
return null;
},
observer: "_objectSummariesChanged"
2017-02-06 10:52:53 +01:00
},
section: {
type: String,
value: function () {
return 'typesSummary';
}
},
selectedType: {
type: String,
value: function () {
return null;
}
},
2017-02-08 20:17:30 +01:00
objects: {
2017-02-06 10:52:53 +01:00
type: Object,
value: function () {
return null;
}
2017-02-08 20:17:30 +01:00
},
offset: {
type: Number,
value: function () {
return 0;
}
},
limit: {
type: Number,
value: function () {
2017-02-08 20:32:04 +01:00
return 20;
2017-02-08 20:17:30 +01:00
}
2017-02-06 10:52:53 +01:00
}
},
isEmptyString: function (s) {
return s == null || s.length == 0;
},
onClearTapped: function (event) {
this.set("searchTerm", "");
},
observeSearchTerm: function (newValue, oldValue) {
if (this.realm == null || this.objectType == null || this.selectedType == null)
return;
this.debounce("doSearch", function () {
this.reloadTypeDetails();
}, 500);
},
_objectSummariesChanged: function (newValue, oldValue) {
this.selectedType = null;
this.section = 'typesSummary';
this.selectedType = null;
this.objects = null;
Strolch.setQueryParamValue('type', null);
},
2017-02-08 20:17:30 +01:00
_noElements: function (objectSummaries) {
return objectSummaries == null || objectSummaries.types.length == 0;
2017-02-06 10:52:53 +01:00
},
_showTypeDetails: function (evt) {
this.selectedType = evt.model.item.type;
this.section = 'typeDetails';
2017-02-08 20:17:30 +01:00
this.objects = null;
2017-02-06 10:52:53 +01:00
console.log('Showing type ' + this.selectedType);
Strolch.setQueryParamValue('type', this.selectedType);
this.reloadTypeDetails();
},
_closeTypeDetails: function () {
this.section = 'typesSummary';
this.selectedType = null;
2017-02-08 20:17:30 +01:00
this.objects = null;
2017-02-06 10:52:53 +01:00
Strolch.setQueryParamValue('type', null);
},
_typeSubPath: function (selectedType) {
if (selectedType == 'Resource') {
return 'resources';
} else if (selectedType == 'Order') {
return 'orders';
} else if (selectedType == 'Activity') {
return 'activities';
} else {
throw 'Unhandled selected type ' + selectedType;
}
},
2017-02-08 20:17:30 +01:00
_hasNext: function (objects) {
return objects != null && objects.nextOffset > objects.offset;
},
_hasPrevious: function (objects) {
return objects != null && objects.previousOffset < objects.offset;
},
_getEnd: function (objects) {
if (this._hasNext(objects))
return objects.nextOffset;
return objects == null ? 0 : objects.size;
},
_toFirstPage: function () {
this.offset = 0;
this.reloadTypeDetails();
},
_toPreviousPage: function () {
this.offset = this.objects.previousOffset;
this.reloadTypeDetails();
},
_toNextPage: function () {
this.offset = this.objects.nextOffset;
this.reloadTypeDetails(this.objects.nextOffset);
},
_toLastPage: function () {
this.offset = this.objects.lastOffset;
this.reloadTypeDetails(this.objects.lastOffset);
},
2017-08-17 13:54:19 +02:00
onRemoveElement: function (event) {
console.log("Delete element " + event.detail.object.id);
var id = event.detail.object.id;
var index = null;
for (var i = 0; i < this.objects.data.length; i++) {
if (this.objects.data[i].id == id) {
index = i;
break;
}
}
if (index != null) {
this.splice("objects.data", index, 1);
}
},
2017-02-06 10:52:53 +01:00
reloadTypeDetails: function () {
this._handleAjaxResponse = function (data) {
2017-02-08 20:17:30 +01:00
this.set('objects', data.detail.response);
2017-02-06 10:52:53 +01:00
};
2017-02-08 20:17:30 +01:00
var url = this.basePath + 'rest/strolch/inspector/' + this.realm + '/' + this._typeSubPath(this.objectType) + '/' + this.selectedType;
url += '?offset=' + this.offset + '&limit=' + this.limit + "&orderBy=id&query=" + this.searchTerm;
2017-02-08 20:17:30 +01:00
this.$.ajax.url = url;
2017-02-06 10:52:53 +01:00
this.$.ajax.method = 'GET';
this.$.ajax.generateRequest();
},
ready: function () {
},
reload: function () {
},
_handleAjaxResponse: function (evt) {
console.log('NOT YET DEFINED!');
},
_handleAjaxError: function (data) {
var dlgTitle = 'Debug action failed';
var dlgText;
if (data.detail.request.response) {
dlgText = data.detail.request.response.msg;
} else {
dlgText = data.detail.error;
}
this.app.showError(dlgTitle, dlgText);
}
});
</script>
</dom-module>