From eafdd533a3294797edeab92bb207047b10b04f09 Mon Sep 17 00:00:00 2001 From: Vishal Mahajan Date: Sat, 2 Oct 2021 21:09:55 +0530 Subject: [PATCH 1/2] feat: Add data type support in the entity subgen --- generators/client/files.js | 4 +- .../app/lib/page/BinaryRecord.svelte.ejs | 27 ++++++++ .../webapp/app/lib/utils/data-util.js.ejs | 42 +++++++++++ .../src/main/webapp/app/lib/utils/date.js.ejs | 33 ++++++++- .../entities/entity/entity-list.spec.js.ejs | 41 ++++++++--- .../entities/entity/EntityTable.svelte.ejs | 69 ++++++++++++++----- .../entities/entity/[id]/view.svelte.ejs | 30 ++++++-- 7 files changed, 213 insertions(+), 33 deletions(-) create mode 100644 generators/client/templates/svelte/src/main/webapp/app/lib/page/BinaryRecord.svelte.ejs create mode 100644 generators/client/templates/svelte/src/main/webapp/app/lib/utils/data-util.js.ejs diff --git a/generators/client/files.js b/generators/client/files.js index 65254fc80..4061d109e 100644 --- a/generators/client/files.js +++ b/generators/client/files.js @@ -145,10 +145,11 @@ const svelteFiles = { 'admin/logger/logger-service.js', 'admin/logger/LoggerTable.svelte', 'admin/logger/LoggerTable.spec.js', + 'page/BinaryRecord.svelte', 'page/Page.svelte', 'page/PageHeader.svelte', 'page/Form.svelte', - '/page/SearchForm.svelte', + 'page/SearchForm.svelte', 'page/Record.svelte', 'Alert.svelte', 'Button.svelte', @@ -181,6 +182,7 @@ const svelteFiles = { 'table/TableHeader.svelte', 'table/TableRow.svelte', 'utils/date.js', + 'utils/data-util.js', 'utils/env.js', 'utils/request.js', 'utils/validator.js', diff --git a/generators/client/templates/svelte/src/main/webapp/app/lib/page/BinaryRecord.svelte.ejs b/generators/client/templates/svelte/src/main/webapp/app/lib/page/BinaryRecord.svelte.ejs new file mode 100644 index 000000000..2092376bc --- /dev/null +++ b/generators/client/templates/svelte/src/main/webapp/app/lib/page/BinaryRecord.svelte.ejs @@ -0,0 +1,27 @@ + + +{#if field} +
+ {#if fieldType === 'image'} + {name} + {:else} + View + {/if} +
+ {fieldContentType}, + {byteSize(field)} +{/if} diff --git a/generators/client/templates/svelte/src/main/webapp/app/lib/utils/data-util.js.ejs b/generators/client/templates/svelte/src/main/webapp/app/lib/utils/data-util.js.ejs new file mode 100644 index 000000000..cf869c689 --- /dev/null +++ b/generators/client/templates/svelte/src/main/webapp/app/lib/utils/data-util.js.ejs @@ -0,0 +1,42 @@ +export function byteSize(base64String) { + return formatAsBytes(size(base64String)) +} + +export function openFile(data, contentType) { + const byteCharacters = atob(data) + const byteNumbers = new Array(byteCharacters.length) + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i) + } + const byteArray = new Uint8Array(byteNumbers) + const blob = new Blob([byteArray], { + type: contentType, + }) + const fileURL = window.URL.createObjectURL(blob) + const win = window.open(fileURL) + win.onload = function () { + URL.revokeObjectURL(fileURL) + } +} + +function endsWith(suffix, str) { + return str.includes(suffix, str.length - suffix.length) +} + +function paddingSize(value) { + if (endsWith('==', value)) { + return 2 + } + if (endsWith('=', value)) { + return 1 + } + return 0 +} + +function size(value) { + return (value.length / 4) * 3 - paddingSize(value) +} + +function formatAsBytes(size) { + return size.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' bytes' +} diff --git a/generators/client/templates/svelte/src/main/webapp/app/lib/utils/date.js.ejs b/generators/client/templates/svelte/src/main/webapp/app/lib/utils/date.js.ejs index 7e73fc6dd..c60cb7c8f 100644 --- a/generators/client/templates/svelte/src/main/webapp/app/lib/utils/date.js.ejs +++ b/generators/client/templates/svelte/src/main/webapp/app/lib/utils/date.js.ejs @@ -1,9 +1,36 @@ -import { format, formatDistanceToNow } from 'date-fns' +import { + format, + formatDistanceToNow, + formatDuration, + intervalToDuration, +} from 'date-fns' export function formatDate(dateToFormat) { - return dateToFormat ? format(new Date(Date.parse(dateToFormat)), 'MM/dd/yyyy HH:mm') : '-' + return dateToFormat + ? format(new Date(Date.parse(dateToFormat)), 'MM/dd/yyyy HH:mm') + : '-' } export function formatDistance(dateToFormat) { - return dateToFormat ? formatDistanceToNow(new Date(Date.parse(dateToFormat)), {addSuffix: true}) : '-' + return dateToFormat + ? formatDistanceToNow(new Date(Date.parse(dateToFormat)), { + addSuffix: true, + }) + : '-' +} + +export function formatDurationType(durationToFormat) { + if (durationToFormat) { + let valueInSeconds = durationToFormat.substring( + durationToFormat.indexOf('.') + 1, + durationToFormat.length - 1 + ) + return valueInSeconds + ? formatDuration( + intervalToDuration({ start: 0, end: valueInSeconds * 1000 }) + ) + : '-' + } else { + return '-' + } } diff --git a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs index edcd58deb..a0525c87a 100644 --- a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs +++ b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs @@ -1,8 +1,10 @@ +<%_ +const entityFakeData = generateFakeData('cypress'); +_%> describe('<%= entityAngularName %> list page', () => { let randomPrefix let dynamicId <%_ if (!paginationNo || searchEngine) { _%> - let randomPrefix2 let dynamicId2 <%_ } _%> beforeEach(() => { @@ -13,15 +15,26 @@ describe('<%= entityAngularName %> list page', () => { ) <%_ if (!paginationNo || searchEngine) { _%> // create another <%= entityAngularName %> to test sort implementation - randomPrefix2 = 'zest' + new Date().getTime() cy.save('api/<%= entityApiUrl %>', { <%_ for (field of fields.filter(field => !field.id)) { + const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; + if (fieldValue === undefined) { + warning(`Error generating a value for field ${field.fieldName}`); + } _%> - <%_ if (field.fieldTypeTimed) { _%> - <%= field.fieldName %>: new Date(), + <%_ if (field.fieldTypeBoolean) { _%> + <%= field.fieldName %>: true, + <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> + <%= field.fieldName %>: null, + <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeLocalDate || field.fieldTypeTimed || field.fieldTypeDuration) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeNumeric) { _%> + <%= field.fieldName %>: <%= fieldValue %>, <%_ } else { _%> - <%= field.fieldName %>: randomPrefix2, + <%= field.fieldName %>: '<%= fieldValue %>', <%_ } _%> <%_ } _%> }).then(res => { @@ -32,11 +45,23 @@ describe('<%= entityAngularName %> list page', () => { cy.save('api/<%= entityApiUrl %>', { <%_ for (field of fields.filter(field => !field.id)) { + const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; + if (fieldValue === undefined) { + warning(`Error generating a value for field ${field.fieldName}`); + } _%> - <%_ if (field.fieldTypeTimed) { _%> - <%= field.fieldName %>: new Date(), + <%_ if (field.fieldTypeBoolean) { _%> + <%= field.fieldName %>: true, + <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> + <%= field.fieldName %>: null, + <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeLocalDate || field.fieldTypeTimed || field.fieldTypeDuration) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeNumeric) { _%> + <%= field.fieldName %>: <%= fieldValue %>, <%_ } else { _%> - <%= field.fieldName %>: randomPrefix, + <%= field.fieldName %>: '<%= fieldValue %>', <%_ } _%> <%_ } _%> }).then(res => { diff --git a/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs b/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs index 28d916c08..82efddc2d 100644 --- a/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs +++ b/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs @@ -5,9 +5,16 @@ import TableData from '$lib/table/TableData.svelte' import TableHeader from '$lib/table/TableHeader.svelte' import TableRow from '$lib/table/TableRow.svelte' -<%_ const timedFieldType = fields.find(field => field.fieldTypeTimed); - if (timedFieldType) { _%> - import { formatDate } from '$lib/utils/date' +<%_ const timedFieldType = fields.find(field => (field.fieldTypeTimed || field.fieldTypeLocalDate)); + const durationFieldType = fields.find(field => field.fieldTypeDuration); + const bothTimedAndDuration = timedFieldType && durationFieldType; + const binaryFieldType = fields.find(field => ((field.fieldTypeBinary && field.blobContentTypeImage) || (field.fieldTypeBinary && field.blobContentTypeAny))); + if (timedFieldType || durationFieldType ) { _%> + import { <%_ if (timedFieldType) { _%>formatDate<%_ } _%><%_ if (bothTimedAndDuration) { _%>, <%_ } _%><%_ if (durationFieldType) { _%>formatDurationType<%_ } _%> } from '$lib/utils/date' +<%_ } + if (binaryFieldType) { +_%> + import BinaryRecord from '$lib/page/BinaryRecord.svelte' <%_ } _%> export let <%= entityInstancePlural %> = [] <%_ if (!paginationNo) { _%> @@ -42,7 +49,6 @@ <%_ } _%> <%_ } _%> - @@ -50,24 +56,53 @@ {<%= entityInstance %>.id} <%_ + // exclude id field in last field index calculation + const lastFieldIndex = fields.length - 1; + let fieldIndex = 1; for (field of fields.filter(field => !field.id)) { _%> - <%_ if (field.fieldTypeTimed) { _%> - {formatDate(<%=entityInstance %>.<%= field.fieldName %>)} + classes="min-w-48 {showActions ? 'relative' : ''}"<%_ } _%>> + <%_ if(fieldIndex === lastFieldIndex) { _%> +
+ <%_ }_%> + <%_ if (field.fieldTypeBinary && field.blobContentTypeImage) { _%> + + <%_ } else if (field.fieldTypeBinary && field.blobContentTypeAny) { _%> + + <%_ } else if (field.fieldTypeTimed || field.fieldTypeLocalDate) { _%> + {formatDate(<%=entityInstance %>.<%= field.fieldName %>)} + <%_ } else if (field.fieldTypeDuration) { _%> + {formatDurationType(<%=entityInstance %>.<%= field.fieldName %>)} <%_ } else { _%> - {<%=entityInstance %>.<%= field.fieldName %>} + {<%=entityInstance %>.<%= field.fieldName %>} <%_ } _%> - <%_ } _%> - -
 
- <<%= entityAngularName %>ListActions - <%= entityInstance %>="{<%= entityInstance %>}" - showActions="{showActions}" - on:view<%= entityInstance %> - on:update<%= entityInstance %> - on:delete<%= entityInstance %> - /> + <%_ if(fieldIndex === lastFieldIndex) { _%> +
+
+ <<%= entityAngularName %>ListActions + <%= entityInstance %>="{<%= entityInstance %>}" + showActions="{showActions}" + on:view<%= entityInstance %> + on:update<%= entityInstance %> + on:delete<%= entityInstance %> + /> +
+ <%_ }_%>
+ <%_ + fieldIndex++; + } _%>
{:else} diff --git a/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs b/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs index b6f356df3..ce83d877a 100644 --- a/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs +++ b/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs @@ -9,9 +9,16 @@ import Record from '$lib/page/Record.svelte' import Button from '$lib/Button.svelte' import Icon from '$lib/Icon.svelte' -<%_ const timedFieldType = fields.find(field => field.fieldTypeTimed); - if (timedFieldType) { _%> - import { formatDate } from '$lib/utils/date' +<%_ const timedFieldType = fields.find(field => (field.fieldTypeTimed || field.fieldTypeLocalDate)); + const durationFieldType = fields.find(field => field.fieldTypeDuration); + const bothTimedAndDuration = timedFieldType && durationFieldType; + const binaryFieldType = fields.find(field => ((field.fieldTypeBinary && field.blobContentTypeImage) || (field.fieldTypeBinary && field.blobContentTypeAny))); + if (timedFieldType || durationFieldType ) { _%> + import { <%_ if (timedFieldType) { _%>formatDate<%_ } _%><%_ if (bothTimedAndDuration) { _%>, <%_ } _%><%_ if (durationFieldType) { _%>formatDurationType<%_ } _%> } from '$lib/utils/date' +<%_ } + if (binaryFieldType) { +_%> + import BinaryRecord from '$lib/page/BinaryRecord.svelte' <%_ } _%> $: id = $page && $page.params && $page.params.id @@ -43,8 +50,23 @@ _%> classes="border-t"<% } %>> <%= field.fieldNameHumanized %> - <%_ if (field.fieldTypeTimed) { _%> + <%_ if (field.fieldTypeBinary && field.blobContentTypeImage) { _%> + + <%_ } else if (field.fieldTypeBinary && field.blobContentTypeAny) { _%> + + <%_ } else if (field.fieldTypeTimed || field.fieldTypeLocalDate) { _%> {formatDate(<%= entityInstance %>.<%= field.fieldName %>)} + <%_ } else if (field.fieldTypeDuration) { _%> + {formatDurationType(<%= entityInstance %>.<%= field.fieldName %>)} <%_ } else { _%> {<%= entityInstance %>.<%= field.fieldName %>} <%_ } _%> From b3456624a4b2be3037a04afe39c282e3aa7e8399 Mon Sep 17 00:00:00 2001 From: Vishal Mahajan Date: Fri, 8 Oct 2021 00:01:52 +0530 Subject: [PATCH 2/2] Update cypress tests to save different data types --- generators/client/files.js | 1 + .../cypress/fixtures/integration-test.png | Bin 0 -> 5423 bytes .../entities/entity/entity-delete.spec.js.ejs | 85 ++++++++----- .../entities/entity/entity-list.spec.js.ejs | 112 +++++++++++------- .../entities/entity/entity-view.spec.js.ejs | 54 ++++++--- .../entities/entity/EntityTable.svelte.ejs | 4 +- .../entities/entity/[id]/view.svelte.ejs | 2 +- 7 files changed, 165 insertions(+), 93 deletions(-) create mode 100755 generators/client/templates/svelte/cypress/fixtures/integration-test.png diff --git a/generators/client/files.js b/generators/client/files.js index 4061d109e..0ab463644 100644 --- a/generators/client/files.js +++ b/generators/client/files.js @@ -32,6 +32,7 @@ const svelteFiles = { e2e: [ { templates: [ + 'cypress/fixtures/integration-test.png', 'cypress/integration/footer.spec.js', 'cypress/integration/home.spec.js', 'cypress/integration/navbar.spec.js', diff --git a/generators/client/templates/svelte/cypress/fixtures/integration-test.png b/generators/client/templates/svelte/cypress/fixtures/integration-test.png new file mode 100755 index 0000000000000000000000000000000000000000..24baf78ce8326c3c2756f10ebed90829d0bddf30 GIT binary patch literal 5423 zcmZ{oby(Bg+rYmYJ!;fw8AvHLLU829=n)&GAP)@b?hpk=Dvbz8OGzjV3I;M7K?Oww z1(8OiyW!>cyw~q}pMTzSopYbh9p}F86MvmJoS`;7gbM-y0KKk`hVjKr`p=*yyO0jx zylVge-o)vfYF?=7>V~Q)BQ>;vlA3{vI{u<7sTr!N<1{pkHFeF@&_*bABUN>rD#k<= zjYBD@pf!w@P=<=C2GUZpNCj0Tlo3kPR1Jg2Xq#NbYh%r?E9>g%np}XEp1GbT-cZv> zThB~O*A%U7si>-dOrLbZzO8ZpvR$ zLopgvUe~vBapx~>X(HE8Qu+d#+p;}4TJufz#OU9h!>GH5Zcvxs~R`zaQ zK3BD^W21-}DfbK0<5WzYmvhbbat-U#LoODgqTi{f3?d(VP)how6yN_f%icDrUNT`s zD|?FjA}uQoI<7}8uFor}A|f?cW?g&v$bE_nOY}@ zdz+D%liuvJ>F(s@#4cJ3s$tM&@A{>>Ddf9*i|cOy(yG(|)?~Po&5i45qK5*Um4jfH5H;H6Acflpqb# z4V+`tt?ZOFZB?~vL=n-JVTjBhGER@A1FFS>>Sg_&UH2@qv5GOWPjfZBV;J7d89|Z@ zZqjhgQ;6)muBg4s%6vvkF(fLz!pCK$s@-dV3{l72L8`1t3$98ET$H+eiF=uw^FN(~ zV_iXbNrZ1jfETZ(uXP=B`22a$#iKv=H#Rf@V5oZ^_s;RxCGb`*tLML{tCO=B1TPNy zqP-|Moa5`-Ncvyx-*Wih%KyW=d*^R${`URK`@fKbe=v>sH^TlgApRl4m4EPWXdF^M z_db96H~0M4b#{LGU;NjcaKS-i|1$iI3l~zXivB)}v1@bQ(Bc|LxXRSDaP!V{0Dx}k zYM@PnL0?B>l6T-xs*TExUsqTE0DfWX=ZQ}yjtUgWe@jhLBXZJgEUeQZ&%|M7r#5Eu zAB$IC%MUs;yuQRPCrQUE+SxnuNO?%`y3?FUiYR~^l<(KdBgHd&BQpLGsa z^o{MC1NN_TAzH&<+K z^$#dPA@s)B7tF8yIBK;bg~>@=87sqjqlD^CsYtXFE)<+NUIsy^Y=hVN$P4(763rfi zZ@R`shG$&rqSWGmPkRc?$Dv;^ehdlGI*jjplSaMYv#${&mW0BpeU458dOkkbfIdhk zRPm5wdB<_Yj)w{|q|P{XYg52d4^0aR)%dlwd0pf4eSgzg$2^-dgf`P9n(VeIO!(p} zLAg|>0@Rok>+Hdd>JDNcLpnkP%|Cb}azq_NR}Q8G8%3vgHh>)&AJ>8_0pU%5Z~=sa z?4-?Kgv*KiI#U6|l>#<|hqYp?3CPM;LN{_mqxNlfcMez@8a>@2|2QB>Ap0*DH6L>L7+gSRw7*{~^FQDq7^XrK1b}9ud{{q#Qd~EZl3Q81P5_ZOl z?vgnuog8*T&*V)_xc>^=N8SWd7ZS|)`k`q_-<1uX+XFsOL*Do*y9WeO!}m3p`7-hb z2e~M!;WcS&^y)e9d_|^>_Abwbq96wtL9%F(pX!xX*{AEVTsC*4`pU$aRS#J^DAkyi`)4J=%%(J)`19`PoS1rb+L5SHH`w zh}9YIS3@q`$W&r{?3E6KOM{%}2FxKEmoxO7`a{%NL5`5Gf?N@`uR71N-?5d7Bh045 zqww@HyMekRLRc54Z3^s{5oW&FLRjF3mk|V=kmx5Bh{U+ zV{TE(jvL!k1+JDlmKByF{E~03%9`4_$hNF0z+J+J6%q#J9~Cq!@feo>oDaO4)ABa3 zxpz^U)Fd>uskmA_v>N!vO0ss;wtT0@z|nO6N}B zHoWaTrU%oD62+H``!Ijcc~X@v-&>FnbdRo2{Fs>gVTLV7)Tz(fm&%v{zG?9=uB4}etPx;sgiFt;t&CjcmL>gix(Di4jFFI;+rtHe2GAW-N|!Iir1U4)N=q<3g#;gS}+9FG2&bP_k2;_1&H3ye0L#Yzwf zTnb2ZPg2#HRL!6p5=&fm>FbBKm`#ZbVniyo;%-BSW=`{&>oDPJdPGz+HWD98%D)XV z+)L;_Woe-&IFb5~xX!oDU(q{4NIL07Cdqez}sa%kq7e4KG$8qOgtptFkjzo0K>sND#!iH zC&@`Ud*$OecDIK~K9+_0Yx!}n#MPGcX@y~7FPSjLtg(T07RN$;!aituzxZfh`t0UY zzwTbuH#4-a4eWyKVu;*i&g;<)_b7hBNjUyOM$pxtQ;$JsqLs>DBabq<|Be${6*v&F3;+AKZ@FnffFhyyxkjDf4jfC`QiQW?T2&+39OW? z0l;4C&OPa*^1%c_-ATSQ7oKuMpsLI1O4X4Eg*mXXqU>39Ifp9LToH! zAkkCTwHV254ldgNq>X!(i^oz;F;Vguzm$L*Nxg4aJWTgtzeNue?h%$Rk;^fX^=RgQ zCn#n~_uIIP(ouWY?)dZeKl`2sB>xB?(2A;ZOGFVNlgsun^1zX6Xp{wip)=89Y{R+d zu+=VF0_uGWmqkrXWw+01YfM2l@gOgvL!SH#MY4`Od%Ir%GkBvy+lWyjK~D_=z&sv zfoC)eLG#3S#v}?l(lQ<6O$`RWdLHj0R_`Y?P^SI^9aay3uA*V9mJ7J105DA#kc-3@ z2f|Qjmmp5iIQjjzrvn2(%Qwb~;LqC8P^a%(Mmq&hC=jN!qBaAd<8ZAvx5J#B0Oe;C z6ROmnvF5zn#6XSHW*IO+|$~?EIjkhN*`=UKUuK@Yh)xBP|x?+WiyjJ&;ggFfou2hw!GDOqy!uuNf4l1ITfNjNlK+gToLsW z1;a-fLhGk^E`tbF^FiLv5e#?x>?!kH+l7lISJ<_N6hc%`T=NaX&HqxKT;~=-;hQoVj7Bu6+JOUJQEtLOKlfPEcm=#+9O+{iZ0t%Mqih1 zvdbEVDy^`yY8kbqScR7t5+SJZ`r@x8E2(u4QqH++o(}4?KWCPQk}@BAjNNjrPiJ)q z+B|QKj1({OE3IdOSaY_i!MlkcUHnZ4VT~iN1N>Y-6eo7+nxUY!Us4qtB~A?mJ7FSi z!MhP_lR9!-eq&iDBIX|Tu;S$LI!}{(;`b(=(wcC`bqhS)EG&Gs5m12K+0&5>K5cF9 z>zcE7b6d6_zVX5Leykb6D_J3%rZ}EDhNsDz7q5_^_@R=9s`+a=PqD!g!Pgh-u zH^y488H)6uUB4;tBE2gEJKK7uIk=u=Rp7pll3O~!MH$HMJV$Kr>F-wTRu0yb5z^w^ z>Iw2(;MUIr)z&GLUirzK2ILwe3@6)vb_V6`epYHg_#eK5uIvRFS$XbNm1xJWv7Q6IS2SfE5J}!S=6wx5Q$r*|a zpGphkDn8RMrE}im7&^(;0(GmX!44}A2ioWmS08W`?xtZ4d6B? zT`uIL0!DO`rG?=vQc6>riYP3VDd8!YQr>7vZj$NnY76Mr6#S|5S$#Sad$D#arR{`i zin%W$5EoksIYMo}c`w8fKEpg6`g6Z+JXWz^L_dn-r?k{b5eB3XKu*=Z{2Hx=W$Tf> zVvkV*kNUTV!jjGNAu^Rb0g_B4fdKMU#I3pyYZRzij1Jb&+CVhvLpQqbP80J%yZ()d zZ}QnSCC(!L=B3G05!^R(8a@Kfq0~z*ztzgWEV;2uef;#m%DQVQyZv`p*9u8YvRu}N z*LDy>YG7R_=X8IqLZ6#JxfDiuhhdlZFM4J&sTSA#!!*%8$XEgf=$j#iDdld5UE`Xh z^A^+Q@vSdJzY6}L`Ouj+eL70!9++4rlq!U9)%^CW@hZqY3Ug>tZsNrGasVuE8*eMf zC@p@O7B@l6AoqS=v_JfAyNS6?uz?SqMbt+o$F#UFZ_ef@+Y5X@s-nr$GehsU4T<30G7FjP!%kzZ`umxHZ>^Qu78%~a#9Nph3<%)t!kk*25F&V$wfLCkR4@#r^m0i+IS@hy5_ayPdV zNt3Zl`~;~8ba0xZ^9DVJ1Iy*p(7 z*Xeh;=8!I1FlY;|EXLW<5qoe?3!}qXBi>3AGb%s`QP%ivM;1&0zp1B?-reb{5#6Kd zDRJ**6_GJ8oi#Q0+xh!5R*0{gZI2F-SKRowNvhXs(&Kg6@IF5`TSfON3~K%k-K>r1 zPwAlJPd^#fCZ3gCZ^{Faw)2Rs-iwnzkN5eMS1js*DA7P5V^Iyc|G8v5h3^-}ze)?Z z*|CsTOt1*varRt$zp50p78u|?fh1dm#BMFZiEDIh6z_%i*M4S9V14W882R@47MAGe z_u);|Qi`-Gf(>PN@}@~OhlioZJ%R<#CQ^fi8~qkPrJY}=<@7|S>xr&gns0=&oP&pD X%hVz6s@WHxK!C2Mp+=25A@Y9!nF9~R literal 0 HcmV?d00001 diff --git a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-delete.spec.js.ejs b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-delete.spec.js.ejs index 812c29c7b..b214a2bfc 100644 --- a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-delete.spec.js.ejs +++ b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-delete.spec.js.ejs @@ -1,42 +1,73 @@ +<%_ + const entityFakeData = generateFakeData('cypress'); + const containsBinaryField = fields.find(field => (field.fieldTypeBinary && !field.blobContentTypeText)); +_%> describe('<%= entityAngularName %> delete dialog page', () => { - let randomPrefix let dynamicId beforeEach(() => { cy.unregisterServiceWorkers() - randomPrefix = 'test' + new Date().getTime() cy.loginByApi( Cypress.env('adminUsername'), Cypress.env('adminPassword') ) - - cy.save('api/<%= entityApiUrl %>', { - <%_ - for (field of fields.filter(field => !field.id)) { - _%> - <%_ if (field.fieldTypeTimed) { _%> - <%= field.fieldName %>: new Date(), - <%_ } else { _%> - <%= field.fieldName %>: randomPrefix, - <%_ } _%> - <%_ } _%> +<%_ + if (containsBinaryField) { +_%> + cy.fixture('integration-test.png') + .then($blob => { + return <% } %>cy.save('api/<%= entityApiUrl %>', { + <%_ + for (field of fields.filter(field => !field.id)) { + const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; + if (fieldValue === undefined) { + warning(`Error generating a value for field ${field.fieldName}`); + } + _%> + <%_ if (field.fieldTypeBoolean) { _%> + <%= field.fieldName %>: true, + <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> + <%= field.fieldName %>: $blob, + <%= field.fieldName %>ContentType: 'image/png', + <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeLocalDate) { _%> + <%= field.fieldName %>: '<%= fieldValue %>' , + <%_ } else if (field.fieldTypeTimed) { _%> + <%= field.fieldName %>: '<%= fieldValue %>:00.000Z' , + <%_ } else if (field.fieldTypeDuration) { _%> + <%= field.fieldName %>: 'PT0.000052484S', + <%_ } else if (field.fieldTypeNumeric) { _%> + <%= field.fieldName %>: <%= fieldValue %>, + <%_ } else { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } _%> + <%_ } _%> +<%_ if (containsBinaryField) { _%> + }) +<%_ } _%> }).then(res => { dynamicId = res.id - }) - - cy.visit('/entities/<%= entityFolderName %>') - - cy.getBySel('<%= entityInstance %>Table') - .contains('td', randomPrefix) - .parent() - .trigger('mouseenter') - .within($tr => { - cy.root() - .get('td') - .children() - .getByName('delete<%= entityAngularName %>Btn') - .click() + cy.intercept('**/api/<%= entityApiUrl %>*').as('get<%= entityClassPluralHumanized %>') + cy.visit('/entities/<%= entityFolderName %>') + cy.wait('@get<%= entityClassPluralHumanized %>') + // eslint-disable-next-line + cy.wait(100) + cy.getBySel('<%= entityInstance %>Table') + .get('td:nth-child(1)').each(($el, index, $list) => { + const text = $el.text(); + if(text.includes(dynamicId)) { + cy.getBySel('<%= entityInstance %>Table') + .get('td:nth-child(1)') + .eq(index) + .parent() + .trigger('mouseenter') + .within($tr => { + cy.root().get('td').children().getByName('delete<%= entityAngularName %>Btn').click() + }) + } }) + }) }) afterEach(() => { diff --git a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs index a0525c87a..8b1570065 100644 --- a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs +++ b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-list.spec.js.ejs @@ -1,8 +1,8 @@ <%_ -const entityFakeData = generateFakeData('cypress'); + const entityFakeData = generateFakeData('cypress'); + const containsBinaryField = fields.find(field => (field.fieldTypeBinary && !field.blobContentTypeText)); _%> describe('<%= entityAngularName %> list page', () => { - let randomPrefix let dynamicId <%_ if (!paginationNo || searchEngine) { _%> let dynamicId2 @@ -15,55 +15,77 @@ describe('<%= entityAngularName %> list page', () => { ) <%_ if (!paginationNo || searchEngine) { _%> // create another <%= entityAngularName %> to test sort implementation - cy.save('api/<%= entityApiUrl %>', { - <%_ - for (field of fields.filter(field => !field.id)) { - const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; - if (fieldValue === undefined) { - warning(`Error generating a value for field ${field.fieldName}`); - } - _%> - <%_ if (field.fieldTypeBoolean) { _%> - <%= field.fieldName %>: true, - <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> - <%= field.fieldName %>: null, - <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> - <%= field.fieldName %>: '<%= fieldValue %>', - <%_ } else if (field.fieldTypeLocalDate || field.fieldTypeTimed || field.fieldTypeDuration) { _%> - <%= field.fieldName %>: '<%= fieldValue %>', - <%_ } else if (field.fieldTypeNumeric) { _%> - <%= field.fieldName %>: <%= fieldValue %>, - <%_ } else { _%> - <%= field.fieldName %>: '<%= fieldValue %>', +<%_ if (containsBinaryField) { _%> + cy.fixture('integration-test.png') + .then($blob => { + return <% } %>cy.save('api/<%= entityApiUrl %>', { + <%_ + for (field of fields.filter(field => !field.id)) { + const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; + if (fieldValue === undefined) { + warning(`Error generating a value for field ${field.fieldName}`); + } + _%> + <%_ if (field.fieldTypeBoolean) { _%> + <%= field.fieldName %>: true, + <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> + <%= field.fieldName %>: $blob, + <%= field.fieldName %>ContentType: 'image/png', + <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeLocalDate) { _%> + <%= field.fieldName %>: '<%= fieldValue %>' , + <%_ } else if (field.fieldTypeTimed) { _%> + <%= field.fieldName %>: '<%= fieldValue %>:00.000Z' , + <%_ } else if (field.fieldTypeDuration) { _%> + <%= field.fieldName %>: 'PT0.000052484S', + <%_ } else if (field.fieldTypeNumeric) { _%> + <%= field.fieldName %>: <%= fieldValue %>, + <%_ } else { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } _%> <%_ } _%> - <%_ } _%> +<%_ if (containsBinaryField) { _%> + }) +<%_ } _%> }).then(res => { dynamicId2 = res.id }) <%_ } _%> - randomPrefix = 'test' + new Date().getTime() - cy.save('api/<%= entityApiUrl %>', { - <%_ - for (field of fields.filter(field => !field.id)) { - const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; - if (fieldValue === undefined) { - warning(`Error generating a value for field ${field.fieldName}`); - } - _%> - <%_ if (field.fieldTypeBoolean) { _%> - <%= field.fieldName %>: true, - <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> - <%= field.fieldName %>: null, - <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> - <%= field.fieldName %>: '<%= fieldValue %>', - <%_ } else if (field.fieldTypeLocalDate || field.fieldTypeTimed || field.fieldTypeDuration) { _%> - <%= field.fieldName %>: '<%= fieldValue %>', - <%_ } else if (field.fieldTypeNumeric) { _%> - <%= field.fieldName %>: <%= fieldValue %>, - <%_ } else { _%> - <%= field.fieldName %>: '<%= fieldValue %>', + +<%_ if (containsBinaryField) { _%> + cy.fixture('integration-test.png') + .then($blob => { + return <% } %>cy.save('api/<%= entityApiUrl %>', { + <%_ + for (field of fields.filter(field => !field.id)) { + const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; + if (fieldValue === undefined) { + warning(`Error generating a value for field ${field.fieldName}`); + } + _%> + <%_ if (field.fieldTypeBoolean) { _%> + <%= field.fieldName %>: true, + <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> + <%= field.fieldName %>: $blob, + <%= field.fieldName %>ContentType: 'image/png', + <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeLocalDate) { _%> + <%= field.fieldName %>: '<%= fieldValue %>' , + <%_ } else if (field.fieldTypeTimed) { _%> + <%= field.fieldName %>: '<%= fieldValue %>:00.000Z' , + <%_ } else if (field.fieldTypeDuration) { _%> + <%= field.fieldName %>: 'PT0.000052484S', + <%_ } else if (field.fieldTypeNumeric) { _%> + <%= field.fieldName %>: <%= fieldValue %>, + <%_ } else { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } _%> <%_ } _%> - <%_ } _%> +<%_ if (containsBinaryField) { _%> + }) +<%_ } _%> }).then(res => { dynamicId = res.id cy.intercept('**/api/<%= entityApiUrl %>*').as('get<%= entityClassPluralHumanized %>') diff --git a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-view.spec.js.ejs b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-view.spec.js.ejs index b4efdec39..f9f409043 100644 --- a/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-view.spec.js.ejs +++ b/generators/entity-client/templates/svelte/cypress/integration/entities/entity/entity-view.spec.js.ejs @@ -1,25 +1,50 @@ +<%_ + const entityFakeData = generateFakeData('cypress'); + const containsBinaryField = fields.find(field => (field.fieldTypeBinary && !field.blobContentTypeText)); +_%> describe('<%= entityAngularName %> view details page', () => { - let randomPrefix let dynamicId beforeEach(() => { cy.unregisterServiceWorkers() - randomPrefix = 'test' + new Date().getTime() cy.loginByApi( Cypress.env('adminUsername'), Cypress.env('adminPassword') ) - cy.save('api/<%= entityApiUrl %>', { - <%_ - for (field of fields.filter(field => !field.id)) { - _%> - <%_ if (field.fieldTypeTimed) { _%> - <%= field.fieldName %>: new Date(), - <%_ } else { _%> - <%= field.fieldName %>: randomPrefix, +<%_ if (containsBinaryField) { _%> + cy.fixture('integration-test.png') + .then($blob => { + return <% } %>cy.save('api/<%= entityApiUrl %>', { + <%_ + for (field of fields.filter(field => !field.id)) { + const fieldValue = !entityFakeData ? field.generateFakeData('cypress') : entityFakeData[field.fieldName]; + if (fieldValue === undefined) { + warning(`Error generating a value for field ${field.fieldName}`); + } + _%> + <%_ if (field.fieldTypeBoolean) { _%> + <%= field.fieldName %>: true, + <%_ } else if (field.fieldTypeBinary && !field.blobContentTypeText) { _%> + <%= field.fieldName %>: $blob, + <%= field.fieldName %>ContentType: 'image/png', + <%_ } else if (field.fieldTypeString || field.fieldTypeUUID) { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } else if (field.fieldTypeLocalDate) { _%> + <%= field.fieldName %>: '<%= fieldValue %>' , + <%_ } else if (field.fieldTypeTimed) { _%> + <%= field.fieldName %>: '<%= fieldValue %>:00.000Z' , + <%_ } else if (field.fieldTypeDuration) { _%> + <%= field.fieldName %>: 'PT0.000052484S', + <%_ } else if (field.fieldTypeNumeric) { _%> + <%= field.fieldName %>: <%= fieldValue %>, + <%_ } else { _%> + <%= field.fieldName %>: '<%= fieldValue %>', + <%_ } _%> <%_ } _%> - <%_ } _%> +<%_ if (containsBinaryField) { _%> + }) +<%_ } _%> }).then(res => { dynamicId = res.id cy.visit(`/entities/<%= entityFolderName %>/${dynamicId}/view`) @@ -42,13 +67,6 @@ describe('<%= entityAngularName %> view details page', () => { cy.root() .get('.table-cell') .should('have.length', <%= (fields.length - 1) * 2 %>) - <%_ - for (let loopIndex = 1; loopIndex > fields.length * 2; loopIndex= loopIndex + 2) { - _%> - .get('.table-cell') - .eq(<%= loopIndex %>) - .should('contain', randomPrefix) - <%_ }_%> }) }) diff --git a/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs b/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs index 82efddc2d..85508df3c 100644 --- a/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs +++ b/generators/entity-client/templates/svelte/src/main/webapp/app/lib/entities/entity/EntityTable.svelte.ejs @@ -10,7 +10,7 @@ const bothTimedAndDuration = timedFieldType && durationFieldType; const binaryFieldType = fields.find(field => ((field.fieldTypeBinary && field.blobContentTypeImage) || (field.fieldTypeBinary && field.blobContentTypeAny))); if (timedFieldType || durationFieldType ) { _%> - import { <%_ if (timedFieldType) { _%>formatDate<%_ } _%><%_ if (bothTimedAndDuration) { _%>, <%_ } _%><%_ if (durationFieldType) { _%>formatDurationType<%_ } _%> } from '$lib/utils/date' + import { <%_ if (timedFieldType) { _%>formatDate <%_ } _%><%_ if (bothTimedAndDuration) { _%>, <%_ } else { _%><%_ } _%><%_ if (durationFieldType) { _%> formatDurationType <%_ } _%> } from '$lib/utils/date' <%_ } if (binaryFieldType) { _%> @@ -61,7 +61,7 @@ _%> let fieldIndex = 1; for (field of fields.filter(field => !field.id)) { _%> - classes="min-w-48 {showActions ? 'relative' : ''}"<%_ } _%>> + classes="min-w-48 {showActions ? 'relative' : ''}"<%_ } _%>> <%_ if(fieldIndex === lastFieldIndex) { _%>
<%_ }_%> diff --git a/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs b/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs index ce83d877a..7d1457ad6 100644 --- a/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs +++ b/generators/entity-client/templates/svelte/src/main/webapp/app/routes/entities/entity/[id]/view.svelte.ejs @@ -14,7 +14,7 @@ const bothTimedAndDuration = timedFieldType && durationFieldType; const binaryFieldType = fields.find(field => ((field.fieldTypeBinary && field.blobContentTypeImage) || (field.fieldTypeBinary && field.blobContentTypeAny))); if (timedFieldType || durationFieldType ) { _%> - import { <%_ if (timedFieldType) { _%>formatDate<%_ } _%><%_ if (bothTimedAndDuration) { _%>, <%_ } _%><%_ if (durationFieldType) { _%>formatDurationType<%_ } _%> } from '$lib/utils/date' + import { <%_ if (timedFieldType) { _%> formatDate<%_ } _%><%_ if (bothTimedAndDuration) { _%>, <%_ } else { _%> <%_ } _%><%_ if (durationFieldType) { _%> formatDurationType <%_ } _%> } from '$lib/utils/date' <%_ } if (binaryFieldType) { _%>