ide-assi 0.521.0 → 0.523.0

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.
@@ -202573,7 +202573,7 @@ class IdeAssi extends HTMLElement
202573
202573
 
202574
202574
  <div class="container">
202575
202575
  <div class="head">
202576
- <div class="logo"><span>nandoo@hanmail.net</span></div>
202576
+ <div class="logo"><span></span></div>
202577
202577
  </div>
202578
202578
  <nx-ai-chat></nx-ai-chat>
202579
202579
  <div class="foot">
@@ -202639,6 +202639,10 @@ class IdeAssi extends HTMLElement
202639
202639
 
202640
202640
  this.settings = this.shadowRoot.querySelector("ide-assi-settings");
202641
202641
 
202642
+ this.shadowRoot.appendChild(document.createElement('ide-tip-popup'));
202643
+ this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
202644
+
202645
+
202642
202646
  this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
202643
202647
 
202644
202648
  this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
@@ -202661,37 +202665,6 @@ class IdeAssi extends HTMLElement
202661
202665
 
202662
202666
  //this.shadowRoot.querySelector('ide-diff-popup').remove();
202663
202667
 
202664
- this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
202665
- /**
202666
- src1 = `
202667
- <tr>
202668
- <th>No.</th>
202669
- <th>문서ID</th>
202670
- <th>매출액</th>
202671
- <th>최종수정자</th>
202672
- <th>문서명</th>
202673
- <th>최초등록자</th>
202674
- <th>최초등록일</th>
202675
- <th>최종수정일</th>
202676
- </tr>
202677
- `;
202678
- src2 = `
202679
- <tr>
202680
- <th>No.</th>
202681
- <th>매출액</th>
202682
- <th>문서ID</th>
202683
- <th>최종수정자</th>
202684
- <th>문서명</th>
202685
- <th>최초등록자</th>
202686
- <th>최초등록일</th>
202687
- <th>최종수정일</th>
202688
- </tr>
202689
- `; */
202690
-
202691
-
202692
-
202693
-
202694
-
202695
202668
 
202696
202669
 
202697
202670
  const apply = {
@@ -202921,6 +202894,45 @@ class ideAssiSettings extends HTMLElement
202921
202894
 
202922
202895
  customElements.define("ide-assi-settings", ideAssiSettings);
202923
202896
 
202897
+ class IdeTipPopup extends HTMLElement
202898
+ {
202899
+ constructor() {
202900
+
202901
+ super();
202902
+ this.attachShadow({ mode: 'open' });
202903
+ }
202904
+
202905
+ connectedCallback() {
202906
+
202907
+ this.shadowRoot.innerHTML = `
202908
+ <style>
202909
+ <style>
202910
+ @import "https://cdn.jsdelivr.net/npm/ninegrid@${ninegrid.version}/dist/css/ideAssi.css";
202911
+ ${ninegrid.getCustomPath(this,"ideAssi.css")}
202912
+ </style>
202913
+
202914
+ <nx-dialog>
202915
+ <div class="buttons">
202916
+ adfa
202917
+ </div>
202918
+
202919
+ </nx-dialog>
202920
+ `;
202921
+
202922
+ this.#init();
202923
+ }
202924
+
202925
+ #init = () => {
202926
+
202927
+ }
202928
+
202929
+ popup = () => {
202930
+ this.shadowRoot.querySelector('nx-dialog')?.showModal();
202931
+ };
202932
+ }
202933
+
202934
+ customElements.define("ide-tip-popup", IdeTipPopup);
202935
+
202924
202936
  class IdeDiffPopup extends HTMLElement
