bmd-extension 1.6.3

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 (226) hide show
  1. package/.vscode/launch.json +14 -0
  2. package/.vscode/settings.json +1 -0
  3. package/CHANGELOG.md +9 -0
  4. package/DEPLOY.md +4 -0
  5. package/README.md +17 -0
  6. package/README_PRIVATE.md +1 -0
  7. package/build.sh +5 -0
  8. package/logo.png +0 -0
  9. package/media/dark/add.svg +40 -0
  10. package/media/dark/block.svg +1 -0
  11. package/media/dark/checklist-1.svg +1 -0
  12. package/media/dark/checklist.svg +1 -0
  13. package/media/dark/control.svg +1 -0
  14. package/media/dark/create.svg +1 -0
  15. package/media/dark/delete-1.svg +1 -0
  16. package/media/dark/delete.svg +1 -0
  17. package/media/dark/deploy-1.svg +2 -0
  18. package/media/dark/deploy.svg +2 -0
  19. package/media/dark/documents.svg +66 -0
  20. package/media/dark/earth.svg +68 -0
  21. package/media/dark/exe.svg +15 -0
  22. package/media/dark/export.svg +1 -0
  23. package/media/dark/function.svg +1 -0
  24. package/media/dark/game-controller.svg +77 -0
  25. package/media/dark/get.svg +1 -0
  26. package/media/dark/id-card.svg +59 -0
  27. package/media/dark/identity.svg +81 -0
  28. package/media/dark/import.svg +1 -0
  29. package/media/dark/information.svg +1 -0
  30. package/media/dark/interface.svg +1 -0
  31. package/media/dark/layout.svg +41 -0
  32. package/media/dark/leaf.svg +54 -0
  33. package/media/dark/list.svg +13 -0
  34. package/media/dark/logo.svg +249 -0
  35. package/media/dark/mockup.svg +1 -0
  36. package/media/dark/needle.svg +1 -0
  37. package/media/dark/pass.svg +46 -0
  38. package/media/dark/plus.svg +1 -0
  39. package/media/dark/post.svg +1 -0
  40. package/media/dark/quit.svg +1 -0
  41. package/media/dark/rocket.svg +28 -0
  42. package/media/dark/service.svg +1 -0
  43. package/media/dark/settings.svg +98 -0
  44. package/media/dark/social.svg +1 -0
  45. package/media/dark/spaceship-1.svg +1 -0
  46. package/media/dark/spaceship-2.svg +1 -0
  47. package/media/dark/spaceship.svg +1 -0
  48. package/media/dark/support.svg +88 -0
  49. package/media/dark/transfer.svg +1 -0
  50. package/media/dark/transform.svg +92 -0
  51. package/media/dark/update.svg +45 -0
  52. package/media/dark/upload-1.svg +1 -0
  53. package/media/dark/upload.svg +41 -0
  54. package/media/dark/vaccine.svg +1 -0
  55. package/media/dark/vr-gaming.svg +1 -0
  56. package/media/light/add.svg +40 -0
  57. package/media/light/block.svg +1 -0
  58. package/media/light/checklist-1.svg +1 -0
  59. package/media/light/checklist.svg +1 -0
  60. package/media/light/control.svg +1 -0
  61. package/media/light/create.svg +1 -0
  62. package/media/light/delete-1.svg +1 -0
  63. package/media/light/delete.svg +1 -0
  64. package/media/light/deploy-1.svg +2 -0
  65. package/media/light/deploy.svg +2 -0
  66. package/media/light/documents.svg +66 -0
  67. package/media/light/earth.svg +68 -0
  68. package/media/light/exe.svg +15 -0
  69. package/media/light/export.svg +1 -0
  70. package/media/light/function.svg +1 -0
  71. package/media/light/game-controller.svg +77 -0
  72. package/media/light/get.svg +1 -0
  73. package/media/light/id-card.svg +59 -0
  74. package/media/light/identity.svg +81 -0
  75. package/media/light/import.svg +1 -0
  76. package/media/light/information.svg +1 -0
  77. package/media/light/interface.svg +1 -0
  78. package/media/light/layout.svg +41 -0
  79. package/media/light/leaf.svg +54 -0
  80. package/media/light/list.svg +13 -0
  81. package/media/light/logo.svg +249 -0
  82. package/media/light/mockup.svg +1 -0
  83. package/media/light/needle.svg +1 -0
  84. package/media/light/pass.svg +46 -0
  85. package/media/light/plus.svg +1 -0
  86. package/media/light/post.svg +1 -0
  87. package/media/light/quit.svg +1 -0
  88. package/media/light/rocket.svg +28 -0
  89. package/media/light/service.svg +1 -0
  90. package/media/light/settings.svg +98 -0
  91. package/media/light/social.svg +1 -0
  92. package/media/light/spaceship-1.svg +1 -0
  93. package/media/light/spaceship-2.svg +1 -0
  94. package/media/light/spaceship.svg +1 -0
  95. package/media/light/support.svg +88 -0
  96. package/media/light/transfer.svg +1 -0
  97. package/media/light/transform.svg +92 -0
  98. package/media/light/update.svg +45 -0
  99. package/media/light/upload-1.svg +1 -0
  100. package/media/light/upload.svg +41 -0
  101. package/media/light/vaccine.svg +1 -0
  102. package/media/light/vr-gaming.svg +1 -0
  103. package/package-lock.json +6430 -0
  104. package/package.json +540 -0
  105. package/snippets-tsr.json +512 -0
  106. package/snippets.json +761 -0
  107. package/src/API.ts +14 -0
  108. package/src/FsProvider.ts +105 -0
  109. package/src/Request.ts +24 -0
  110. package/src/assets/api/api.txt +27 -0
  111. package/src/assets/configuration/AdminConfigurationController.ts.txt +72 -0
  112. package/src/assets/configuration/Configuration.ts.txt +37 -0
  113. package/src/assets/configuration/ConfigurationService.ts.txt +26 -0
  114. package/src/assets/contentDefine/AdminContentDefineController.ts.txt +91 -0
  115. package/src/assets/contentDefine/ContentDefine.ts.txt +45 -0
  116. package/src/assets/contentDefine/ContentDefineService.ts.txt +19 -0
  117. package/src/assets/contentDefine/CustomerContentDefineController.ts.txt +34 -0
  118. package/src/assets/controller/controller.txt +46 -0
  119. package/src/assets/controller/controllerResource.txt +103 -0
  120. package/src/assets/entity/entity.txt +22 -0
  121. package/src/assets/entity-request/entity-request.txt +18 -0
  122. package/src/assets/init/.env.example.txt +37 -0
  123. package/src/assets/init/.env.production.txt +37 -0
  124. package/src/assets/init/.gitignore.txt +8 -0
  125. package/src/assets/init/config.ts.txt +55 -0
  126. package/src/assets/init/deploy.sh.txt +46 -0
  127. package/src/assets/init/package-lock.json.txt +4184 -0
  128. package/src/assets/init/package.json.txt +79 -0
  129. package/src/assets/init/src/Server.ts.txt +167 -0
  130. package/src/assets/init/src/controllers/admin/AuthController.ts.txt +96 -0
  131. package/src/assets/init/src/controllers/admin/CustomerController.ts.txt +107 -0
  132. package/src/assets/init/src/controllers/admin/RoleController.ts.txt +143 -0
  133. package/src/assets/init/src/controllers/admin/StaffController.ts.txt +192 -0
  134. package/src/assets/init/src/controllers/customer/AuthController.ts.txt +170 -0
  135. package/src/assets/init/src/controllers/customer/CustomerController.ts.txt +32 -0
  136. package/src/assets/init/src/core/entity/CoreEntity.ts.txt +70 -0
  137. package/src/assets/init/src/core/services/CoreService.ts.txt +21 -0
  138. package/src/assets/init/src/entity/Customer.ts.txt +68 -0
  139. package/src/assets/init/src/entity/Permission.ts.txt +29 -0
  140. package/src/assets/init/src/entity/Role.ts.txt +36 -0
  141. package/src/assets/init/src/entity/Staff.ts.txt +54 -0
  142. package/src/assets/init/src/entity-request/CustomerInsert.ts.txt +42 -0
  143. package/src/assets/init/src/entity-request/CustomerUpdate.ts.txt +40 -0
  144. package/src/assets/init/src/entity-request/PermissionImport.ts.txt +12 -0
  145. package/src/assets/init/src/entity-request/StaffUpdate.ts.txt +33 -0
  146. package/src/assets/init/src/index.ts.txt +13 -0
  147. package/src/assets/init/src/middleware/auth/Verification.ts.txt +16 -0
  148. package/src/assets/init/src/middleware/auth/VerificationJWT.ts.txt +16 -0
  149. package/src/assets/init/src/middleware/auth/strategy/AuthStrategy.ts.txt +5 -0
  150. package/src/assets/init/src/middleware/auth/strategy/JWT.ts.txt +147 -0
  151. package/src/assets/init/src/middleware/error/handleError.ts.txt +22 -0
  152. package/src/assets/init/src/middleware/error/handleNotFound.ts.txt +7 -0
  153. package/src/assets/init/src/middleware/response/CustomSendResponse.ts.txt +35 -0
  154. package/src/assets/init/src/middleware/response/responseAPI.ts.txt +76 -0
  155. package/src/assets/init/src/middleware/validator/Validator.ts.txt +103 -0
  156. package/src/assets/init/src/services/CustomerService.ts.txt +79 -0
  157. package/src/assets/init/src/services/InitService.ts.txt +11 -0
  158. package/src/assets/init/src/services/MailService.ts.txt +271 -0
  159. package/src/assets/init/src/services/RoleService.ts.txt +66 -0
  160. package/src/assets/init/src/services/StaffService.ts.txt +104 -0
  161. package/src/assets/init/src/ssl/certificate-ca.crt +0 -0
  162. package/src/assets/init/src/ssl/certificate.crt +0 -0
  163. package/src/assets/init/src/ssl/private.key +0 -0
  164. package/src/assets/init/src/types/express.d.ts.txt +97 -0
  165. package/src/assets/init/src/util/expo.ts.txt +53 -0
  166. package/src/assets/init/src/util/helper.ts.txt +321 -0
  167. package/src/assets/init/src/util/language.ts.txt +8 -0
  168. package/src/assets/init/src/util/logger.ts.txt +47 -0
  169. package/src/assets/init/src/util/mailer.ts.txt +32 -0
  170. package/src/assets/init/src/util/password.ts.txt +13 -0
  171. package/src/assets/init/tsconfig.json.txt +26 -0
  172. package/src/assets/service/service.txt +34 -0
  173. package/src/constant.ts +83 -0
  174. package/src/extension.ts +459 -0
  175. package/src/provider/codeAction/controller/addPathParams.ts +65 -0
  176. package/src/provider/codeAction/controller/addTokenParam.ts +43 -0
  177. package/src/provider/codeAction/controller/addValidation.ts +47 -0
  178. package/src/provider/codeAction/controller/codeAction.ts +34 -0
  179. package/src/provider/codeAction/controller/util.ts +48 -0
  180. package/src/provider/codeAction/entity/codeAction.ts +48 -0
  181. package/src/provider/codeAction/entity/handleBuilder.ts +87 -0
  182. package/src/provider/codeAction/entity/handleFunction.ts +487 -0
  183. package/src/provider/codeAction/entity/handleProperty.ts +32 -0
  184. package/src/provider/codeAction/entity/handleRelation.ts +72 -0
  185. package/src/provider/codeAction/entity/helper.ts +132 -0
  186. package/src/provider/codeAction/entity-request/codeAction.ts +178 -0
  187. package/src/provider/codeAction/enum/codeAction.ts +95 -0
  188. package/src/provider/codeAction/service/codeAction.ts +232 -0
  189. package/src/provider/completion/CompletionProvider.ts +108 -0
  190. package/src/provider/errorChecking/checkHeaderToken.ts +60 -0
  191. package/src/provider/errorChecking/checkPathParam.ts +64 -0
  192. package/src/provider/errorChecking/checkRequired.ts +56 -0
  193. package/src/provider/errorChecking/errorChecking.ts +35 -0
  194. package/src/provider/errorChecking/util.ts +56 -0
  195. package/src/provider/treeDataProvider/Dependency.ts +26 -0
  196. package/src/provider/treeDataProvider/TreeProviderCommand.ts +60 -0
  197. package/src/provider/treeDataProvider/TreeProviderProject.ts +65 -0
  198. package/src/provider/treeDataProvider/api/createApi.ts +106 -0
  199. package/src/provider/treeDataProvider/controller/command/createController.ts +99 -0
  200. package/src/provider/treeDataProvider/controller/command/handleMethod.ts +363 -0
  201. package/src/provider/treeDataProvider/controller/treeData.ts +81 -0
  202. package/src/provider/treeDataProvider/deploy/command/handleDeploy.ts +70 -0
  203. package/src/provider/treeDataProvider/deploy/treeData.ts +21 -0
  204. package/src/provider/treeDataProvider/entity/command/addProperty.ts +144 -0
  205. package/src/provider/treeDataProvider/entity/command/addRelation.ts +125 -0
  206. package/src/provider/treeDataProvider/entity/command/createEntity.ts +53 -0
  207. package/src/provider/treeDataProvider/entity/command/createEntityRequest.ts +65 -0
  208. package/src/provider/treeDataProvider/entity/command/exportInterface.ts +130 -0
  209. package/src/provider/treeDataProvider/entity/treeData.ts +49 -0
  210. package/src/provider/treeDataProvider/module/command/configuration.ts +34 -0
  211. package/src/provider/treeDataProvider/module/command/contentDefine.ts +36 -0
  212. package/src/provider/treeDataProvider/module/command/initProject.ts +155 -0
  213. package/src/provider/treeDataProvider/module/treeData.ts +28 -0
  214. package/src/provider/treeDataProvider/project/command/addEnum.ts +0 -0
  215. package/src/provider/treeDataProvider/project/command/addProjectName.ts +23 -0
  216. package/src/provider/treeDataProvider/project/command/getProjectDetails.ts +284 -0
  217. package/src/provider/treeDataProvider/project/treeData.ts +28 -0
  218. package/src/provider/treeDataProvider/service/command/createService.ts +70 -0
  219. package/src/provider/treeDataProvider/service/command/handleConstructor.ts +134 -0
  220. package/src/provider/treeDataProvider/service/treeData.ts +25 -0
  221. package/src/types/project.d.ts +7 -0
  222. package/src/util.ts +145 -0
  223. package/src/utils/Password.ts +19 -0
  224. package/tsconfig.json +18 -0
  225. package/tslint.json +15 -0
  226. package/vsc-extension-quickstart.md +42 -0
