lupine.api 1.0.41

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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/admin/admin-about.tsx +16 -0
  4. package/admin/admin-config.tsx +44 -0
  5. package/admin/admin-css.tsx +3 -0
  6. package/admin/admin-db.tsx +74 -0
  7. package/admin/admin-frame-props.tsx +9 -0
  8. package/admin/admin-frame.tsx +466 -0
  9. package/admin/admin-index.tsx +66 -0
  10. package/admin/admin-login.tsx +99 -0
  11. package/admin/admin-menu-edit.tsx +637 -0
  12. package/admin/admin-menu-list.tsx +87 -0
  13. package/admin/admin-page-edit.tsx +564 -0
  14. package/admin/admin-page-list.tsx +83 -0
  15. package/admin/admin-performance.tsx +28 -0
  16. package/admin/admin-release.tsx +320 -0
  17. package/admin/admin-resources.tsx +385 -0
  18. package/admin/admin-shell.tsx +89 -0
  19. package/admin/admin-table-data.tsx +146 -0
  20. package/admin/admin-table-list.tsx +231 -0
  21. package/admin/admin-test-animations.tsx +379 -0
  22. package/admin/admin-test-component.tsx +808 -0
  23. package/admin/admin-test-edit.tsx +319 -0
  24. package/admin/admin-test-themes.tsx +56 -0
  25. package/admin/admin-tokens.tsx +338 -0
  26. package/admin/design/admin-design.tsx +174 -0
  27. package/admin/design/block-grid.tsx +36 -0
  28. package/admin/design/block-grid1.tsx +21 -0
  29. package/admin/design/block-paragraph.tsx +19 -0
  30. package/admin/design/block-title.tsx +19 -0
  31. package/admin/design/design-block-box.tsx +140 -0
  32. package/admin/design/drag-data.tsx +24 -0
  33. package/admin/index.ts +6 -0
  34. package/admin/package.json +15 -0
  35. package/admin/tsconfig.json +127 -0
  36. package/dev/copy-folder.js +32 -0
  37. package/dev/cp-index-html.js +69 -0
  38. package/dev/file-utils.js +12 -0
  39. package/dev/index.js +19 -0
  40. package/dev/package.json +12 -0
  41. package/dev/plugin-gen-versions.js +20 -0
  42. package/dev/plugin-ifelse.js +155 -0
  43. package/dev/plugin-ifelse.test.js +37 -0
  44. package/dev/run-cmd.js +14 -0
  45. package/dev/send-request.js +12 -0
  46. package/package.json +55 -0
  47. package/src/admin-api/admin-api.ts +59 -0
  48. package/src/admin-api/admin-auth.ts +87 -0
  49. package/src/admin-api/admin-config.ts +93 -0
  50. package/src/admin-api/admin-csv.ts +81 -0
  51. package/src/admin-api/admin-db.ts +269 -0
  52. package/src/admin-api/admin-helper.ts +111 -0
  53. package/src/admin-api/admin-menu.ts +135 -0
  54. package/src/admin-api/admin-page.ts +135 -0
  55. package/src/admin-api/admin-performance.ts +128 -0
  56. package/src/admin-api/admin-release.ts +498 -0
  57. package/src/admin-api/admin-resources.ts +318 -0
  58. package/src/admin-api/admin-token-helper.ts +79 -0
  59. package/src/admin-api/admin-tokens.ts +90 -0
  60. package/src/admin-api/index.ts +2 -0
  61. package/src/api/api-cache.ts +103 -0
  62. package/src/api/api-helper.ts +44 -0
  63. package/src/api/api-module.ts +60 -0
  64. package/src/api/api-router.ts +177 -0
  65. package/src/api/api-shared-storage.ts +64 -0
  66. package/src/api/async-storage.ts +5 -0
  67. package/src/api/debug-service.ts +56 -0
  68. package/src/api/encode-html.ts +27 -0
  69. package/src/api/handle-status.ts +71 -0
  70. package/src/api/index.ts +16 -0
  71. package/src/api/mini-web-socket.ts +270 -0
  72. package/src/api/server-content-type.ts +82 -0
  73. package/src/api/server-render.ts +216 -0
  74. package/src/api/shell-service.ts +66 -0
  75. package/src/api/simple-storage.ts +80 -0
  76. package/src/api/static-server.ts +125 -0
  77. package/src/api/to-client-delivery.ts +26 -0
  78. package/src/app/app-cache.ts +55 -0
  79. package/src/app/app-loader.ts +62 -0
  80. package/src/app/app-message.ts +60 -0
  81. package/src/app/app-shared-storage.ts +317 -0
  82. package/src/app/app-start.ts +117 -0
  83. package/src/app/cleanup-exit.ts +12 -0
  84. package/src/app/host-to-path.ts +38 -0
  85. package/src/app/index.ts +11 -0
  86. package/src/app/process-dev-requests.ts +90 -0
  87. package/src/app/web-listener.ts +230 -0
  88. package/src/app/web-processor.ts +42 -0
  89. package/src/app/web-server.ts +86 -0
  90. package/src/common-js/web-env.js +104 -0
  91. package/src/index.ts +7 -0
  92. package/src/lang/api-lang-en.ts +27 -0
  93. package/src/lang/api-lang-zh-cn.ts +28 -0
  94. package/src/lang/index.ts +2 -0
  95. package/src/lang/lang-helper.ts +76 -0
  96. package/src/lang/lang-props.ts +6 -0
  97. package/src/lib/db/db-helper.ts +23 -0
  98. package/src/lib/db/db-mysql.ts +250 -0
  99. package/src/lib/db/db-sqlite.ts +101 -0
  100. package/src/lib/db/db.spec.ts +28 -0
  101. package/src/lib/db/db.ts +304 -0
  102. package/src/lib/db/index.ts +5 -0
  103. package/src/lib/index.ts +3 -0
  104. package/src/lib/logger.spec.ts +214 -0
  105. package/src/lib/logger.ts +274 -0
  106. package/src/lib/runtime-require.ts +37 -0
  107. package/src/lib/utils/cookie-util.ts +34 -0
  108. package/src/lib/utils/crypto.ts +58 -0
  109. package/src/lib/utils/date-utils.ts +317 -0
  110. package/src/lib/utils/deep-merge.ts +37 -0
  111. package/src/lib/utils/delay.ts +12 -0
  112. package/src/lib/utils/file-setting.ts +55 -0
  113. package/src/lib/utils/format-bytes.ts +11 -0
  114. package/src/lib/utils/fs-utils.ts +144 -0
  115. package/src/lib/utils/get-env.ts +27 -0
  116. package/src/lib/utils/index.ts +12 -0
  117. package/src/lib/utils/is-type.ts +48 -0
  118. package/src/lib/utils/load-env.ts +14 -0
  119. package/src/lib/utils/pad.ts +6 -0
  120. package/src/models/api-base.ts +5 -0
  121. package/src/models/api-module-props.ts +11 -0
  122. package/src/models/api-router-props.ts +26 -0
  123. package/src/models/app-cache-props.ts +33 -0
  124. package/src/models/app-data-props.ts +10 -0
  125. package/src/models/app-loader-props.ts +6 -0
  126. package/src/models/app-shared-storage-props.ts +37 -0
  127. package/src/models/app-start-props.ts +18 -0
  128. package/src/models/async-storage-props.ts +13 -0
  129. package/src/models/db-config.ts +30 -0
  130. package/src/models/host-to-path-props.ts +12 -0
  131. package/src/models/index.ts +16 -0
  132. package/src/models/json-object.ts +8 -0
  133. package/src/models/locals-props.ts +36 -0
  134. package/src/models/logger-props.ts +84 -0
  135. package/src/models/simple-storage-props.ts +14 -0
  136. package/src/models/to-client-delivery-props.ts +6 -0
  137. package/tsconfig.json +115 -0