202925
202937
  {
202926
202938
  #changedSource;
@@ -202569,7 +202569,7 @@ class IdeAssi extends HTMLElement
202569
202569
 
202570
202570
  <div class="container">
202571
202571
  <div class="head">
202572
- <div class="logo"><span>nandoo@hanmail.net</span></div>
202572
+ <div class="logo"><span></span></div>
202573
202573
  </div>
202574
202574
  <nx-ai-chat></nx-ai-chat>
202575
202575
  <div class="foot">
@@ -202635,6 +202635,10 @@ class IdeAssi extends HTMLElement
202635
202635
 
202636
202636
  this.settings = this.shadowRoot.querySelector("ide-assi-settings");
202637
202637
 
202638
+ this.shadowRoot.appendChild(document.createElement('ide-tip-popup'));
202639
+ this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
202640
+
202641
+
202638
202642
  this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
202639
202643
 
202640
202644
  this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
@@ -202657,37 +202661,6 @@ class IdeAssi extends HTMLElement
202657
202661
 
202658
202662
  //this.shadowRoot.querySelector('ide-diff-popup').remove();
202659
202663
 
202660
- this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
202661
- /**
202662
- src1 = `
202663
- <tr>
202664
- <th>No.</th>
202665
- <th>문서ID</th>
202666
- <th>매출액</th>
202667
- <th>최종수정자</th>
202668
- <th>문서명</th>
202669
- <th>최초등록자</th>
202670
- <th>최초등록일</th>
202671
- <th>최종수정일</th>
202672
- </tr>
202673
- `;
202674
- src2 = `
202675
- <tr>
202676
- <th>No.</th>
202677
- <th>매출액</th>
202678
- <th>문서ID</th>
202679
- <th>최종수정자</th>
202680
- <th>문서명</th>
202681
- <th>최초등록자</th>
202682
- <th>최초등록일</th>
202683
- <th>최종수정일</th>
202684
- </tr>
202685
- `; */
202686
-
202687
-
202688
-
202689
-
202690
-
202691
202664
 
202692
202665
 
202693
202666
  const apply = {
@@ -202917,6 +202890,45 @@ class ideAssiSettings extends HTMLElement
202917
202890
 
202918
202891
  customElements.define("ide-assi-settings", ideAssiSettings);
202919
202892
 
202893
+ class IdeTipPopup extends HTMLElement
202894
+ {
202895
+ constructor() {
202896
+
202897
+ super();
202898
+ this.attachShadow({ mode: 'open' });
202899
+ }
202900
+
202901
+ connectedCallback() {
202902
+
202903
+ this.shadowRoot.innerHTML = `
202904
+ <style>
202905
+ <style>
202906
+ @import "https://cdn.jsdelivr.net/npm/ninegrid@${ninegrid.version}/dist/css/ideAssi.css";
202907
+ ${ninegrid.getCustomPath(this,"ideAssi.css")}
202908
+ </style>
202909
+
202910
+ <nx-dialog>
202911
+ <div class="buttons">
202912
+ adfa
202913
+ </div>
202914
+
202915
+ </nx-dialog>
202916
+ `;
202917
+
202918
+ this.#init();
202919
+ }
202920
+
202921
+ #init = () => {
202922
+
202923
+ }
202924
+
202925
+ popup = () => {
202926
+ this.shadowRoot.querySelector('nx-dialog')?.showModal();
202927
+ };
202928
+ }
202929
+
202930
+ customElements.define("ide-tip-popup", IdeTipPopup);
202931
+
202920
202932
  class IdeDiffPopup extends HTMLElement
202921
202933
  {
202922
202934
  #changedSource;
@@ -2,6 +2,8 @@ import ninegrid from "ninegrid2";
2
2
  import { IdeAi } from "./ideAi.js";
3
3
  import { api } from "./ideFetch.js";
4
4
 
5
+
6
+
5
7
  export class IdeAssi extends HTMLElement
6
8
  {
7
9
  #ing = false;
@@ -32,7 +34,7 @@ export class IdeAssi extends HTMLElement
32
34
 
33
35
  <div class="container">
34
36
  <div class="head">
35
- <div class="logo"><span>nandoo@hanmail.net</span></div>
37
+ <div class="logo"><span></span></div>
36
38
  </div>
37
39
  <nx-ai-chat></nx-ai-chat>
38
40
  <div class="foot">
@@ -98,6 +100,10 @@ export class IdeAssi extends HTMLElement
98
100
 
99
101
  this.settings = this.shadowRoot.querySelector("ide-assi-settings");
100
102
 
103
+ this.shadowRoot.appendChild(document.createElement('ide-tip-popup'));
104
+ this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
105
+
106
+
101
107
  this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
102
108
 
103
109
  this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
@@ -120,382 +126,6 @@ export class IdeAssi extends HTMLElement
120
126
 
121
127
  //this.shadowRoot.querySelector('ide-diff-popup').remove();
122
128
 
123
- this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
124
-
125
- //setTimeout(() => {
126
- let src1 = `
127
- import React, { useRef, useEffect } from "react" adfa;
128
- import { api, ai } from "ide-assi";
129
- import ninegrid from "ninegrid2";
130
-
131
- const DocManager = () => {
132
- const tabRef = useRef(null);
133
- const gridRef = useRef(null);
134
-
135
- const selectList = async (params) => {
136
- if (!gridRef.current) return;
137
- gridRef.current.classList.add("loading");
138
- api.post(\`/api/tmpl-a/doc-manager/selectList\`, params).then((res) => {
139
- gridRef.current.data.source = res.list;
140
- });
141
- };
142
-
143
- const handleNaturalLanguageSearch = async () => {
144
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
145
- const searchText = searchTextElement ? searchTextElement.value : "";
146
-
147
- if (!gridRef.current) return;
148
- gridRef.current.classList.add("loading");
149
-
150
- let params = {};
151
- if (searchText) {
152
- params = {
153
- _whereClause: await ai.generateWhereCause(
154
- "tmpla/DocManagerMapper.xml",
155
- "selectList",
156
- searchText,
157
- import.meta.env.VITE_GEMINI_API_KEY
158
- ),
159
- };
160
- }
161
- selectList(params);
162
- };
163
-
164
- const handleClassicSearch = () => {
165
- if (!gridRef.current) return;
166
- gridRef.current.classList.add("loading");
167
-
168
- const form2Element = ninegrid.querySelector(".form2", tabRef.current);
169
- const params = form2Element ? form2Element.getData() : {};
170
- selectList(params);
171
- };
172
-
173
- useEffect(() => {
174
- selectList({});
175
-
176
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
177
- const searchButton = ninegrid.querySelector(".search", tabRef.current);
178
-
179
- const handleKeyDown = (e) => {
180
- if (e.key === "Enter" && !e.isComposing) {
181
- handleNaturalLanguageSearch();
182
- }
183
- };
184
-
185
- const handleClick = () => {
186
- handleClassicSearch();
187
- };
188
-
189
- if (searchTextElement) {
190
- searchTextElement.addEventListener("keydown", handleKeyDown);
191
- }
192
- if (searchButton) {
193
- searchButton.addEventListener("click", handleClick);
194
- }
195
-
196
- return () => {
197
- if (searchTextElement) {
198
- searchTextElement.removeEventListener("keydown", handleKeyDown);
199
- }
200
- if (searchButton) {
201
- searchButton.removeEventListener("click", handleClick);
202
- }
203
- };
204
- }, []);
205
-
206
- return (
207
- <div className="wrapper">
208
- <nx-collapse target="nx-tab" className="search-collapse"></nx-collapse>
209
- <div className="list-wrapper">
210
- <nx-tab theme="theme-3" ref={tabRef}>
211
- <nx-tab-page caption="자연어 검색">
212
- <nx-form className="form1">
213
- <input
214
- type="text"
215
- id="searchText"
216
- name="searchText"
217
- placeholder="자연어 검색어를 입력하세요 (ex: 작성자가 홍길동인 데이타를 찾아줘)"
218
- />
219
- </nx-form>
220
- </nx-tab-page>
221
- <nx-tab-page caption="클래식 검색">
222
- <nx-form className="form2">
223
- <label>문서명: <input type="text" name="docNm" /></label>
224
- <label>매출액:
225
- <input type="number" name="minAmt" placeholder="최소" /> ~
226
- <input type="number" name="maxAmt" placeholder="최대" />
227
- </label>
228
- </nx-form>
229
- <button className="search">검색</button>
230
- </nx-tab-page>
231
- </nx-tab>
232
-
233
- <div className="grid-wrapper">
234
- <nine-grid
235
- ref={gridRef}
236
- caption="문서관리"
237
- select-type="row"
238
- show-title-bar="true"
239
- show-menu-icon="true"
240
- show-status-bar="true"
241
- enable-fixed-col="true"
242
- row-resizable="false"
243
- col-movable="true"
244
- >
245
- <table>
246
- <colgroup>
247
- <col width="50" fixed="left" background-color="gray" />
248
- <col width="100" />
249
- <col width="100" />
250
- <col width="200" />
251
- <col width="120" />
252
- <col width="100" />
253
- <col width="150" />
254
- <col width="150" />
255
- </colgroup>
256
- <thead>
257
- <tr>
258
- <th>No.</th>
259
- <th>최종수정자</th>
260
- <th>문서ID</th>
261
- <th>문서명</th>
262
- <th>매출액</th>
263
- <th>최초등록자</th>
264
- <th>최초등록일</th>
265
- <th>최종수정일</th>
266
- </tr>
267
- </thead>
268
- <tbody>
269
- <tr>
270
- <th><ng-row-indicator /></th>
271
- <td data-bind="updateUser" text-align="center"></td>
272
- <td data-bind="docId" text-align="center"></td>
273
- <td data-bind="docNm" text-align="left"></td>
274
- <td
275
- data-bind="amt"
276
- data-expr="data.amt.toLocaleString()"
277
- text-align="right"
278
- show-icon="true"
279
- icon-type="sphere"
280
- icon-color="data.amt >= 2000 ? 'red' : 'gray'"
281
- ></td>
282
- <td data-bind="insertUser" text-align="center"></td>
283
- <td data-bind="insertDt" text-align="center"></td>
284
- <td data-bind="updateDt" text-align="center"></td>
285
- </tr>
286
- </tbody>
287
- </table>
288
- </nine-grid>
289
- </div>
290
- </div>
291
- </div>
292
- );
293
- };
294
-
295
- export default DocManager;
296
- `;
297
-
298
- let src2 = `
299
- import React, { useRef, useEffect } from "react";
300
- import { api, ai } from "ide-assi";
301
- import ninegrid from "ninegrid2";
302
-
303
- const DocManager = () => {
304
- const tabRef = useRef(null);
305
- const gridRef = useRef(null);
306
-
307
- const selectList = async (params) => {
308
- if (!gridRef.current) return;
309
- gridRef.current.classList.add("loading");
310
- api.post(\`/api/tmpl-a/doc-manager/selectList\`, params).then((res) => {
311
- gridRef.current.data.source = res.list;
312
- });
313
- };
314
-
315
- const handleNaturalLanguageSearch = async () => {
316
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
317
- const searchText = searchTextElement ? searchTextElement.value : "";
318
-
319
- if (!gridRef.current) return;
320
- gridRef.current.classList.add("loading");
321
-
322
- let params = {};
323
- if (searchText) {
324
- params = {
325
- _whereClause: await ai.generateWhereCause(
326
- "tmpla/DocManagerMapper.xml",
327
- "selectList",
328
- searchText,
329
- import.meta.env.VITE_GEMINI_API_KEY
330
- ),
331
- };
332
- }
333
- selectList(params);
334
- };
335
-
336
- const handleClassicSearch = () => {
337
- if (!gridRef.current) return;
338
- gridRef.current.classList.add("loading");
339
-
340
- const form2Element = ninegrid.querySelector(".form2", tabRef.current);
341
- const params = form2Element ? form2Element.getData() : {};
342
- selectList(params);
343
- };
344
-
345
- useEffect(() => {
346
- selectList({});
347
-
348
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
349
- const searchButton = ninegrid.querySelector(".search", tabRef.current);
350
-
351
- const handleKeyDown = (e) => {
352
- if (e.key === "Enter" && !e.isComposing) {
353
- handleNaturalLanguageSearch();
354
- }
355
- };
356
-
357
- const handleClick = () => {
358
- handleClassicSearch();
359
- };
360
-
361
- if (searchTextElement) {
362
- searchTextElement.addEventListener("keydown", handleKeyDown);
363
- }
364
- if (searchButton) {
365
- searchButton.addEventListener("click", handleClick);
366
- }
367
-
368
- return () => {
369
- if (searchTextElement) {
370
- searchTextElement.removeEventListener("keydown", handleKeyDown);
371
- }
372
- if (searchButton) {
373
- searchButton.removeEventListener("click", handleClick);
374
- }
375
- };
376
- }, []);
377
-
378
- return (
379
- <div className="wrapper">
380
- <nx-collapse target="nx-tab" className="search-collapse"></nx-collapse>
381
- <div className="list-wrapper">
382
- <nx-tab theme="theme-3" ref={tabRef}>
383
- <nx-tab-page caption="자연어 검색">
384
- <nx-form className="form1">
385
- <input
386
- type="text"
387
- id="searchText"
388
- name="searchText"
389
- placeholder="자연어 검색어를 입력하세요 (ex: 작성자가 홍길동인 데이타를 찾아줘)"
390
- />
391
- </nx-form>
392
- </nx-tab-page>
393
- <nx-tab-page caption="클래식 검색">
394
- <nx-form className="form2">
395
- <label>문서명: <input type="text" name="docNm" /></label>
396
- <label>매출액:
397
- <input type="number" name="minAmt" placeholder="최소" /> ~
398
- <input type="number" name="maxAmt" placeholder="최대" />
399
- </label>
400
- </nx-form>
401
- <button className="search">검색</button>
402
- </nx-tab-page>
403
- </nx-tab>
404
-
405
- <div className="grid-wrapper">
406
- <nine-grid
407
- ref={gridRef}
408
- caption="매출 문서 관리"
409
- select-type="row"
410
- show-title-bar="true"
411
- show-menu-icon="true"
412
- show-status-bar="true"
413
- enable-fixed-col="true"
414
- row-resizable="false"
415
- col-movable="true"
416
- >
417
- <table>
418
- <colgroup>
419
- <col width="50" fixed="left" background-color="gray" />
420
- <col width="100" />
421
- <col width="120" />
422
- <col width="100" />
423
- <col width="200" />
424
- <col width="100" />
425
- <col width="150" />
426
- <col width="150" />
427
- </colgroup>
428
- <thead>
429
- <tr>
430
- <th>No.</th>
431
- <th>문서ID</th>
432
- <th>매출액</th>
433
- <th>최종수정자</th>
434
- <th>문서명</th>
435
- <th>최초등록자</th>
436
- <th>최초등록일</th>
437
- <th>최종수정일</th>
438
- </tr>
439
- </thead>
440
- <tbody>
441
- <tr>
442
- <th><ng-row-indicator /></th>
443
- <td data-bind="docId" text-align="center"></td>
444
- <td
445
- data-bind="amt"
446
- data-expr="data.amt.toLocaleString()"
447
- text-align="right"
448
- show-icon="true"
449
- icon-type="sphere"
450
- icon-color="data.amt >= 2000 ? 'red' : 'gray'"
451
- ></td>
452
- <td data-bind="updateUser" text-align="center"></td>
453
- <td data-bind="docNm" text-align="left"></td>
454
- <td data-bind="insertUser" text-align="center"></td>
455
- <td data-bind="insertDt" text-align="center"></td>
456
- <td data-bind="updateDt" text-align="center"></td>
457
- </tr>
458
- </tbody>
459
- </table>
460
- </nine-grid>
461
- </div>
462
- </div>
463
- </div>
464
- );
465
- };
466
-
467
- export default DocManager;
468
- `;
469
- /**
470
- src1 = `
471
- <tr>
472
- <th>No.</th>
473
- <th>문서ID</th>
474
- <th>매출액</th>
475
- <th>최종수정자</th>
476
- <th>문서명</th>
477
- <th>최초등록자</th>
478
- <th>최초등록일</th>
479
- <th>최종수정일</th>
480
- </tr>
481
- `;
482
- src2 = `
483
- <tr>
484
- <th>No.</th>
485
- <th>매출액</th>
486
- <th>문서ID</th>
487
- <th>최종수정자</th>
488
- <th>문서명</th>
489
- <th>최초등록자</th>
490
- <th>최초등록일</th>
491
- <th>최종수정일</th>
492
- </tr>
493
- `; */
494
-
495
-
496
-
497
-
498
-
499
129
 
500
130
 
501
131
  const apply = {
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { IdeAssi } from "./components/ideAssi.js";
4
4
  import "./components/ideAssiSettings.js";
5
+ import "./components/ideTipPopup.js";
5
6
  import "./components/ideDiffPopup.js";
6
7
  import "./components/ideDiff.js";
7
8
  import { IdeFetch } from "./components/ideFetch.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ide-assi",
3
3
  "type": "module",
4
- "version": "0.521.0",
4
+ "version": "0.523.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "exports": {
@@ -2,6 +2,8 @@ import ninegrid from "ninegrid2";
2
2
  import { IdeAi } from "./ideAi.js";
3
3
  import { api } from "./ideFetch.js";
4
4
 
5
+
6
+
5
7
  export class IdeAssi extends HTMLElement
6
8
  {
7
9
  #ing = false;
@@ -32,7 +34,7 @@ export class IdeAssi extends HTMLElement
32
34
 
33
35
  <div class="container">
34
36
  <div class="head">
35
- <div class="logo"><span>nandoo@hanmail.net</span></div>
37
+ <div class="logo"><span></span></div>
36
38
  </div>
37
39
  <nx-ai-chat></nx-ai-chat>
38
40
  <div class="foot">
@@ -98,6 +100,10 @@ export class IdeAssi extends HTMLElement
98
100
 
99
101
  this.settings = this.shadowRoot.querySelector("ide-assi-settings");
100
102
 
103
+ this.shadowRoot.appendChild(document.createElement('ide-tip-popup'));
104
+ this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
105
+
106
+
101
107
  this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
102
108
 
103
109
  this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
@@ -120,382 +126,6 @@ export class IdeAssi extends HTMLElement
120
126
 
121
127
  //this.shadowRoot.querySelector('ide-diff-popup').remove();
122
128
 
123
- this.shadowRoot.appendChild(document.createElement('ide-diff-popup'));
124
-
125
- //setTimeout(() => {
126
- let src1 = `
127
- import React, { useRef, useEffect } from "react" adfa;
128
- import { api, ai } from "ide-assi";
129
- import ninegrid from "ninegrid2";
130
-
131
- const DocManager = () => {
132
- const tabRef = useRef(null);
133
- const gridRef = useRef(null);
134
-
135
- const selectList = async (params) => {
136
- if (!gridRef.current) return;
137
- gridRef.current.classList.add("loading");
138
- api.post(\`/api/tmpl-a/doc-manager/selectList\`, params).then((res) => {
139
- gridRef.current.data.source = res.list;
140
- });
141
- };
142
-
143
- const handleNaturalLanguageSearch = async () => {
144
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
145
- const searchText = searchTextElement ? searchTextElement.value : "";
146
-
147
- if (!gridRef.current) return;
148
- gridRef.current.classList.add("loading");
149
-
150
- let params = {};
151
- if (searchText) {
152
- params = {
153
- _whereClause: await ai.generateWhereCause(
154
- "tmpla/DocManagerMapper.xml",
155
- "selectList",
156
- searchText,
157
- import.meta.env.VITE_GEMINI_API_KEY
158
- ),
159
- };
160
- }
161
- selectList(params);
162
- };
163
-
164
- const handleClassicSearch = () => {
165
- if (!gridRef.current) return;
166
- gridRef.current.classList.add("loading");
167
-
168
- const form2Element = ninegrid.querySelector(".form2", tabRef.current);
169
- const params = form2Element ? form2Element.getData() : {};
170
- selectList(params);
171
- };
172
-
173
- useEffect(() => {
174
- selectList({});
175
-
176
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
177
- const searchButton = ninegrid.querySelector(".search", tabRef.current);
178
-
179
- const handleKeyDown = (e) => {
180
- if (e.key === "Enter" && !e.isComposing) {
181
- handleNaturalLanguageSearch();
182
- }
183
- };
184
-
185
- const handleClick = () => {
186
- handleClassicSearch();
187
- };
188
-
189
- if (searchTextElement) {
190
- searchTextElement.addEventListener("keydown", handleKeyDown);
191
- }
192
- if (searchButton) {
193
- searchButton.addEventListener("click", handleClick);
194
- }
195
-
196
- return () => {
197
- if (searchTextElement) {
198
- searchTextElement.removeEventListener("keydown", handleKeyDown);
199
- }
200
- if (searchButton) {
201
- searchButton.removeEventListener("click", handleClick);
202
- }
203
- };
204
- }, []);
205
-
206
- return (
207
- <div className="wrapper">
208
- <nx-collapse target="nx-tab" className="search-collapse"></nx-collapse>
209
- <div className="list-wrapper">
210
- <nx-tab theme="theme-3" ref={tabRef}>
211
- <nx-tab-page caption="자연어 검색">
212
- <nx-form className="form1">
213
- <input
214
- type="text"
215
- id="searchText"
216
- name="searchText"
217
- placeholder="자연어 검색어를 입력하세요 (ex: 작성자가 홍길동인 데이타를 찾아줘)"
218
- />
219
- </nx-form>
220
- </nx-tab-page>
221
- <nx-tab-page caption="클래식 검색">
222
- <nx-form className="form2">
223
- <label>문서명: <input type="text" name="docNm" /></label>
224
- <label>매출액:
225
- <input type="number" name="minAmt" placeholder="최소" /> ~
226
- <input type="number" name="maxAmt" placeholder="최대" />
227
- </label>
228
- </nx-form>
229
- <button className="search">검색</button>
230
- </nx-tab-page>
231
- </nx-tab>
232
-
233
- <div className="grid-wrapper">
234
- <nine-grid
235
- ref={gridRef}
236
- caption="문서관리"
237
- select-type="row"
238
- show-title-bar="true"
239
- show-menu-icon="true"
240
- show-status-bar="true"
241
- enable-fixed-col="true"
242
- row-resizable="false"
243
- col-movable="true"
244
- >
245
- <table>
246
- <colgroup>
247
- <col width="50" fixed="left" background-color="gray" />
248
- <col width="100" />
249
- <col width="100" />
250
- <col width="200" />
251
- <col width="120" />
252
- <col width="100" />
253
- <col width="150" />
254
- <col width="150" />
255
- </colgroup>
256
- <thead>
257
- <tr>
258
- <th>No.</th>
259
- <th>최종수정자</th>
260
- <th>문서ID</th>
261
- <th>문서명</th>
262
- <th>매출액</th>
263
- <th>최초등록자</th>
264
- <th>최초등록일</th>
265
- <th>최종수정일</th>
266
- </tr>
267
- </thead>
268
- <tbody>
269
- <tr>
270
- <th><ng-row-indicator /></th>
271
- <td data-bind="updateUser" text-align="center"></td>
272
- <td data-bind="docId" text-align="center"></td>
273
- <td data-bind="docNm" text-align="left"></td>
274
- <td
275
- data-bind="amt"
276
- data-expr="data.amt.toLocaleString()"
277
- text-align="right"
278
- show-icon="true"
279
- icon-type="sphere"
280
- icon-color="data.amt >= 2000 ? 'red' : 'gray'"
281
- ></td>
282
- <td data-bind="insertUser" text-align="center"></td>
283
- <td data-bind="insertDt" text-align="center"></td>
284
- <td data-bind="updateDt" text-align="center"></td>
285
- </tr>
286
- </tbody>
287
- </table>
288
- </nine-grid>
289
- </div>
290
- </div>
291
- </div>
292
- );
293
- };
294
-
295
- export default DocManager;
296
- `;
297
-
298
- let src2 = `
299
- import React, { useRef, useEffect } from "react";
300
- import { api, ai } from "ide-assi";
301
- import ninegrid from "ninegrid2";
302
-
303
- const DocManager = () => {
304
- const tabRef = useRef(null);
305
- const gridRef = useRef(null);
306
-
307
- const selectList = async (params) => {
308
- if (!gridRef.current) return;
309
- gridRef.current.classList.add("loading");
310
- api.post(\`/api/tmpl-a/doc-manager/selectList\`, params).then((res) => {
311
- gridRef.current.data.source = res.list;
312
- });
313
- };
314
-
315
- const handleNaturalLanguageSearch = async () => {
316
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
317
- const searchText = searchTextElement ? searchTextElement.value : "";
318
-
319
- if (!gridRef.current) return;
320
- gridRef.current.classList.add("loading");
321
-
322
- let params = {};
323
- if (searchText) {
324
- params = {
325
- _whereClause: await ai.generateWhereCause(
326
- "tmpla/DocManagerMapper.xml",
327
- "selectList",
328
- searchText,
329
- import.meta.env.VITE_GEMINI_API_KEY
330
- ),
331
- };
332
- }
333
- selectList(params);
334
- };
335
-
336
- const handleClassicSearch = () => {
337
- if (!gridRef.current) return;
338
- gridRef.current.classList.add("loading");
339
-
340
- const form2Element = ninegrid.querySelector(".form2", tabRef.current);
341
- const params = form2Element ? form2Element.getData() : {};
342
- selectList(params);
343
- };
344
-
345
- useEffect(() => {
346
- selectList({});
347
-
348
- const searchTextElement = ninegrid.querySelector("#searchText", tabRef.current);
349
- const searchButton = ninegrid.querySelector(".search", tabRef.current);
350
-
351
- const handleKeyDown = (e) => {
352
- if (e.key === "Enter" && !e.isComposing) {
353
- handleNaturalLanguageSearch();
354
- }
355
- };
356
-
357
- const handleClick = () => {
358
- handleClassicSearch();
359
- };
360
-
361
- if (searchTextElement) {
362
- searchTextElement.addEventListener("keydown", handleKeyDown);
363
- }
364
- if (searchButton) {
365
- searchButton.addEventListener("click", handleClick);
366
- }
367
-
368
- return () => {
369
- if (searchTextElement) {
370
- searchTextElement.removeEventListener("keydown", handleKeyDown);
371
- }
372
- if (searchButton) {
373
- searchButton.removeEventListener("click", handleClick);
374
- }
375
- };
376
- }, []);
377
-
378
- return (
379
- <div className="wrapper">
380
- <nx-collapse target="nx-tab" className="search-collapse"></nx-collapse>
381
- <div className="list-wrapper">
382
- <nx-tab theme="theme-3" ref={tabRef}>
383
- <nx-tab-page caption="자연어 검색">
384
- <nx-form className="form1">
385
- <input
386
- type="text"
387
- id="searchText"
388
- name="searchText"
389
- placeholder="자연어 검색어를 입력하세요 (ex: 작성자가 홍길동인 데이타를 찾아줘)"
390
- />
391
- </nx-form>
392
- </nx-tab-page>
393
- <nx-tab-page caption="클래식 검색">
394
- <nx-form className="form2">
395
- <label>문서명: <input type="text" name="docNm" /></label>
396
- <label>매출액:
397
- <input type="number" name="minAmt" placeholder="최소" /> ~
398
- <input type="number" name="maxAmt" placeholder="최대" />
399
- </label>
400
- </nx-form>
401
- <button className="search">검색</button>
402
- </nx-tab-page>
403
- </nx-tab>
404
-
405
- <div className="grid-wrapper">
406
- <nine-grid
407
- ref={gridRef}
408
- caption="매출 문서 관리"
409
- select-type="row"
410
- show-title-bar="true"
411
- show-menu-icon="true"
412
- show-status-bar="true"
413
- enable-fixed-col="true"
414
- row-resizable="false"
415
- col-movable="true"
416
- >
417
- <table>
418
- <colgroup>
419
- <col width="50" fixed="left" background-color="gray" />
420
- <col width="100" />
421
- <col width="120" />
422
- <col width="100" />
423
- <col width="200" />
424
- <col width="100" />
425
- <col width="150" />
426
- <col width="150" />
427
- </colgroup>
428
- <thead>
429
- <tr>
430
- <th>No.</th>
431
- <th>문서ID</th>
432
- <th>매출액</th>
433
- <th>최종수정자</th>
434
- <th>문서명</th>
435
- <th>최초등록자</th>
436
- <th>최초등록일</th>
437
- <th>최종수정일</th>
438
- </tr>
439
- </thead>
440
- <tbody>
441
- <tr>
442
- <th><ng-row-indicator /></th>
443
- <td data-bind="docId" text-align="center"></td>
444
- <td
445
- data-bind="amt"
446
- data-expr="data.amt.toLocaleString()"
447
- text-align="right"
448
- show-icon="true"
449
- icon-type="sphere"
450
- icon-color="data.amt >= 2000 ? 'red' : 'gray'"
451
- ></td>
452
- <td data-bind="updateUser" text-align="center"></td>
453
- <td data-bind="docNm" text-align="left"></td>
454
- <td data-bind="insertUser" text-align="center"></td>
455
- <td data-bind="insertDt" text-align="center"></td>
456
- <td data-bind="updateDt" text-align="center"></td>
457
- </tr>
458
- </tbody>
459
- </table>
460
- </nine-grid>
461
- </div>
462
- </div>
463
- </div>
464
- );
465
- };
466
-
467
- export default DocManager;
468
- `;
469
- /**
470
- src1 = `
471
- <tr>
472
- <th>No.</th>
473
- <th>문서ID</th>
474
- <th>매출액</th>
475
- <th>최종수정자</th>
476
- <th>문서명</th>
477
- <th>최초등록자</th>
478
- <th>최초등록일</th>
479
- <th>최종수정일</th>
480
- </tr>
481
- `;
482
- src2 = `
483
- <tr>
484
- <th>No.</th>
485
- <th>매출액</th>
486
- <th>문서ID</th>
487
- <th>최종수정자</th>
488
- <th>문서명</th>
489
- <th>최초등록자</th>
490
- <th>최초등록일</th>
491
- <th>최종수정일</th>
492
- </tr>
493
- `; */
494
-
495
-
496
-
497
-
498
-
499
129
 
500
130
 
501
131
  const apply = {
package/src/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { IdeAssi } from "./components/ideAssi.js";
4
4
  import "./components/ideAssiSettings.js";
5
+ import "./components/ideTipPopup.js";
5
6
  import "./components/ideDiffPopup.js";
6
7
  import "./components/ideDiff.js";
7
8
  import { IdeFetch } from "./components/ideFetch.js";