@@ -0,0 +1,512 @@
1
+ {
2
+ "FL": {
3
+ "prefix": "fl",
4
+ "body": [
5
+ "<FlatList",
6
+ "data={${data}}",
7
+ "renderItem={({ item }) => <HistoryListItem data={item} />}",
8
+ "keyExtractor={(item, index) => index.toString()}",
9
+ "showsHorizontalScrollIndicator={false}",
10
+ "showsVerticalScrollIndicator={false}",
11
+ "refreshing={${refreshing}}",
12
+ "onEndReachedThreshold={0.4}",
13
+ "onEndReached={${onLoadMore}}",
14
+ "refreshControl={",
15
+ " <RefreshControl",
16
+ " refreshing={this.state.isRefreshing}",
17
+ " onRefresh={this.onRefresh}",
18
+ " />",
19
+ "}",
20
+ "/>"
21
+ ],
22
+ "description": "Log output to console"
23
+ },
24
+ "useNavigate React router  ": {
25
+ "prefix": "useNavigate",
26
+ "body": ["const navigate = useNavigate();"],
27
+ "description": "useNavigate React router  "
28
+ },
29
+ "crud crema": {
30
+ "prefix": "crudCrema",
31
+ "body": [
32
+ "import { PlusOutlined, SearchOutlined } from \"@ant-design/icons\";",
33
+ "import { Button, Input, Space, Spin, Table } from \"antd\";",
34
+ "import { ${1}Api } from \"api/${1}.api\";",
35
+ "import { Pagination } from \"components/Pagination\";",
36
+ "import { useCallback, useEffect, useState } from \"react\";",
37
+ "import { ModalStatus } from \"types/modal\";",
38
+ "import { QueryParam } from \"types/query\";",
39
+ "import { ${1/(.*)/${1:/capitalize}/} } from \"types/${1}\";",
40
+ "import { getTitle } from \"utils\";",
41
+ "import AppComponentHeader from \"@crema/core/AppComponentHeader\";",
42
+ "import StatsCard from \"components/StatsCard/StatsCard\";",
43
+ "import { RiUserSettingsLine } from \"react-icons/ri\";",
44
+ "import AppsContainer from \"@crema/core/AppsContainer\";",
45
+ "import AppsContent from \"@crema/core/AppsContainer/AppsContent\";",
46
+ "import AppsFooter from \"@crema/core/AppsContainer/AppsFooter\";",
47
+ "import { ${1/(.*)/${1:/capitalize}/}Modal } from \"./components/${1/(.*)/${1:/capitalize}/}Modal\";",
48
+ "import { debounce } from \"lodash\";",
49
+ "",
50
+ "const { ColumnGroup, Column } = Table;",
51
+ "",
52
+ "export const ${TM_FILENAME_BASE} = ({ title = \"\" }) => {",
53
+ " const [query, setQuery] = useState<QueryParam>({",
54
+ " page: 1,",
55
+ " limit: 10,",
56
+ " search: \"\",",
57
+ " });",
58
+ " const [loading, setLoading] = useState(false);",
59
+ " const [data, setData] = useState<${1/(.*)/${1:/capitalize}/}[]>([]);",
60
+ " const [total, setTotal] = useState(0);",
61
+ " const [visibleModal, setVisibleModal] = useState(false);",
62
+ " const [selected${1/(.*)/${1:/capitalize}/}, setSelected${1/(.*)/${1:/capitalize}/}] = useState<Partial<${1/(.*)/${1:/capitalize}/}>>(",
63
+ " {}",
64
+ " );",
65
+ " const [modalStatus, setModalStatus] = useState<ModalStatus>(\"create\");",
66
+ " const [search, setSearch] = useState(\"\");",
67
+ "",
68
+ " const debounceSearch = useCallback(",
69
+ " debounce((keyword) => setQuery({ ...query, search: keyword }), 500),",
70
+ " [query]",
71
+ " );",
72
+ "",
73
+ " useEffect(() => {",
74
+ " document.title = getTitle(title);",
75
+ " }, []);",
76
+ "",
77
+ " useEffect(() => {",
78
+ " fetchData();",
79
+ " }, [query]);",
80
+ "",
81
+ " const fetchData = async () => {",
82
+ " setLoading(true);",
83
+ " const {data} = await ${1}Api.findAll(query);",
84
+ " setLoading(false);",
85
+ " setData(data.${1}s);",
86
+ " setTotal(data.total);",
87
+ " };",
88
+ "",
89
+ " return (",
90
+ " <div>",
91
+ " <Space",
92
+ " style={{",
93
+ " width: \"100%\",",
94
+ " justifyContent: \"space-between\",",
95
+ " alignItems: \"end\",",
96
+ " }}",
97
+ " >",
98
+ " <Space direction=\"vertical\">",
99
+ " <AppComponentHeader title={title} />",
100
+ " <Space align=\"end\">",
101
+ " <Input",
102
+ " allowClear",
103
+ " suffix={<SearchOutlined />}",
104
+ " placeholder=\"Tìm kiếm\"",
105
+ " size=\"large\"",
106
+ " onChange={(e) => {",
107
+ " setSearch(e.target.value);",
108
+ " debounceSearch(e.target.value);",
109
+ " }}",
110
+ " onKeyDown={(e) => {",
111
+ " if (e.key === \"Enter\") {",
112
+ " setQuery({ ...query, search });",
113
+ " }",
114
+ " }}",
115
+ " />",
116
+ "",
117
+ " <Button",
118
+ " size=\"large\"",
119
+ " type=\"primary\"",
120
+ " color=\"primary\"",
121
+ " icon={<PlusOutlined />}",
122
+ " onClick={() => {",
123
+ " setModalStatus(\"create\");",
124
+ " setVisibleModal(true);",
125
+ " }}",
126
+ " >",
127
+ " Thêm mới",
128
+ " </Button>",
129
+ " </Space>",
130
+ " </Space>",
131
+ " <StatsCard",
132
+ " icon={<RiUserSettingsLine />}",
133
+ " data={total}",
134
+ " heading={\"Tổng ${2}\"}",
135
+ " />",
136
+ " </Space>",
137
+ "",
138
+ " <Spin spinning={loading}>",
139
+ " <AppsContainer title=\"\" type=\"bottom\" fullView>",
140
+ " <AppsContent>",
141
+ " <Table dataSource={data} pagination={false}>",
142
+ " <Column title=\"Mã KH\" dataIndex=\"code\" />",
143
+ "",
144
+ " <Column title=\"Tên khách hàng\" dataIndex=\"name\" />",
145
+ "",
146
+ " <Column title=\"Mã số thuế\" dataIndex=\"\" />",
147
+ " </Table>",
148
+ " </AppsContent>",
149
+ "",
150
+ " <AppsFooter>",
151
+ " <Pagination",
152
+ " total={total}",
153
+ " currentPage={query.page}",
154
+ " onChange={({ limit, page }) => {",
155
+ " query.page = page;",
156
+ " query.limit = limit;",
157
+ " setQuery({ ...query });",
158
+ " }}",
159
+ " />",
160
+ " </AppsFooter>",
161
+ " </AppsContainer>",
162
+ " </Spin>",
163
+ " <${1/(.*)/${1:/capitalize}/}Modal",
164
+ " onClose={() => {",
165
+ " }}",
166
+ " onSubmitOk={()=>{",
167
+ " fetchData()",
168
+ " }}",
169
+ " />",
170
+ " </div>",
171
+ " );",
172
+ "};",
173
+ "",
174
+ "export { ${TM_FILENAME_BASE} as default };",
175
+ ""
176
+ ],
177
+ "description": "crud crema"
178
+ },
179
+ "CRUD": {
180
+ "prefix": "crud",
181
+ "body": [
182
+ "import { PlusOutlined, SearchOutlined } from \"@ant-design/icons\";",
183
+ "import { Button, Input, Space, Spin, Table } from \"antd\";",
184
+ "import { ${1}Api } from \"api/${1}.api\";",
185
+ "import { Pagination } from \"components/Pagination\";",
186
+ "import React, { useEffect, useState, useRef } from \"react\";",
187
+ "import { ModalStatus } from \"types/modal\";",
188
+ "import { QueryParam } from \"types/query\";",
189
+ "import { ${1/(.*)/${1:/capitalize}/} } from \"types/${1}\";",
190
+ "import { getTitle } from \"utils\";",
191
+ "import { \\$url } from \"utils/url\";",
192
+ "import { ${1/(.*)/${1:/capitalize}/}Modal } from \"./components/${1/(.*)/${1:/capitalize}/}Modal\";",
193
+ "import { use${1/(.*)/${1:/capitalize}/} } from \"hooks/use${1/(.*)/${1:/capitalize}/}\";",
194
+ "",
195
+ "const { ColumnGroup, Column } = Table;",
196
+ "",
197
+ "export const ${TM_FILENAME_BASE} = ({ title = \"\" }) => {",
198
+ " const {",
199
+ " ${1}s,",
200
+ " total${1/(.*)/${1:/capitalize}/},",
201
+ " fetch${1/(.*)/${1:/capitalize}/},",
202
+ " loading${1/(.*)/${1:/capitalize}/},",
203
+ " setQuery${1/(.*)/${1:/capitalize}/},",
204
+ " query${1/(.*)/${1:/capitalize}/},",
205
+ "} = use${1/(.*)/${1:/capitalize}/}({initQuery: {page: 1, limit: 10}})",
206
+ " const [selected${1/(.*)/${1:/capitalize}/}, setSelected${1/(.*)/${1:/capitalize}/}] = useState<Partial<${1/(.*)/${1:/capitalize}/}>>({});",
207
+ " const modalRef = useRef<${TM_FILENAME_BASE}Modal>(null)",
208
+ "",
209
+ " useEffect(() => {",
210
+ " document.title = getTitle(title);",
211
+ " }, []);",
212
+ "",
213
+ " useEffect(() => {",
214
+ " fetch${1/(.*)/${1:/capitalize}/}();",
215
+ " }, [query${1/(.*)/${1:/capitalize}/}]);",
216
+ "",
217
+ " return (",
218
+ " <div>",
219
+ " <div className=\"filter-container\">",
220
+ " <Space>",
221
+ " <div className=\"filter-item\">",
222
+ " <label htmlFor=\"\">Tìm kiếm</label>",
223
+ " <Input",
224
+ " onKeyDown={(ev) => {",
225
+ " if (ev.code == \"Enter\") {",
226
+ " query${1/(.*)/${1:/capitalize}/}.page = 1;",
227
+ " setQuery${1/(.*)/${1:/capitalize}/}({ ...query${1/(.*)/${1:/capitalize}/} });",
228
+ " }",
229
+ " }}",
230
+ " size=\"middle\"",
231
+ " onChange={(ev) => {",
232
+ " query${1/(.*)/${1:/capitalize}/}.search = ev.currentTarget.value;",
233
+ " }}",
234
+ " placeholder=\"Tìm kiếm\"",
235
+ " />",
236
+ " </div>",
237
+ "",
238
+ " <div className=\"filter-item btn\">",
239
+ " <Button onClick={fetch${1/(.*)/${1:/capitalize}/}} type=\"primary\" icon={<SearchOutlined />}>",
240
+ " Tìm kiếm",
241
+ " </Button>",
242
+ " </div>",
243
+ "",
244
+ " <div className=\"filter-item btn\">",
245
+ " <Button",
246
+ " onClick={() => {",
247
+ " modalRef.current?.handleCreate();",
248
+ " }}",
249
+ " type=\"primary\"",
250
+ " icon={<PlusOutlined />}",
251
+ " >",
252
+ " Thêm mới",
253
+ " </Button>",
254
+ " </div>",
255
+ " </Space>",
256
+ " </div>",
257
+ "",
258
+ " <Table loading={loading${1/(.*)/${1:/capitalize}/}} pagination={false} rowKey=\"id\" dataSource={${1}s}>",
259
+ " <Column",
260
+ " title=\"Username\"",
261
+ " dataIndex=\"username\"",
262
+ " key=\"username\"",
263
+ " render={(text, record: ${1/(.*)/${1:/capitalize}/}) => {",
264
+ " return (",
265
+ " <div>",
266
+ " {record.avatar && (",
267
+ " <img",
268
+ " width={40}",
269
+ " height={40}",
270
+ " style={{ objectFit: \"cover\" }}",
271
+ " src={\\$url(record.avatar)}",
272
+ " alt=\"\"",
273
+ " />",
274
+ " )}",
275
+ " <br />",
276
+ " <label htmlFor=\"\">{text}</label>",
277
+ " </div>",
278
+ " );",
279
+ " }}",
280
+ " />",
281
+ " <Column title=\"Name\" dataIndex=\"name\" key=\"name\" />",
282
+ " <Column title=\"Phone\" dataIndex=\"phone\" key=\"phone\" />",
283
+ " <Column title=\"Email\" dataIndex=\"email\" key={\"email\"} />",
284
+ "",
285
+ " <Column",
286
+ " title=\"Action\"",
287
+ " key=\"action\"",
288
+ " render={(text, record: ${1/(.*)/${1:/capitalize}/}) => (",
289
+ " <span>",
290
+ " <Button",
291
+ " type=\"primary\"",
292
+ " onClick={() => {",
293
+ " modalRef.current?.handleUpdate(record)",
294
+ " }}",
295
+ " >",
296
+ " Cập nhật",
297
+ " </Button>",
298
+ " </span>",
299
+ " )}",
300
+ " />",
301
+ " </Table>",
302
+ "",
303
+ " <Pagination",
304
+ " currentPage={query${1/(.*)/${1:/capitalize}/}.page}",
305
+ " total={total${1/(.*)/${1:/capitalize}/}}",
306
+ " onChange={({ limit, page }) => {",
307
+ " query${1/(.*)/${1:/capitalize}/}.page = page;",
308
+ " query${1/(.*)/${1:/capitalize}/}.limit = limit;",
309
+ " setQuery${1/(.*)/${1:/capitalize}/}({ ...query${1/(.*)/${1:/capitalize}/} });",
310
+ " }}",
311
+ " />",
312
+ "",
313
+ " <${1/(.*)/${1:/capitalize}/}Modal",
314
+ " onSubmitOk={fetch${1/(.*)/${1:/capitalize}/}}",
315
+ " onClose={() => {}}",
316
+ " ref={modalRef}",
317
+ " />",
318
+ " </div>",
319
+ " );",
320
+ "};",
321
+ ""
322
+ ],
323
+ "description": "FE CRUD"
324
+ },
325
+ "modal": {
326
+ "prefix": "modal",
327
+ "body": [
328
+ "import { Col, Form, Input, message, Modal, Row } from \"antd\";",
329
+ "import { Rule } from \"antd/lib/form\";",
330
+ "import { ${1}Api } from \"api/${1}.api\";",
331
+ "import { SingleImageUpload } from \"components/Upload/SingleImageUpload\";",
332
+ "import React, { useEffect, useImperativeHandle, useState } from \"react\";",
333
+ "import { ModalStatus } from \"types/modal\";",
334
+ "import { ${1/(.*)/${1:/capitalize}/} } from \"types/${1}\";",
335
+ "",
336
+ "const rules: Rule[] = [{ required: true }];",
337
+ "",
338
+ "export interface ${1/(.*)/${1:/capitalize}/}Modal {",
339
+ " handleCreate: () => void;",
340
+ " handleUpdate: (${1}: ${1/(.*)/${1:/capitalize}/}) => void;",
341
+ "}",
342
+ "interface ${1/(.*)/${1:/capitalize}/}ModalProps {",
343
+ " onClose: () => void;",
344
+ " onSubmitOk: () => void;",
345
+ "}",
346
+ "",
347
+ "export const ${1/(.*)/${1:/capitalize}/}Modal = React.forwardRef(",
348
+ " (",
349
+ " {",
350
+ " onClose,",
351
+ " onSubmitOk,",
352
+ " }: ${1/(.*)/${1:/capitalize}/}ModalProps,",
353
+ " ref",
354
+ " ) => {",
355
+ " const [form] = Form.useForm<${1/(.*)/${1:/capitalize}/}>();",
356
+ " const [loading, setLoading] = useState(false);",
357
+ " const [visible, setVisible] = useState(false);",
358
+ " const [status, setStatus] = useState<ModalStatus>(\"create\");",
359
+ " const [selected${1/(.*)/${1:/capitalize}/}, setSelected${1/(.*)/${1:/capitalize}/}] = useState<${1/(.*)/${1:/capitalize}/}>();",
360
+ "",
361
+ " useImperativeHandle<any, ${1/(.*)/${1:/capitalize}/}Modal>(",
362
+ " ref,",
363
+ " () => ({",
364
+ " handleCreate() {",
365
+ " form.resetFields();",
366
+ " setVisible(true);",
367
+ " setStatus(\"create\");",
368
+ " setSelected${1/(.*)/${1:/capitalize}/}(undefined);",
369
+ " },",
370
+ " handleUpdate(${1}: ${1/(.*)/${1:/capitalize}/}) {",
371
+ " form.setFieldsValue({ ...${1}});",
372
+ " setVisible(true);",
373
+ " setStatus(\"update\");",
374
+ " setSelected${1/(.*)/${1:/capitalize}/}(${1});",
375
+ " },",
376
+ " }),",
377
+ " []",
378
+ " );",
379
+ "",
380
+ "const getPayload = () => {",
381
+ " const {...rest} = form.getFieldsValue();",
382
+ " return { ${1}: rest};",
383
+ "}",
384
+ "",
385
+ "const submitForm = async () => {",
386
+ " try{",
387
+ " setLoading(true);",
388
+ " const valid = await form.validateFields();",
389
+ " const data = getPayload()",
390
+ " let res: any = undefined;",
391
+ " switch(status){",
392
+ " case \"create\":",
393
+ " res = await ${1}Api.create(data);",
394
+ " message.success(\"Create ${1/(.*)/${1:/capitalize}/} successfully!\");",
395
+ " break;",
396
+ " case \"update\":",
397
+ " res = await ${1}Api.update(selected${1/(.*)/${1:/capitalize}/}?.id || 0, data);",
398
+ " message.success(\"Update ${1/(.*)/${1:/capitalize}/} successfully!\");",
399
+ " break;",
400
+ " }",
401
+ " onSubmitOk();",
402
+ " handleClose();",
403
+ " }",
404
+ " finally {",
405
+ " setLoading(false);",
406
+ " }",
407
+ "}",
408
+ "",
409
+ "const handleClose = () => {",
410
+ " onClose?.();",
411
+ " setVisible(false);",
412
+ " setSelected${1/(.*)/${1:/capitalize}/}(undefined)",
413
+ "}",
414
+ "",
415
+ " return (",
416
+ " <Modal",
417
+ " onCancel={()=> {",
418
+ " handleClose();",
419
+ " }}",
420
+ " visible={visible}",
421
+ " title={status == \"create\" ? \"Create ${1/(.*)/${1:/capitalize}/}\" : \"Update ${1/(.*)/${1:/capitalize}/}\"}",
422
+ " style={{ top: 20 }}",
423
+ " width={700}",
424
+ " confirmLoading={loading}",
425
+ " onOk={submitForm}",
426
+ " >",
427
+ " <Form layout=\"vertical\" form={form}>",
428
+ " <Row gutter={16}>",
429
+ " <Col span={12}>",
430
+ " <Form.Item label=\"Username\" name=\"username\" rules={rules}>",
431
+ " <Input placeholder=\"\" />",
432
+ " </Form.Item>",
433
+ " </Col>",
434
+ "",
435
+ " {status == \"create\" && (",
436
+ " <Col span={12}>",
437
+ " <Form.Item label=\"Password\" name=\"password\" rules={rules}>",
438
+ " <Input placeholder=\"\" />",
439
+ " </Form.Item>",
440
+ " </Col>",
441
+ " )}",
442
+ "",
443
+ " <Col span={12}>",
444
+ " <Form.Item label=\"Name\" name=\"name\" rules={rules}>",
445
+ " <Input placeholder=\"\" />",
446
+ " </Form.Item>",
447
+ " </Col>",
448
+ "",
449
+ " <Col span={12}>",
450
+ " <Form.Item label=\"Phone\" name=\"phone\" rules={rules}>",
451
+ " <Input placeholder=\"\" />",
452
+ " </Form.Item>",
453
+ " </Col>",
454
+ "",
455
+ " <Col span={12}>",
456
+ " <Form.Item label=\"Email\" name=\"email\">",
457
+ " <Input placeholder=\"\" />",
458
+ " </Form.Item>",
459
+ " </Col>",
460
+ " </Row>",
461
+ "",
462
+ " <Form.Item shouldUpdate={true}>",
463
+ " {() => {",
464
+ " return (",
465
+ " <Form.Item label=\"Avatar\" name=\"avatar\">",
466
+ " <SingleImageUpload",
467
+ " onUploadOk={(path: string) => {",
468
+ " console.log(\"onUploadOk:\", path);",
469
+ " form.setFieldsValue({",
470
+ " avatar: path,",
471
+ " });",
472
+ " }}",
473
+ " imageUrl={form.getFieldValue(\"avatar\")}",
474
+ " />",
475
+ " </Form.Item>",
476
+ " );",
477
+ " }}",
478
+ " </Form.Item>",
479
+ " </Form>",
480
+ " </Modal>",
481
+ " );",
482
+ " }",
483
+ ");",
484
+ ""
485
+ ],
486
+ "description": "modal"
487
+ },
488
+ "form-milk": {
489
+ "prefix": "form-milk",
490
+ "body": [
491
+ "<Formik",
492
+ " initialValues={{ ...initValues }}",
493
+ "onSubmit={(values, formikActions) => {",
494
+ "formikActions.setSubmitting(false);",
495
+ "}}",
496
+ "validationSchema={yup.object().shape({",
497
+ "})}",
498
+ ">",
499
+ "{({",
500
+ " values,handleChange,errors,setFieldTouched,touched,setFieldValue,handleSubmit,isValid,",
501
+ "}) => (",
502
+ " <>",
503
+ "</>",
504
+ ")}",
505
+ " </Formik>"
506
+ ]
507
+ },
508
+ "json-string": {
509
+ "prefix": "json-string",
510
+ "body": "JSON.stringify($0)"
511
+ }
512
+ }