diff --git a/package.json b/package.json index 81becba..3fd6b31 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ }, "dependencies": { "core-js": "^3.6.5", + "rxjs": "^6.6.6", "vue": "^2.6.11", "vue-class-component": "^7.2.3", "vue-property-decorator": "^9.1.2" diff --git a/src/components/List.vue b/src/components/List.vue new file mode 100644 index 0000000..962ab7d --- /dev/null +++ b/src/components/List.vue @@ -0,0 +1,17 @@ + + + + + + diff --git a/src/services/fetch.ts b/src/services/fetch.ts new file mode 100644 index 0000000..6d08180 --- /dev/null +++ b/src/services/fetch.ts @@ -0,0 +1,100 @@ +declare var window: any; +const defaultBasePath = ''; + +export function fetchAsync(method: 'GET' | 'POST' | 'DELETE' | 'PUT', url: string, body?: any) { + const headers = { 'Content-Type': 'application/json; charset=utf-8' }; + // if (access_token) headers['Authorization'] = `Token ${access_token}`; + return window.fetch(`${defaultBasePath}${url}`, { + method, + headers, + body: body && JSON.stringify(body) + }).then((response: any) => { + if (response.status === 401) { + window.location.href = '/auth/login'; + // throw new Error('401'); + } + if (response.status === 403 && url === '/api/v1/organization/') { + // this indicates a user that is not supposed to be in bx-console + window.location.href = '/auth/logout'; + } + const result = response.json(); + if (!response.ok) throw result; + return result; + }); +} + +export function get(url: string): Promise { + return fetchAsync('GET', url); +} + +export function post(url: string, body?: any): Promise { + return fetchAsync('POST', url, body); +} + +export function postWithFile(url: string, body?: any): Promise { + return fetchWithFile('POST', url, body); +} + +export function putWithFile(url: string, body?: any): Promise { + return fetchWithFile('PUT', url, body); +} + +export function fetchWithFile(method: string, url: string, body?: any): Promise { + return window.fetch(`${defaultBasePath}${url}`, { + method: method, + body: body + }).then((response: any) => { + if (response.status === 401) { + window.location.href = '/auth/login'; + // throw new Error('401'); + } + const result = response.json(); + if (!response.ok) throw result; + return result; + }) +} + +export function del(url: string) { + return fetchAsync('DELETE', url); +} + +export function put(url: string, body?: any) { + return fetchAsync('PUT', url, body); +} +export function toQueryString(obj: any) { + const parts = []; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + parts.push(encodeURIComponent(i) + "=" + encodeURIComponent(obj[i])); + } + } + return parts.join("&"); +} + +export function serializeObject(form: any) { + let obj: {[key: string]: any} = {}; + if (typeof form == 'object' && form.nodeName == "FORM") { + for (let i = 0; i < form.elements.length; i++) { + const field = form.elements[i]; + if (field.name + && field.type != 'file' + && field.type != 'reset' + && field.type != 'submit' + && field.type != 'button') { + if (field.type == 'select-multiple') { + obj[field.name] = ''; + let tempvalue = ''; + for (let j = 0; j < form.elements[i].options.length; j++) { + if (field.options[j].selected) + tempvalue += field.options[j].value + ';'; + } + if (tempvalue.charAt(tempvalue.length - 1) === ';') obj[field.name] = tempvalue.substring(0, tempvalue.length - 1); + + } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) { + obj[field.name] = field.value; + } + } + } + } + return obj as T; +} diff --git a/src/services/observeService.ts b/src/services/observeService.ts new file mode 100644 index 0000000..54ed643 --- /dev/null +++ b/src/services/observeService.ts @@ -0,0 +1,19 @@ +import { Observable, Subject, merge } from 'rxjs'; +import { switchMap, shareReplay, debounceTime } from 'rxjs/operators'; + +export class ObserveService { + private updateStream: Subject; + public value$: Observable; + + constructor(request: ()=>Observable) { + this.updateStream = new Subject(); + const initialCurrentResponse$ = request(); + const reload$ = this.updateStream.pipe(debounceTime(1000), switchMap(() => request())); + const final$ = merge(initialCurrentResponse$, reload$).pipe(shareReplay(1)); + this.value$ = final$; + } + + public next() { + this.updateStream.next(); + } +} diff --git a/src/services/thingService.ts b/src/services/thingService.ts new file mode 100644 index 0000000..e69de29 diff --git a/yarn.lock b/yarn.lock index 24f05fe..399c8a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7158,6 +7158,13 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rxjs@^6.6.6: + version "6.6.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" + integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"