Skip to content

Commit

Permalink
Merge pull request #723 from jhipster/jdl-data-types-part-1
Browse files Browse the repository at this point in the history
feat: Support JDL data types in list, view, delete entity flows
  • Loading branch information
vishal423 authored Oct 7, 2021
2 parents bfce558 + b345662 commit c1ce120
Show file tree
Hide file tree
Showing 10 changed files with 344 additions and 92 deletions.
5 changes: 4 additions & 1 deletion generators/client/files.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -145,10 +146,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',
Expand Down Expand Up @@ -181,6 +183,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',
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<script>
import { byteSize, openFile } from '$lib/utils/data-util'
export let field
export let name
export let fieldType = 'blob'
export let fieldContentType
</script>

{#if field}
<div
class="cursor-pointer text-primary-500 inline-block"
on:click|preventDefault="{openFile(field, fieldContentType)}"
>
{#if fieldType === 'image'}
<img
src="{'data:' + fieldContentType + ';base64,' + field}"
class="max-h-8"
alt="{name}"
/>
{:else}
View
{/if}
</div>
<span class="text-sm">{fieldContentType}</span>,
<span class="text-sm whitespace-nowrap"> {byteSize(field)}</span>
{/if}
Original file line number Diff line number Diff line change
@@ -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'
}
Original file line number Diff line number Diff line change
@@ -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 '-'
}
}
Original file line number Diff line number Diff line change
@@ -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(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
<%_
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 randomPrefix2
let dynamicId2
<%_ } _%>
beforeEach(() => {
Expand All @@ -13,32 +15,77 @@ 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)) {
_%>
<%_ if (field.fieldTypeTimed) { _%>
<%= field.fieldName %>: new Date(),
<%_ } else { _%>
<%= field.fieldName %>: randomPrefix2,
<%_ 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)) {
_%>
<%_ 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.intercept('**/api/<%= entityApiUrl %>*').as('get<%= entityClassPluralHumanized %>')
Expand Down
Loading

0 comments on commit c1ce120

Please sign in to comment.