@@ -0,0 +1,231 @@
1
+ import {
2
+ DomUtils,
3
+ NotificationColor,
4
+ NotificationMessage,
5
+ CssProps,
6
+ RefProps,
7
+ getRenderPageProps,
8
+ mountInnerComponent,
9
+ downloadLink,
10
+ } from 'lupine.components';
11
+ import { adminFrameProps } from './admin-frame-props';
12
+ import { TableDataPage } from './admin-table-data';
13
+
14
+ const fetchTableList = async () => {
15
+ const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/tables/list');
16
+ return data.json;
17
+ };
18
+ const fetchTableDrop = async (tableName: string) => {
19
+ const data = await getRenderPageProps().renderPageFunctions.fetchData(`/api/admin/db/table/drop/${tableName}`);
20
+ return data.json;
21
+ };
22
+ const fetchTableTruncate = async (tableName: string) => {
23
+ const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/table/truncate/' + tableName);
24
+ return data.json;
25
+ };
26
+ const fetchTableTruncateAll = async () => {
27
+ const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/tables/truncate');
28
+ return data.json;
29
+ };
30
+
31
+ export const TableListPage = () => {
32
+ const refUpdate = adminFrameProps.tabsHook;
33
+
34
+ const openTablePanel = async (tableName: string) => {
35
+ if (refUpdate?.getCount && refUpdate.getCount() > adminFrameProps.maxTabsCount) {
36
+ alert('You are opening too many pages');
37
+ return;
38
+ }
39
+ if (refUpdate?.findAndActivate && refUpdate.findAndActivate('Table: ' + tableName)) {
40
+ return;
41
+ }
42
+ refUpdate?.newPage && (await refUpdate.newPage('Table: ' + tableName, TableDataPage(tableName)));
43
+ };
44
+
45
+ const onDelete = async (tableName: string) => {
46
+ if (!confirm(`Are you really Deleting ${tableName}?`)) {
47
+ return;
48
+ }
49
+ const json = await fetchTableDrop(tableName);
50
+ console.log('====fetchTableDelete', json);
51
+ NotificationMessage.sendMessage('Deleted: ' + tableName);
52
+ onClick();
53
+ };
54
+
55
+ const onDownload = async (tableName: string) => {
56
+ downloadLink('/api/admin/db/table/download/' + tableName);
57
+ };
58
+
59
+ const onTruncate = async (tableName: string) => {
60
+ if (!confirm(`Are you really Removing all data for ${tableName}?`)) {
61
+ return;
62
+ }
63
+ const json = await fetchTableTruncate(tableName);
64
+ console.log('====fetchTableTruncate', json);
65
+ NotificationMessage.sendMessage('Truncated: ' + tableName);
66
+ onClick();
67
+ };
68
+
69
+ const onDownloadAll = async () => {
70
+ downloadLink('/api/admin/db/tables/download');
71
+ };
72
+
73
+ const onTruncateAll = async () => {
74
+ if (!confirm(`Are you really Removing all data for all tables? You can't revert it! (first confirm)`)) {
75
+ return;
76
+ }
77
+ if (
78
+ !confirm(`Are you really Removing all data for all tables? You may not be able to login again! (last confirm)`)
79
+ ) {
80
+ return;
81
+ }
82
+ await fetchTableTruncateAll();
83
+ NotificationMessage.sendMessage('Truncated all tables!');
84
+ onClick();
85
+ };
86
+
87
+ const onDropAll = async () => {
88
+ if (!confirm(`Are you really Dropping all tables? You can't revert it! (first confirm)`)) {
89
+ return;
90
+ }
91
+ if (!confirm(`Are you really Dropping all tables? You may not be able to login again! (last confirm)`)) {
92
+ return;
93
+ }
94
+ const data = await getRenderPageProps().renderPageFunctions.fetchData('/api/admin/db/tables/drop');
95
+ NotificationMessage.sendMessage('Dropped all tables!' + JSON.stringify(data.json, null, ' '));
96
+ onClick();
97
+ };
98
+
99
+ const onClick = async () => {
100
+ const search = refInput.current.value;
101
+ const json = await fetchTableList();
102
+ console.log('====fetchTableList', json);
103
+
104
+ if (!json || json.status !== 'ok') {
105
+ NotificationMessage.sendMessage(json.message, NotificationColor.Error);
106
+ return;
107
+ }
108
+ const dom =
109
+ json && json.status === 'ok' && json.result.length > 0 ? (
110
+ <div>
111
+ {json.result
112
+ .filter((item: { tbl_name: string | any[] }) => {
113
+ return !search || item.tbl_name.indexOf(search) >= 0;
114
+ })
115
+ .map((item: any, index: number) => {
116
+ return (
117
+ <div class={'row-' + (index % 2)}>
118
+ <a href='javascript:void(0);' onClick={() => openTablePanel(item.tbl_name)}>
119
+ {item.tbl_name}
120
+ </a>
121
+ , count: {item.count}
122
+ <div>sql: {item.sql},</div>
123
+ <div class={'row-box'}>
124
+ <button onClick={() => openTablePanel(item.tbl_name)} class='button-base button-s'>
125
+ Browse
126
+ </button>
127
+ <button onClick={() => onDownload(item.tbl_name)} class='button-base button-s'>
128
+ Download
129
+ </button>
130
+ <button onClick={() => onTruncate(item.tbl_name)} class='button-base button-s red'>
131
+ Truncate
132
+ </button>
133
+ <button onClick={() => onDelete(item.tbl_name)} class='button-base button-s red'>
134
+ Drop
135
+ </button>
136
+ </div>
137
+ </div>
138
+ );
139
+ })}
140
+ </div>
141
+ ) : (
142
+ <div>No Result</div>
143
+ );
144
+
145
+ await mountInnerComponent(document.querySelector('.admin-table-list'), dom);
146
+ };
147
+ const onUpload = async () => {
148
+ const domFile = document.querySelector('#upload_data') as HTMLInputElement;
149
+ if (!domFile.files || domFile.files.length !== 1) {
150
+ alert('Please select one and only one file.');
151
+ return;
152
+ }
153
+
154
+ const data = await fetch('/api/admin/db/tables/upload', {
155
+ method: 'POST',
156
+ body: new Uint8Array(await domFile.files[0].arrayBuffer()),
157
+ headers: {
158
+ 'Content-type': domFile.files[0].type,
159
+ },
160
+ });
161
+ const result = await data.json();
162
+ domFile.value = '';
163
+ onClick();
164
+ // document.querySelector('.admin-table-log')!.innerHTML = JSON.stringify(result, null, ' ');
165
+ NotificationMessage.sendMessage(JSON.stringify(result, null, ' '), NotificationColor.Info, true);
166
+ };
167
+
168
+ const css: CssProps = {
169
+ '.admin-table-list > div > div': {
170
+ backgroundColor: 'var(--row-1-bg-color)', //'#95c998',
171
+ marginTop: '16px',
172
+ },
173
+ '.admin-table-list .row-1': {
174
+ backgroundColor: 'var(--row-2-bg-color)', //'#e8f8e8', //#95c998
175
+ },
176
+ '.admin-table-list > div > div:hover': {
177
+ backgroundColor: 'var(--row-hover-bg-color)',
178
+ },
179
+ '.admin-table-log': {
180
+ display: 'block',
181
+ unicodeBidi: 'embed',
182
+ fontFamily: 'monospace',
183
+ whiteSpace: 'pre',
184
+ },
185
+ };
186
+ let timeoutID: NodeJS.Timeout | undefined = undefined;
187
+ const refInput: RefProps = {};
188
+ const ref: RefProps = {
189
+ onLoad: onClick,
190
+ };
191
+ const onInput = () => {
192
+ if (timeoutID) {
193
+ clearTimeout(timeoutID);
194
+ }
195
+ timeoutID = setTimeout(() => {
196
+ onClick();
197
+ }, 500);
198
+ };
199
+ return (
200
+ <div css={css} ref={ref}>
201
+ <div class='admin-sub-title'>Table List</div>
202
+ <div class='row-box'>
203
+ <div>
204
+ <input type='text' ref={refInput} class='input-base' placeholder='Search' onInput={onInput} />
205
+ </div>
206
+ <button onClick={onClick} class='button-base'>
207
+ Refresh List
208
+ </button>
209
+ <button onClick={onDownloadAll} class='button-base'>
210
+ Download all data
211
+ </button>
212
+ <button onClick={onTruncateAll} class='button-base red'>
213
+ Truncate all data
214
+ </button>
215
+ <button onClick={onDropAll} class='button-base red'>
216
+ Drop all table
217
+ </button>
218
+ </div>
219
+ <div class='row-box mt1'>
220
+ <div>
221
+ <input type='file' id='upload_data' class='input-base' />
222
+ </div>
223
+ <button onClick={onUpload} class='button-base'>
224
+ Upload
225
+ </button>
226
+ </div>
227
+ <div class='admin-table-log'></div>
228
+ <div class='admin-table-list'>(Table list)</div>
229
+ </div>
230
+ );
231
+ };
@@ -0,0 +1,379 @@
1
+ import {
2
+ RefProps,
3
+ updateStyles,
4
+ ButtonPushAnimation,
5
+ ButtonPushAnimationSize,
6
+ HtmlVar,
7
+ PlayButton,
8
+ PlayButtonSize,
9
+ Progress,
10
+ ProgressHookProps,
11
+ Spinner01,
12
+ Spinner02,
13
+ Spinner03,
14
+ SpinnerSize,
15
+ TextGlow,
16
+ TextWave,
17
+ CssProps,
18
+ } from 'lupine.components';
19
+
20
+ const TestButton = () => {
21
+ const onClick = async () => {
22
+ dom.value = 'You clicked the button.';
23
+ };
24
+ const ref: RefProps = {
25
+ onLoad: async () => {
26
+ dom.value = 'This value is set in onLoad event.';
27
+ },
28
+ };
29
+ const dom = HtmlVar('');
30
+ return (
31
+ <div ref={ref} class='row-box pt-m'>
32
+ <button onClick={onClick} class='button-base'>
33
+ Click me!
34
+ </button>
35
+ <div class='pl-m'>{dom.node}</div>
36
+ </div>
37
+ );
38
+ };
39
+
40
+ const TestInput = () => {
41
+ const onInput = async (ev?: any) => {
42
+ // you can get value from: ev.target.value
43
+ dom.value = 'Your input: ' + refInput.current.value;
44
+ };
45
+ const onClick = async () => {
46
+ refInput.current.value = '';
47
+ refInput.current.dispatchEvent(new Event('input'));
48
+ };
49
+ const dom = HtmlVar('');
50
+ const refInput: RefProps = {};
51
+ return (
52
+ <div>
53
+ <div class='row-box pt-m'>
54
+ <input ref={refInput} class='input-base' type='input' onInput={onInput} />
55
+ <div class='pl-m'>{dom.node}</div>
56
+ </div>
57
+ <div class='row-box pt-m'>
58
+ <button onClick={onClick} class='button-base'>
59
+ Clear Input Value
60
+ </button>
61
+ </div>
62
+ </div>
63
+ );
64
+ };
65
+
66
+ const TestMouse = () => {
67
+ const onClick = (ev: any) => {
68
+ dom.value = `Clicked: x: ${ev.clientX}, y: ${ev.clientY}`;
69
+ };
70
+ const onMMove = (ev: any) => {
71
+ dom.value = `Moving: x: ${ev.clientX}, y: ${ev.clientY}`;
72
+ };
73
+ const dom = HtmlVar('');
74
+ return (
75
+ <div style={{ border: 'solid 1px red' }} class='row-box p-m' onMouseMove={onMMove}>
76
+ <button onClick={onClick} class='button-base'>
77
+ Move your mouse
78
+ </button>
79
+ <div class='pt-m'>{dom.node}</div>
80
+ </div>
81
+ );
82
+ };
83
+
84
+ // You can use defaultMessageHub, or use the sample here
85
+ type CommunicationProps = {
86
+ update: {
87
+ send: (obj: { id: string; message: string }) => { status: 'ok' | 'error'; message: string };
88
+ receive?: (obj: { id: string; message: string }) => { status: 'ok' | 'error'; message: string };
89
+ };
90
+ };
91
+ const TestCommunication = (props: CommunicationProps) => {
92
+ const onInput = async (ev: any) => {
93
+ const msg = ev.target.value;
94
+ const response = props.update.send({ id: 'msg', message: msg });
95
+ dom.value = `response, status: ${response.status}, msg: ${response.message}`;
96
+ };
97
+ props.update.receive = (obj: { id: string; message: string }) => {
98
+ dom.value = `received message, id: ${obj.id}, msg: ${obj.message}`;
99
+ return { status: 'ok', message: 'echo: ' + obj.message };
100
+ };
101
+ const dom = HtmlVar('');
102
+ return (
103
+ <div>
104
+ <div class='row-box pt-m'>
105
+ <label class='pr-m'>Send Message: </label>
106
+ <input class='input-base' type='input' onInput={onInput} />
107
+ </div>
108
+ <div class='row-box pt-m'>
109
+ <label class='pr-m'>Received Message: </label>
110
+ <div class='pl-m'>{dom.node}</div>
111
+ </div>
112
+ </div>
113
+ );
114
+ };
115
+
116
+ const TestHtmlVar = () => {
117
+ let count = 0;
118
+ const onClick = () => {
119
+ count++;
120
+ dom.value = defaultContent();
121
+ };
122
+ const defaultContent = () => {
123
+ // <></> is not needed, and here is used to test that <fragment> tag is not added
124
+ return (
125
+ <>
126
+ <div class='row-box pt-m'>
127
+ <label class='pr-m'>Count: {count}</label>
128
+ <button class='button-base' onClick={onClick}>Click me</button>
129
+ </div>
130
+ </>
131
+ );
132
+ };
133
+ const dom = HtmlVar(defaultContent());
134
+ const css: CssProps = {
135
+ backgroundColor: '#a1ffe8',
136
+ padding: '10px',
137
+ };
138
+ const ref: RefProps = {};
139
+ return (
140
+ <div ref={ref} css={css}>
141
+ {dom.node}
142
+ </div>
143
+ );
144
+ };
145
+
146
+ const TestMountInnerComponent = () => {
147
+ let count = 0;
148
+ const css: CssProps = {
149
+ backgroundColor: '#a1ffa7',
150
+ padding: '10px',
151
+ };
152
+ const ref: RefProps = {};
153
+ const onClick = () => {
154
+ count++;
155
+ ref.mountInnerComponent!(defaultContent());
156
+ };
157
+ const defaultContent = () => {
158
+ // <></> is not needed, and here is used to test that <fragment> tag is not added
159
+ return (
160
+ <>
161
+ <div class='row-box pt-m'>
162
+ <label class='pr-m'>Count: {count}</label>
163
+ <button class='button-base' onClick={onClick}>Click me</button>
164
+ </div>
165
+ </>
166
+ );
167
+ };
168
+ return (
169
+ <div ref={ref} css={css}>
170
+ {defaultContent()}
171
+ </div>
172
+ );
173
+ };
174
+
175
+ const TestStyles = () => {
176
+ const css: any = {
177
+ color: 'blue',
178
+ border: '1px solid red',
179
+ 'font-size': 20,
180
+ '@keyframes spin': {
181
+ '0%': {
182
+ textShadow: '5px 5px 0 #ff005e, 5px 5px 0 #00d4ff',
183
+ },
184
+ '50%': {
185
+ textShadow: '-5px -5px 0 #00d4ff, -5px -5px 0 #ff005e',
186
+ },
187
+ },
188
+ '.text, .text2': {
189
+ 'font-size': '15px',
190
+ animation: 'spin 5s infinite',
191
+ },
192
+ '.text2:hover': {
193
+ color: 'red',
194
+ border: '1px solid green',
195
+ 'font-size': '15px',
196
+ },
197
+ '@media screen and (min-width: 768px)': {
198
+ '.text, .text2': {
199
+ color: 'blue',
200
+ 'font-size': '20px',
201
+ },
202
+ },
203
+ '@media screen and (min-width: 1024px)': {
204
+ '.text': {
205
+ color: 'orange',
206
+ 'font-size': '30px',
207
+ },
208
+ },
209
+ };
210
+ let ref: RefProps = { id: '' };
211
+ const onClick = () => {
212
+ css.color = css.color === 'blue' ? 'green' : 'blue';
213
+ updateStyles(`[${ref.id}]`, css);
214
+ console.log(`update styles`, css.color, css);
215
+ };
216
+ return (
217
+ <div ref={ref} css={css} style='padding:10px;' class='pt-m' onClick={onClick}>
218
+ Click to change styles, <span class='text'>Change window's width, </span>
219
+ <span class='text2'>Move mouse to here</span>
220
+ </div>
221
+ );
222
+ };
223
+
224
+ const TestProgress = () => {
225
+ const progressHook: ProgressHookProps = {};
226
+ return (
227
+ <div>
228
+ <div class='row-box mb-s'>
229
+ <Progress hook={progressHook} />
230
+ </div>
231
+ <button
232
+ class='button-base button-m m-m'
233
+ onClick={async () => {
234
+ progressHook.onShow?.(true, 'Test Progress');
235
+ for (let i = 0; i < 100; i++) {
236
+ progressHook.onProgress?.(i / 100, 1, 1);
237
+ await new Promise((resolve) => setTimeout(resolve, 10));
238
+ }
239
+ progressHook.onShow?.(false);
240
+ }}
241
+ >
242
+ Test Progress
243
+ </button>
244
+ </div>
245
+ );
246
+ };
247
+
248
+ export const AdminTestAnimationsPage = () => {
249
+ const msg1: CommunicationProps = {
250
+ update: {
251
+ send: (obj: { id: string; message: string }) => {
252
+ return msg2.update.receive!(obj);
253
+ },
254
+ },
255
+ };
256
+ const msg2: CommunicationProps = {
257
+ update: {
258
+ send: (obj: { id: string; message: string }) => {
259
+ return msg1.update.receive!(obj);
260
+ },
261
+ },
262
+ };
263
+ return (
264
+ <div>
265
+ <div>
266
+ <div>Test the Button's onClick event.</div>
267
+ <TestButton />
268
+ </div>
269
+ <div class='pt-m'>
270
+ <br />
271
+ <hr />
272
+ <br />
273
+ <div>Test the Input's onChange event.</div>
274
+ <TestInput />
275
+ </div>
276
+ <div class='pt-m'>
277
+ <br />
278
+ <hr />
279
+ <br />
280
+ <div>Test Mouse event.</div>
281
+ <TestMouse />
282
+ </div>
283
+ <div class='pt-m'>
284
+ <br />
285
+ <hr />
286
+ <br />
287
+ <div>Test Communication between components.</div>
288
+ <TestCommunication update={msg1.update} />
289
+ <TestCommunication update={msg2.update} />
290
+ </div>
291
+
292
+ <div class='pt-m'>
293
+ <br />
294
+ <hr />
295
+ <br />
296
+ <div>Test HtmlVar</div>
297
+ <TestHtmlVar />
298
+ </div>
299
+
300
+ <div class='pt-m'>
301
+ <br />
302
+ <hr />
303
+ <br />
304
+ <div>Test mountInnerComponent</div>
305
+ <TestMountInnerComponent />
306
+ </div>
307
+
308
+ <div class='pt-m'>
309
+ <br />
310
+ <hr />
311
+ <br />
312
+ <div>Test Style.</div>
313
+ <TestStyles />
314
+ </div>
315
+ <div class='pt-m'>
316
+ <br />
317
+ <hr />
318
+ <br />
319
+ <div>Test Text Glow.</div>
320
+ <TextGlow text='This is a sample of Text Glow' />
321
+ </div>
322
+ <div class='pt-m'>
323
+ <br />
324
+ <hr />
325
+ <br />
326
+ <div>Test Text Wave.</div>
327
+ <TextWave text='This is a sample of Text Wave' />
328
+ </div>
329
+
330
+ <div class='pt-m'>
331
+ PlayButton
332
+ <PlayButton size={PlayButtonSize.Small} />
333
+ <PlayButton size={PlayButtonSize.Medium} />
334
+ <PlayButton size={PlayButtonSize.Large} />
335
+ </div>
336
+
337
+ <div class='p2'>
338
+ <div class='row-box mb-s'>
339
+ <Spinner01 size={SpinnerSize.Small} />
340
+ <Spinner01 size={SpinnerSize.Medium} />
341
+ <Spinner01 size={SpinnerSize.Large} />
342
+ <Spinner01 size={SpinnerSize.LargeLarge} />
343
+ </div>
344
+ <div class='row-box mb-s'>
345
+ <Spinner02 size={SpinnerSize.Small} />
346
+ <Spinner02 size={SpinnerSize.Medium} />
347
+ <Spinner02 size={SpinnerSize.Large} />
348
+ <Spinner02 size={SpinnerSize.LargeLarge} />
349
+ </div>
350
+ <div class='row-box mb-s'>
351
+ <Spinner03 size={SpinnerSize.Small} />
352
+ <Spinner03 size={SpinnerSize.Medium} />
353
+ <Spinner03 size={SpinnerSize.Large} />
354
+ <Spinner03 size={SpinnerSize.LargeLarge} />
355
+ </div>
356
+
357
+ <div class='row-box mb-s'>
358
+ <ButtonPushAnimation text='Test ButtonPushAnimation' size={ButtonPushAnimationSize.SmallSmall} />
359
+ </div>
360
+ <div class='row-box mb-s'>
361
+ <ButtonPushAnimation text='Test ButtonPushAnimation' size={ButtonPushAnimationSize.Small} />
362
+ </div>
363
+ <div class='row-box mb-s'>
364
+ <ButtonPushAnimation text='Test ButtonPushAnimation' size={ButtonPushAnimationSize.Medium} />
365
+ </div>
366
+ <div class='row-box mb-s'>
367
+ <ButtonPushAnimation text='Test ButtonPushAnimation' size={ButtonPushAnimationSize.Large} />
368
+ </div>
369
+ <div class='row-box mb-s'>
370
+ <ButtonPushAnimation text='Test ButtonPushAnimation' size={ButtonPushAnimationSize.LargeLarge} />
371
+ </div>
372
+
373
+ <div class='row-box mb-s'>
374
+ <TestProgress />
375
+ </div>
376
+ </div>
377
+ </div>
378
+ );
379
+ };