@operato/app 1.0.0-beta.2 → 1.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,32 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.0.0-beta.5](https://github.com/hatiolab/operato/compare/v1.0.0-beta.4...v1.0.0-beta.5) (2022-04-18)
7
+
8
+ **Note:** Version bump only for package @operato/app
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.0.0-beta.4](https://github.com/hatiolab/operato/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2022-04-14)
15
+
16
+
17
+ ### :rocket: New Features
18
+
19
+ * resource-object filter ([c70a727](https://github.com/hatiolab/operato/commit/c70a7270d9b28e51d78d3831bd2f563160d010ef))
20
+ * search for relation fields ([7dc99fd](https://github.com/hatiolab/operato/commit/7dc99fd6df1a96faab4f44ea65c3837934fabc5b))
21
+
22
+
23
+
24
+ ## [1.0.0-beta.3](https://github.com/hatiolab/operato/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2022-04-12)
25
+
26
+ **Note:** Version bump only for package @operato/app
27
+
28
+
29
+
30
+
31
+
6
32
  ## [1.0.0-beta.2](https://github.com/hatiolab/operato/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2022-04-12)
7
33
 
8
34
 
@@ -0,0 +1,4 @@
1
+ import '@operato/input/ox-checkbox.js';
2
+ import '../grist-editor/ox-selector-resource-id';
3
+ import { FilterSelectRenderer } from '@operato/data-grist';
4
+ export declare const FilterResourceSelect: FilterSelectRenderer;
@@ -0,0 +1,79 @@
1
+ import '@operato/input/ox-checkbox.js';
2
+ import '../grist-editor/ox-selector-resource-id';
3
+ import { html } from 'lit-html';
4
+ import { i18next } from '@operato/i18n';
5
+ import { openPopup } from '@operato/layout';
6
+ function openResourceSelector(column, value, confirmCallback) {
7
+ const { queryName, select, list, basicArgs, valueField = 'id' } = column.record.options;
8
+ var actualValue;
9
+ if (typeof valueField === 'function') {
10
+ actualValue = valueField(value);
11
+ }
12
+ else {
13
+ actualValue = value === null || value === void 0 ? void 0 : value[valueField];
14
+ }
15
+ var template = html `
16
+ <ox-selector-resource-id
17
+ .value=${actualValue}
18
+ .confirmCallback=${confirmCallback}
19
+ .queryName=${queryName}
20
+ .select=${select}
21
+ .list=${list}
22
+ .basicArgs=${basicArgs}
23
+ .valueField=${valueField}
24
+ ></ox-selector-resource-id>
25
+ `;
26
+ const popup = openPopup(template, {
27
+ backdrop: true,
28
+ size: 'large',
29
+ title: i18next.t('title.select_item')
30
+ });
31
+ }
32
+ export const FilterResourceSelect = (column, value, owner) => {
33
+ const filter = column.filter;
34
+ const { operator = 'like' } = filter;
35
+ return operator === 'like'
36
+ ? html ` <input
37
+ type="text"
38
+ name=${column.name}
39
+ .value=${value}
40
+ @change=${(e) => {
41
+ const input = e.target;
42
+ input.dispatchEvent(new CustomEvent('filter-change', {
43
+ bubbles: true,
44
+ composed: true,
45
+ detail: {
46
+ name: column.name,
47
+ operator,
48
+ value: input.value
49
+ }
50
+ }));
51
+ }}
52
+ />`
53
+ : operator == 'in'
54
+ ? html ``
55
+ : operator === 'eq'
56
+ ? html `
57
+ <input
58
+ style="min-width: 100px; min-height: 24px"
59
+ type="text"
60
+ name=${column.name}
61
+ .value=${value}
62
+ readonly
63
+ @click=${(e) => {
64
+ e.stopPropagation();
65
+ const confirmCallback = (selected) => {
66
+ var { idField = 'id', nameField = 'name', descriptionField = 'description' } = column.record.options || {};
67
+ owner.dispatchEvent(new CustomEvent('filter-change', {
68
+ bubbles: true,
69
+ composed: true,
70
+ detail: selected ? selected[idField] : ''
71
+ }));
72
+ };
73
+ openResourceSelector(column, value, confirmCallback);
74
+ }}
75
+ />
76
+ `
77
+ : html ``;
78
+ };
79
+ //# sourceMappingURL=filter-resource-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-resource-select.js","sourceRoot":"","sources":["../../../src/filter-renderer/filter-resource-select.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-checkbox.js'\nimport '../grist-editor/ox-selector-resource-id'\n\nimport { html } from 'lit-html'\n\nimport { ColumnConfig, FilterConfigObject, FilterSelectRenderer } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\n\ntype SelectedCallback = (value: { id: string; name: string; description: string }) => void\n\nfunction openResourceSelector(column: ColumnConfig, value: any, confirmCallback: SelectedCallback) {\n const { queryName, select, list, basicArgs, valueField = 'id' } = column.record.options\n\n var actualValue\n if (typeof valueField === 'function') {\n actualValue = valueField(value)\n } else {\n actualValue = value?.[valueField]\n }\n\n var template = html`\n <ox-selector-resource-id\n .value=${actualValue}\n .confirmCallback=${confirmCallback}\n .queryName=${queryName}\n .select=${select}\n .list=${list}\n .basicArgs=${basicArgs}\n .valueField=${valueField}\n ></ox-selector-resource-id>\n `\n\n const popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.select_item')\n })\n}\n\nexport const FilterResourceSelect: FilterSelectRenderer = (column, value, owner) => {\n const filter = column.filter as FilterConfigObject\n const { operator = 'like' } = filter\n\n return operator === 'like'\n ? html` <input\n type=\"text\"\n name=${column.name}\n .value=${value}\n @change=${(e: CustomEvent) => {\n const input = e.target as HTMLInputElement\n input.dispatchEvent(\n new CustomEvent('filter-change', {\n bubbles: true,\n composed: true,\n detail: {\n name: column.name,\n operator,\n value: input.value\n }\n })\n )\n }}\n />`\n : operator == 'in'\n ? html``\n : operator === 'eq'\n ? html`\n <input\n style=\"min-width: 100px; min-height: 24px\"\n type=\"text\"\n name=${column.name}\n .value=${value}\n readonly\n @click=${(e: Event) => {\n e.stopPropagation()\n\n const confirmCallback = (selected?: { [field: string]: any }) => {\n var { idField = 'id', nameField = 'name', descriptionField = 'description' } = column.record.options || {}\n\n owner.dispatchEvent(\n new CustomEvent('filter-change', {\n bubbles: true,\n composed: true,\n detail: selected ? selected[idField] : ''\n })\n )\n }\n\n openResourceSelector(column, value, confirmCallback)\n }}\n />\n `\n : html``\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { registerFilterRenderer } from '@operato/data-grist';
2
+ import { FilterResourceSelect } from './filter-resource-select.js';
3
+ registerFilterRenderer('resource-object', [FilterResourceSelect]);
4
+ registerFilterRenderer('resource-id', [FilterResourceSelect]);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/filter-renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAElE,sBAAsB,CAAC,iBAAiB,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAA;AACjE,sBAAsB,CAAC,aAAa,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAA","sourcesContent":["import { registerFilterRenderer } from '@operato/data-grist'\n\nimport { FilterResourceSelect } from './filter-resource-select.js'\n\nregisterFilterRenderer('resource-object', [FilterResourceSelect])\nregisterFilterRenderer('resource-id', [FilterResourceSelect])\n"]}
@@ -1,3 +1,4 @@
1
1
  export * from './input/index.js';
2
- export * from './property-editor';
2
+ export * from './property-editor/index.js';
3
3
  export * from './grist-editor/index.js';
4
+ export * from './filter-renderer/index.js';
package/dist/src/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './input/index.js';
2
- export * from './property-editor';
2
+ export * from './property-editor/index.js';
3
3
  export * from './grist-editor/index.js';
4
+ export * from './filter-renderer/index.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA","sourcesContent":["export * from './input/index.js'\nexport * from './property-editor'\nexport * from './grist-editor/index.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA","sourcesContent":["export * from './input/index.js'\nexport * from './property-editor/index.js'\nexport * from './grist-editor/index.js'\nexport * from './filter-renderer/index.js'\n"]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import 'codemirror/addon/display/fullscreen';
5
+ import 'codemirror/addon/display/autorefresh';
6
+ import 'codemirror/addon/hint/show-hint';
7
+ import 'codemirror/addon/lint/lint';
8
+ import 'codemirror-graphql/hint';
9
+ import 'codemirror-graphql/lint';
10
+ import 'codemirror-graphql/mode';
11
+ import { LitElement, PropertyValues } from 'lit';
12
+ import CodeMirror from 'codemirror';
13
+ /**
14
+ WEB Component for code-mirror graphql editor.
15
+
16
+ Example:
17
+
18
+ <ox-input-graphql value=${text} link=${link}>
19
+ </ox-input-graphql>
20
+ */
21
+ export default class OxInputGraphql extends LitElement {
22
+ static styles: import("lit").CSSResult[];
23
+ /**
24
+ * `value`는 에디터에서 작성중인 contents이다.
25
+ */
26
+ value?: string;
27
+ link?: string;
28
+ textarea: HTMLTextAreaElement;
29
+ private _self_changing;
30
+ private _changed;
31
+ private _editor?;
32
+ updated(changes: PropertyValues<this>): Promise<void>;
33
+ render(): import("lit-html").TemplateResult<1>;
34
+ getSchema(): Promise<import("graphql").GraphQLSchema>;
35
+ getEditor(): Promise<CodeMirror.EditorFromTextArea | undefined>;
36
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { __decorate } from "tslib";
5
+ import 'codemirror/addon/display/fullscreen';
6
+ import 'codemirror/addon/display/autorefresh';
7
+ import 'codemirror/addon/hint/show-hint';
8
+ import 'codemirror/addon/lint/lint';
9
+ import 'codemirror-graphql/hint';
10
+ import 'codemirror-graphql/lint';
11
+ import 'codemirror-graphql/mode';
12
+ import { GRAPHQL_URI } from '@operato/graphql';
13
+ import { LitElement, css, html, unsafeCSS } from 'lit';
14
+ import { customElement, property, query } from 'lit/decorators.js';
15
+ import { introspectSchema, wrapSchema } from '@graphql-tools/wrap';
16
+ import CodeMirror from 'codemirror';
17
+ import CodeMirrorStyle from '!!text-loader!codemirror/lib/codemirror.css';
18
+ import FullScreenStyle from '!!text-loader!codemirror/addon/display/fullscreen.css';
19
+ import LintStyle from '!!text-loader!codemirror/addon/lint/lint.css';
20
+ import NightThemeStyle from '!!text-loader!codemirror/theme/night.css';
21
+ import ShowHintStyle from '!!text-loader!codemirror/addon/hint/show-hint.css';
22
+ import { fetch } from 'cross-fetch';
23
+ import { print } from 'graphql';
24
+ /**
25
+ WEB Component for code-mirror graphql editor.
26
+
27
+ Example:
28
+
29
+ <ox-input-graphql value=${text} link=${link}>
30
+ </ox-input-graphql>
31
+ */
32
+ let OxInputGraphql = class OxInputGraphql extends LitElement {
33
+ constructor() {
34
+ super(...arguments);
35
+ this._self_changing = false;
36
+ this._changed = false;
37
+ }
38
+ async updated(changes) {
39
+ if ((!this._editor || changes.has('value') || changes.has('link')) && !this._self_changing) {
40
+ if (changes.has('link')) {
41
+ this._editor = undefined;
42
+ }
43
+ ;
44
+ (await this.getEditor()).setValue(this.value === undefined ? '' : String(this.value));
45
+ // ;(await this.getEditor()).refresh()
46
+ }
47
+ }
48
+ render() {
49
+ return html ` <textarea></textarea> `;
50
+ }
51
+ async getSchema() {
52
+ const executor = async ({ document, variables }) => {
53
+ const query = print(document);
54
+ const uri = this.link || GRAPHQL_URI;
55
+ const fetchResult = await fetch(uri, {
56
+ method: 'POST',
57
+ headers: {
58
+ 'Content-Type': 'application/json'
59
+ },
60
+ body: JSON.stringify({ query, variables })
61
+ });
62
+ return fetchResult.json();
63
+ };
64
+ return await wrapSchema({
65
+ schema: await introspectSchema(executor),
66
+ executor
67
+ });
68
+ }
69
+ async getEditor() {
70
+ if (!this._editor) {
71
+ try {
72
+ var schema = await this.getSchema();
73
+ }
74
+ catch (err) {
75
+ console.error(err);
76
+ }
77
+ if (this.textarea) {
78
+ this._editor = CodeMirror.fromTextArea(this.textarea, {
79
+ value: this.value,
80
+ mode: 'graphql',
81
+ lint: {
82
+ //@ts-ignore
83
+ schema
84
+ },
85
+ hintOptions: {
86
+ //@ts-ignore
87
+ schema
88
+ },
89
+ tabSize: 2,
90
+ lineNumbers: false,
91
+ showCursorWhenSelecting: true,
92
+ theme: 'night',
93
+ extraKeys: {
94
+ F11: function (cm) {
95
+ cm.setOption('fullScreen', !cm.getOption('fullScreen'));
96
+ },
97
+ Esc: function (cm) {
98
+ cm.setOption('fullScreen', !cm.getOption('fullScreen'));
99
+ }
100
+ },
101
+ autoRefresh: {
102
+ delay: 500
103
+ }
104
+ });
105
+ this._editor.on('blur', (editor, e) => {
106
+ if (!this._changed)
107
+ return;
108
+ this.value = editor.getValue();
109
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }));
110
+ });
111
+ this._editor.on('change', async (editor, changeObj) => {
112
+ this._self_changing = true;
113
+ this._changed = true;
114
+ await this.requestUpdate();
115
+ this._self_changing = false;
116
+ });
117
+ }
118
+ }
119
+ return this._editor;
120
+ }
121
+ };
122
+ OxInputGraphql.styles = [
123
+ css `
124
+ ${unsafeCSS(CodeMirrorStyle)}
125
+ ${unsafeCSS(FullScreenStyle)}
126
+ ${unsafeCSS(NightThemeStyle)}
127
+ ${unsafeCSS(LintStyle)}
128
+ ${unsafeCSS(ShowHintStyle)}
129
+ `,
130
+ css `
131
+ :host {
132
+ display: block;
133
+ position: relative;
134
+ }
135
+
136
+ textarea {
137
+ display: block;
138
+ height: 100%;
139
+ width: 100%;
140
+ resize: none;
141
+ font-size: 16px;
142
+ line-height: 20px;
143
+ border: 0px;
144
+ padding: 0px;
145
+ }
146
+ `
147
+ ];
148
+ __decorate([
149
+ property({ type: String })
150
+ ], OxInputGraphql.prototype, "value", void 0);
151
+ __decorate([
152
+ property({ type: String })
153
+ ], OxInputGraphql.prototype, "link", void 0);
154
+ __decorate([
155
+ query('textarea')
156
+ ], OxInputGraphql.prototype, "textarea", void 0);
157
+ OxInputGraphql = __decorate([
158
+ customElement('ox-input-graphql')
159
+ ], OxInputGraphql);
160
+ export default OxInputGraphql;
161
+ //# sourceMappingURL=ox-input-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-input-resource.js","sourceRoot":"","sources":["../../../src/input/ox-input-resource.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport 'codemirror/addon/display/fullscreen'\nimport 'codemirror/addon/display/autorefresh'\nimport 'codemirror/addon/hint/show-hint'\nimport 'codemirror/addon/lint/lint'\nimport 'codemirror-graphql/hint'\nimport 'codemirror-graphql/lint'\nimport 'codemirror-graphql/mode'\n\nimport { GRAPHQL_URI, client } from '@operato/graphql'\nimport { LitElement, PropertyValues, css, html, unsafeCSS } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { introspectSchema, wrapSchema } from '@graphql-tools/wrap'\n\nimport CodeMirror from 'codemirror'\nimport CodeMirrorStyle from '!!text-loader!codemirror/lib/codemirror.css'\nimport FullScreenStyle from '!!text-loader!codemirror/addon/display/fullscreen.css'\nimport LintStyle from '!!text-loader!codemirror/addon/lint/lint.css'\nimport NightThemeStyle from '!!text-loader!codemirror/theme/night.css'\nimport ShowHintStyle from '!!text-loader!codemirror/addon/hint/show-hint.css'\nimport { fetch } from 'cross-fetch'\nimport { print } from 'graphql'\n\n/**\n WEB Component for code-mirror graphql editor.\n \n Example:\n \n <ox-input-graphql value=${text} link=${link}>\n </ox-input-graphql>\n */\n@customElement('ox-input-graphql')\nexport default class OxInputGraphql extends LitElement {\n static styles = [\n css`\n ${unsafeCSS(CodeMirrorStyle)}\n ${unsafeCSS(FullScreenStyle)}\n ${unsafeCSS(NightThemeStyle)}\n ${unsafeCSS(LintStyle)}\n ${unsafeCSS(ShowHintStyle)}\n `,\n css`\n :host {\n display: block;\n position: relative;\n }\n\n textarea {\n display: block;\n height: 100%;\n width: 100%;\n resize: none;\n font-size: 16px;\n line-height: 20px;\n border: 0px;\n padding: 0px;\n }\n `\n ]\n\n /**\n * `value`는 에디터에서 작성중인 contents이다.\n */\n @property({ type: String }) value?: string\n @property({ type: String }) link?: string\n\n @query('textarea') textarea!: HTMLTextAreaElement\n\n private _self_changing: boolean = false\n private _changed: boolean = false\n private _editor?: CodeMirror.EditorFromTextArea\n\n async updated(changes: PropertyValues<this>) {\n if ((!this._editor || changes.has('value') || changes.has('link')) && !this._self_changing) {\n if (changes.has('link')) {\n this._editor = undefined\n }\n ;(await this.getEditor())!.setValue(this.value === undefined ? '' : String(this.value))\n // ;(await this.getEditor()).refresh()\n }\n }\n\n render() {\n return html` <textarea></textarea> `\n }\n\n async getSchema() {\n const executor = async ({ document, variables }: any) => {\n const query = print(document)\n const uri = this.link || GRAPHQL_URI\n\n const fetchResult = await fetch(uri, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ query, variables })\n })\n return fetchResult.json()\n }\n\n return await wrapSchema({\n schema: await introspectSchema(executor),\n executor\n })\n }\n\n async getEditor() {\n if (!this._editor) {\n try {\n var schema = await this.getSchema()\n } catch (err) {\n console.error(err)\n }\n\n if (this.textarea) {\n this._editor = CodeMirror.fromTextArea(this.textarea, {\n value: this.value,\n mode: 'graphql',\n lint: {\n //@ts-ignore\n schema\n },\n hintOptions: {\n //@ts-ignore\n schema\n },\n tabSize: 2,\n lineNumbers: false,\n showCursorWhenSelecting: true,\n theme: 'night',\n extraKeys: {\n F11: function (cm) {\n cm.setOption('fullScreen', !cm.getOption('fullScreen'))\n },\n Esc: function (cm) {\n cm.setOption('fullScreen', !cm.getOption('fullScreen'))\n }\n },\n autoRefresh: {\n delay: 500\n }\n })\n\n this._editor.on('blur', (editor: CodeMirror.Editor, e: FocusEvent) => {\n if (!this._changed) return\n\n this.value = editor.getValue()\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n })\n\n this._editor.on('change', async (editor: CodeMirror.Editor, changeObj: CodeMirror.EditorChange) => {\n this._self_changing = true\n\n this._changed = true\n\n await this.requestUpdate()\n\n this._self_changing = false\n })\n }\n }\n\n return this._editor\n }\n}\n"]}