Skip to content

Commit ca36930

Browse files
authored
Merge pull request #15 from Libertech-FR/14-api-feature
14 api feature
2 parents c90cc9a + 4b75cc2 commit ca36930

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1369
-767
lines changed

Makefile

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,24 @@ help:
88
| sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-15s\033[0m %s\n", $$1, $$2}'
99

1010
dbs: ## Start databases
11-
@docker volume create $(APPNAME)-redis
12-
@docker run -d --rm \
13-
--name $(APPNAME)-redis \
14-
--network dev \
15-
-p 6379:6379 \
16-
redis
1711
@docker volume create $(APPNAME)-mongodb
1812
@docker run -d --rm \
1913
--name $(APPNAME)-mongodb \
2014
-v $(APPNAME)-mongodb:/data/db \
2115
-p 27017:27017 \
16+
-e MONGODB_REPLICA_SET_MODE=primary \
17+
-e MONGODB_REPLICA_SET_NAME=rs0 \
18+
-e ALLOW_EMPTY_PASSWORD=yes \
2219
--network dev \
23-
mongo:5.0 --wiredTigerCacheSizeGB 1.5 --quiet || true
20+
mongo:5.0 --replSet rs0 --wiredTigerCacheSizeGB 1.5 --quiet || true
21+
@docker volume create $(APPNAME)-redis
22+
@docker run -d --rm \
23+
--name $(APPNAME)-redis \
24+
--network dev \
25+
-p 6379:6379 \
26+
redis
27+
@sleep 1
28+
@docker exec -it teaket-mongodb mongo --eval "rs.initiate({_id: 'rs0', members: [{_id: 0, host: '127.0.0.1:27017'}]})" || true
2429

2530
stop-dbs: ## Stop databases
2631
@docker stop $(APPNAME)-redis || true
@@ -30,4 +35,4 @@ buildseeds: ## Build populate image
3035
docker build -t seeding -f ./populate/Dockerfile ./populate
3136

3237
populate-db: ## Populate database
33-
docker run --rm --network dev -v ./populate:/app -v ./service/.dev-token.json:/app/.dev-token.json seeding
38+
docker run --rm --network dev -v ./populate:/app -v ./service/.dev-token.json:/app/.dev-token.json seeding

app/nuxt.config.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { extensions } from '@libertech-fr/teaket_common'
1+
import appSetup from './src/extension.app.setup'
22
import pugPlugin from 'vite-plugin-pug'
33
import openapiTS from 'openapi-typescript'
44
import { writeFileSync } from 'fs'
@@ -34,7 +34,7 @@ export default defineNuxtConfig({
3434
'nuxt-quasar-ui',
3535
'@vueuse/nuxt',
3636
'dayjs-nuxt',
37-
...extensions.appSetup.default(),
37+
...appSetup(),
3838
],
3939
auth: {
4040
globalMiddleware: true,
@@ -45,8 +45,7 @@ export default defineNuxtConfig({
4545
scheme: 'refresh',
4646
token: {
4747
property: 'access_token',
48-
maxAge: 1 * 5,
49-
// maxAge: 60 * 5,
48+
maxAge: 60 * 5,
5049
},
5150
refreshToken: {
5251
property: 'refresh_token',

app/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
"name": "@libertech-fr/teaket_app",
33
"version": "0.0.1",
44
"scripts": {
5+
"prebuild": "nuxt prepare",
56
"build": "nuxt build",
7+
"predev": "nuxt prepare",
68
"dev": "nuxt dev",
79
"generate": "nuxt generate",
810
"preview": "nuxt preview",
9-
"postinstall": "nuxt prepare",
1011
"generate:api": "openapi-typescript http://localhost:7100/swagger/json -o ./.nuxt/types/service-api.d.ts",
1112
"upgrade:packages": "npx npm-check-updates -u --reject @types/node"
1213
},
1314
"dependencies": {
14-
"@libertech-fr/teaket_common": "*",
1515
"@nuxt-alt/auth": "^2.6.1",
1616
"@nuxt-alt/http": "^1.6.8",
1717
"@pinia/nuxt": "^0.4.11",

app/src/components/appbar/index.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
q-header
33
q-toolbar.bg-primary.text-white(style={height: '32px'})
44
q-btn(flat)
5-
q-avatar
5+
q-avatar
66
img(src="/logo.svg")
77
q-toolbar-title Teaket
88
q-separator(vertical dark inset).q-mx-md
99
tk-AppbarMenu
10-
q-space
10+
q-space
1111
tk-AppbarSearchfield
1212
q-separator(vertical dark inset).q-mx-md
1313
tk-AppbarRightButtons
1414
</template>
1515

1616
<script lang="ts" setup>
17-
</script>
17+
</script>

app/src/components/searchfilters/Main.vue

Lines changed: 104 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,30 @@
33
//- .col.col-md-2
44
//- q-select(:options="fieldTypes" label="Type de champ" v-model="fieldType" clearable @update:model-value="clearFields(['field', 'comparator'])")
55
.col.col-md-2
6-
q-select(:options="fields" label="Champs" v-model="field" clearable @update:model-value="onFieldChange($event)")
6+
q-select(:options="fields" label="Champs" v-model="field" clearable @update:model-value="onFieldChange($event)")
77
.col.col-md-2
8-
q-select(:options="comparatorFilteredByType" label="Comparateurs" v-model="comparator" clearable @update:model-value="clearFields([])" :disable="isFieldDisabled.comparator")
9-
template(v-slot:selected-item="scope")
10-
q-icon(:name="scope.opt.icon" size="xs")
11-
template(v-slot:option="scope")
12-
q-item(v-bind="scope.itemProps")
13-
q-item-section(avatar)
14-
q-icon(:name="scope.opt.icon")
15-
q-item-section
16-
q-item-label
17-
span {{ scope.opt.label }}
8+
q-select(:options="comparatorFilteredByType" label="Comparateurs" v-model="comparator" clearable @update:model-value="clearFields([])" :disable="isFieldDisabled.comparator")
9+
template(v-slot:selected-item="scope")
10+
q-icon(:name="scope.opt.icon" size="xs")
11+
template(v-slot:option="scope")
12+
q-item(v-bind="scope.itemProps")
13+
q-item-section(avatar)
14+
q-icon(:name="scope.opt.icon")
15+
q-item-section
16+
q-item-label
17+
span {{ scope.opt.label }}
1818

1919
.col-12.col-md-2(v-show="!comparator?.multiplefields")
20-
q-input(v-model="search" label="Rechercher" clearable :type="searchInputType" :disable="isFieldDisabled.search" :prefix="comparator?.prefix" :suffix="comparator?.suffix")
20+
q-input(v-model="search" label="Rechercher" clearable :type="searchInputType" :disable="isFieldDisabled.search" :prefix="comparator?.prefix" :suffix="comparator?.suffix")
2121
.col-6.col-md-2(v-show="comparator?.multiplefields")
22-
q-input(v-model="searchMin" label="Min" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
22+
q-input(v-model="searchMin" label="Min" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
2323
.col-6.col-md-2(v-show="comparator?.multiplefields")
24-
q-input(v-model="searchMax" label="Max" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
24+
q-input(v-model="searchMax" label="Max" clearable :type="searchInputType" :disable="isFieldDisabled.search" )
2525
.col-12.col-md-1
26-
q-btn(color="primary" @click="addFilter" :disable="isFieldDisabled.addButton") Ajouter
26+
q-btn(color="primary" @click="addFilter" :disable="isFieldDisabled.addButton") Ajouter
2727
q-space
2828
.col-12.col-md-2
29-
tk-SearchfiltersRightSelect(ref="rightSelect")
29+
tk-SearchfiltersRightSelect(ref="rightSelect")
3030
</template>
3131

3232
<script lang="ts" setup>
@@ -54,134 +54,134 @@ const searchMax = ref('')
5454
const filters = ref<Filter[]>([])
5555
5656
const fieldTypes = ref<{
57-
label: string
58-
value: string
57+
label: string
58+
value: string
5959
}[]>([
60-
{ label: 'Texte', value: 'text' },
61-
{ label: 'Nombre', value: 'number' },
62-
{ label: 'Date', value: 'date' },
60+
{ label: 'Texte', value: 'text' },
61+
{ label: 'Nombre', value: 'number' },
62+
{ label: 'Date', value: 'date' },
6363
])
6464
6565
const comparatorTypes = ref<Comparator[]>([
66-
{ label: 'Egal à', querySign: '=', value: '=', icon: 'mdi-equal', type: ['number'], multiplefields: false, prefix: '', suffix: '' },
67-
{ label: 'Différent', querySign: '!=', value: '!=', icon: 'mdi-exclamation', type: ['number'], multiplefields: false, prefix: '', suffix: '' },
68-
{ label: 'Supérieur à', querySign: '>', value: '>', icon: 'mdi-greater-than', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
69-
{ label: 'Supérieur ou égal à', querySign: '>=', value: '>=', icon: 'mdi-greater-than-or-equal', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
70-
{ label: 'Inférieur à', querySign: '<', value: '<', icon: 'mdi-less-than', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
71-
{ label: 'Inférieur ou égal à', querySign: '<=', value: '<=', icon: 'mdi-less-than-or-equal', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
72-
{ label: 'entre', querySign: '<<', value: 'between', icon: 'mdi-arrow-expand-horizontal', type: ['number', 'date'], multiplefields: true, prefix: '', suffix: '' },
73-
{ label: 'Contiens', querySign: '^', value: '^', icon: 'mdi-apple-keyboard-control', type: ['text'], multiplefields: false, prefix: '/', suffix: '/' },
74-
{ label: 'Commence par', querySign: '^', value: '/^', icon: 'mdi-apple-keyboard-control', type: ['text'], multiplefields: false, prefix: '/^', suffix: '/' },
75-
{ label: 'Fini par', querySign: '^', value: '$/', icon: 'mdi-apple-keyboard-control', type: ['text'], multiplefields: false, prefix: '/', suffix: '$/' },
76-
{ label: 'Egal à', querySign: '@', value: '@', icon: 'mdi-apple-keyboard-control', type: [], multiplefields: true, prefix: '', suffix: '' },
66+
{ label: 'Egal à', querySign: '=', value: '=', icon: 'mdi-equal', type: ['number'], multiplefields: false, prefix: '', suffix: '' },
67+
{ label: 'Différent', querySign: '!=', value: '!=', icon: 'mdi-exclamation', type: ['number'], multiplefields: false, prefix: '', suffix: '' },
68+
{ label: 'Supérieur à', querySign: '>', value: '>', icon: 'mdi-greater-than', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
69+
{ label: 'Supérieur ou égal à', querySign: '>=', value: '>=', icon: 'mdi-greater-than-or-equal', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
70+
{ label: 'Inférieur à', querySign: '<', value: '<', icon: 'mdi-less-than', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
71+
{ label: 'Inférieur ou égal à', querySign: '<=', value: '<=', icon: 'mdi-less-than-or-equal', type: ['number', 'date'], multiplefields: false, prefix: '', suffix: '' },
72+
{ label: 'entre', querySign: '<<', value: 'between', icon: 'mdi-arrow-expand-horizontal', type: ['number', 'date'], multiplefields: true, prefix: '', suffix: '' },
73+
{ label: 'Contiens', querySign: '^', value: '^', icon: 'mdi-apple-keyboard-control', type: ['text'], multiplefields: false, prefix: '/', suffix: '/' },
74+
{ label: 'Commence par', querySign: '^', value: '/^', icon: 'mdi-apple-keyboard-control', type: ['text'], multiplefields: false, prefix: '/^', suffix: '/' },
75+
{ label: 'Fini par', querySign: '^', value: '$/', icon: 'mdi-apple-keyboard-control', type: ['text'], multiplefields: false, prefix: '/', suffix: '$/' },
76+
{ label: 'Egal à', querySign: '@', value: '@', icon: 'mdi-apple-keyboard-control', type: [], multiplefields: true, prefix: '', suffix: '' },
7777
7878
])
7979
8080
const onFieldChange = (value: Field) => {
81-
value === null ? fieldType.value = '' : fieldType.value = value.type
82-
clearFields(['comparator'])
81+
value === null ? fieldType.value = '' : fieldType.value = value.type
82+
clearFields(['comparator'])
8383
}
8484
8585
const clearFields = (fields: string[]) => {
86-
if (fields.includes('field')) field = ref()
87-
if (fields.includes('comparator')) comparator = ref()
88-
search.value = ''
89-
searchMin.value = ''
90-
searchMax.value = ''
86+
if (fields.includes('field')) field = ref()
87+
if (fields.includes('comparator')) comparator = ref()
88+
search.value = ''
89+
searchMin.value = ''
90+
searchMax.value = ''
9191
}
9292
9393
const addFilter = async () => {
94-
const searchFilter = getSearchFilter.value
95-
if (!searchFilter) return
96-
if (searchFilter.comparator.multiplefields) {
97-
for (const { key, value } of parseMultipleFilter(searchFilter)) {
98-
await pushQuery(key, value)
99-
}
100-
} else {
101-
const { key, value } = parseSimpleFilter(searchFilter)
102-
await pushQuery(key, value)
94+
const searchFilter = getSearchFilter.value
95+
if (!searchFilter) return
96+
if (searchFilter.comparator.multiplefields) {
97+
for (const { key, value } of parseMultipleFilter(searchFilter)) {
98+
await pushQuery(key, value)
10399
}
100+
} else {
101+
const { key, value } = parseSimpleFilter(searchFilter)
102+
await pushQuery(key, value)
103+
}
104104
}
105105
106106
const parseSimpleFilter = (searchFilter: SearchFilter) => {
107-
if (searchFilter.field.type === 'date') {
108-
if (searchFilter.comparator.querySign === '<' || searchFilter.comparator.querySign === '>=') searchFilter.search = dayjs(searchFilter.search).startOf('day').toISOString()
109-
if (searchFilter.comparator.querySign === '>' || searchFilter.comparator.querySign === '<=') searchFilter.search = dayjs(searchFilter.search).endOf('day').toISOString()
110-
}
111-
return {
112-
key: `filters[${searchFilter.comparator.querySign}${searchFilter.field.name}]`,
113-
value: `${searchFilter.comparator.prefix}${searchFilter.search}${searchFilter.comparator.suffix}`
114-
}
107+
if (searchFilter.field.type === 'date') {
108+
if (searchFilter.comparator.querySign === '<' || searchFilter.comparator.querySign === '>=') searchFilter.search = dayjs(searchFilter.search).startOf('day').toISOString()
109+
if (searchFilter.comparator.querySign === '>' || searchFilter.comparator.querySign === '<=') searchFilter.search = dayjs(searchFilter.search).endOf('day').toISOString()
110+
}
111+
return {
112+
key: `filters[${searchFilter.comparator.querySign}${searchFilter.field.name}]`,
113+
value: `${searchFilter.comparator.prefix}${searchFilter.search}${searchFilter.comparator.suffix}`
114+
}
115115
}
116116
117117
const parseMultipleFilter = (searchFilter: SearchFilter) => {
118-
if (searchFilter.field.type === 'date') {
119-
searchFilter.searchMin = dayjs(searchFilter.searchMin).startOf('day').toISOString()
120-
searchFilter.searchMax = dayjs(searchFilter.searchMax).endOf('day').toISOString()
121-
}
122-
const min = {
123-
key: `filters[>=${searchFilter.field.name}]`,
124-
value: `${searchFilter.comparator.prefix}${searchFilter.searchMin}${searchFilter.comparator.suffix}`
125-
}
126-
const max = {
127-
key: `filters[<=${searchFilter.field.name}]`,
128-
value: `${searchFilter.comparator.prefix}${searchFilter.searchMax}${searchFilter.comparator.suffix}`
129-
}
130-
return [min, max]
118+
if (searchFilter.field.type === 'date') {
119+
searchFilter.searchMin = dayjs(searchFilter.searchMin).startOf('day').toISOString()
120+
searchFilter.searchMax = dayjs(searchFilter.searchMax).endOf('day').toISOString()
121+
}
122+
const min = {
123+
key: `filters[>=${searchFilter.field.name}]`,
124+
value: `${searchFilter.comparator.prefix}${searchFilter.searchMin}${searchFilter.comparator.suffix}`
125+
}
126+
const max = {
127+
key: `filters[<=${searchFilter.field.name}]`,
128+
value: `${searchFilter.comparator.prefix}${searchFilter.searchMax}${searchFilter.comparator.suffix}`
129+
}
130+
return [min, max]
131131
}
132132
133133
const pushQuery = async (key: string, value: string) => {
134-
const query = {
135-
...route.query,
136-
}
137-
query[key] = value
138-
await router.push({
139-
query
140-
})
134+
const query = {
135+
...route.query,
136+
}
137+
query[key] = value
138+
await router.push({
139+
query
140+
})
141141
}
142142
143143
const getSearchFilter = computed(() => {
144-
if (field.value === undefined || field.value === null) return null
145-
if (comparator.value === undefined || comparator.value === null) return null
146-
return {
147-
field: field!.value,
148-
comparator: comparator!.value,
149-
search: search.value,
150-
searchMin: searchMin.value,
151-
searchMax: searchMax.value
152-
}
144+
if (field.value === undefined || field.value === null) return null
145+
if (comparator.value === undefined || comparator.value === null) return null
146+
return {
147+
field: field!.value,
148+
comparator: comparator!.value,
149+
search: search.value,
150+
searchMin: searchMin.value,
151+
searchMax: searchMax.value
152+
}
153153
})
154154
155155
const searchInputType = computed(() => {
156-
if (fieldType.value === undefined || fieldType.value === null) return 'text'
157-
return fieldType.value
156+
if (fieldType.value === undefined || fieldType.value === null) return 'text'
157+
return fieldType.value
158158
})
159159
160160
const fieldsFilteredByType = computed(() => {
161-
if (fieldType.value === undefined || fieldType.value === null) return []
162-
return fields.value.filter((field) => {
163-
return field.type === fieldType.value
164-
})
161+
if (fieldType.value === undefined || fieldType.value === null) return []
162+
return fields.value.filter((field) => {
163+
return field.type === fieldType.value
164+
})
165165
})
166166
167167
const comparatorFilteredByType = computed(() => {
168-
if (fieldType.value === undefined || fieldType.value === null) return []
169-
return comparatorTypes.value.filter((comparator) => {
170-
return comparator.type.includes(fieldType.value!)
171-
})
168+
if (fieldType.value === undefined || fieldType.value === null) return []
169+
return comparatorTypes.value.filter((comparator) => {
170+
return comparator.type.includes(fieldType.value!)
171+
})
172172
})
173173
174174
const isFieldDisabled = computed(() => {
175-
return {
176-
field: false,
177-
comparator: !field.value,
178-
search: !field.value || !comparator.value,
179-
addButton: !field.value || !comparator.value || !search.value,
180-
}
175+
return {
176+
field: false,
177+
comparator: !field.value,
178+
search: !field.value || !comparator.value,
179+
addButton: !field.value || !comparator.value || !search.value,
180+
}
181181
})
182182
183183
defineExpose({
184-
comparatorTypes,
185-
rightSelect,
184+
comparatorTypes,
185+
rightSelect,
186186
})
187-
</script>
187+
</script>

0 commit comments

Comments
 (0)