Skip to content

Commit

Permalink
Merge pull request #1505 from cloud-pi-native/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
ArnaudTA authored Jan 9, 2025
2 parents 4ae4347 + 2bd65af commit 22c1ccd
Show file tree
Hide file tree
Showing 39 changed files with 347 additions and 152 deletions.
1 change: 1 addition & 0 deletions apps/client/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ RUN pnpm install --ignore-scripts # --no-optional
COPY --chown=node:root packages/ ./packages/
RUN pnpm --filter @cpn-console/shared run build
COPY --chown=node:root apps/client/ ./apps/client/
RUN pnpm --filter client run icons
ENTRYPOINT [ "pnpm", "--filter", "client", "run", "dev" ]


Expand Down
3 changes: 2 additions & 1 deletion apps/client/cypress/e2e/specs/admin/projects.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ describe('Administration projects', () => {
cy.get('td:nth-of-type(4)').should('contain', project.owner.email)
cy.get('td:nth-of-type(5)').invoke('attr', 'title').should('contain', statusDict.status[project.status].wording)
cy.get('td:nth-of-type(5)').invoke('attr', 'title').should('contain', statusDict.locked[String(!!project.locked)].wording)
cy.get('td:nth-of-type(6)').should('contain.text', 'il y a')
cy.get('td:nth-of-type(6)').should('contain.text', '-')
cy.get('td:nth-of-type(7)').should('contain.text', 'il y a')
})
})
})
Expand Down
12 changes: 7 additions & 5 deletions apps/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
"private": false,
"description": "cpn-console client",
"scripts": {
"build": "run-s type-check build-only",
"build": "run-s icons type-check build-only",
"build-only": "vite --mode=production build",
"build:clean": "rimraf ./dist ./tsconfig.tsbuildinfo",
"cypress:install": "cypress install",
"dev": "vite --mode=development",
"format": "NODE_OPTIONS='--no-warnings=ExperimentalWarning' eslint ./ --fix",
"format:style": "stylelint ./src/**/*.{css,vue} --fix",
"icons": "vue-dsfr-icons -s scripts/icons.js -t src/icon-collections.ts",
"integ": "vite --mode=integration",
"kube:e2e": "CLIENT_HOST=console.dso.local CLIENT_PORT=80 cypress open",
"lint": "run-p lint:*",
Expand All @@ -30,7 +31,8 @@
"dependencies": {
"@cpn-console/shared": "workspace:^",
"@gouvfr/dsfr": "^1.13.0",
"@gouvminint/vue-dsfr": "^7.1.1",
"@gouvminint/vue-dsfr": "^8.0.0",
"@iconify-json/ri": "^1.2.2",
"@iconify/vue": "^4.2.0",
"@ts-rest/core": "^3.51.0",
"@vue/tsconfig": "^0.7.0",
Expand All @@ -49,9 +51,9 @@
"xbytes": "^1.9.1"
},
"optionalDependencies": {
"@cypress/vue": "^6.0.1",
"cypress": "^13.16.1",
"cypress-vite": "^1.5.0"
"@cypress/vue": "6.0.1",
"cypress": "13.16.1",
"cypress-vite": "1.5.0"
},
"devDependencies": {
"@cpn-console/eslint-config": "workspace:^",
Expand Down
18 changes: 18 additions & 0 deletions apps/client/scripts/create-collections.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!env node
import path from 'node:path'

import { createCustomCollectionFile } from '@gouvminint/vue-dsfr/meta'
import { Command } from 'commander'

const program = new Command()

program
.option('-s, --source <filepath>', 'Chemin vers le fichier de tuples [IconifyJSON, string[]]')
.option('-t, --target <filepath>', 'Chemin vers le fichier destination (src/icons.ts par défaut)')
.parse(process.argv)

const options = program.opts()

if (options.source && options.target) {
createCustomCollectionFile(path.resolve(process.cwd(), options.source), path.resolve(process.cwd(), options.target))
}
74 changes: 74 additions & 0 deletions apps/client/scripts/icons.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// @ts-check
import { icons as riCollection } from '@iconify-json/ri'

/**
* @type {string[]}
*/
const riIconNames = [
'account-circle-line',
'add-line',
'admin-line',
'alert-line',
'archive-line',
'arrow-drop-left-line',
'arrow-drop-right-line',
'arrow-go-back-line',
'arrow-left-double-line',
'arrow-right-double-line',
'arrow-right-s-line',
'arrow-up-s-line',
'award-line',
'building-line',
'check-line',
'checkbox-blank-circle-fill',
'checkbox-circle-line',
'clipboard-line',
'close-line',
'dashboard-line',
'delete-bin-7-line',
'exchange-line',
'eye-line',
'eye-off-line',
'file-download-line',
'filter-line',
'filter-off-line',
'flow-chart',
'focus-3-line',
'folder-user-line',
'folders-line',
'git-branch-line',
'git-merge-line',
'github-line',
'heart-pulse-line',
'key-2-line',
'key-2-line',
'loader-4-line',
'lock-line',
'lock-unlock-line',
'mail-line',
'microsoft-line',
'moon-clear-line',
'newspaper-line',
'pencil-line',
'refresh-line',
'restart-line',
'send-plane-line',
'server-line',
'settings-3-line',
'shield-check-line',
'sound-module-line',
'stock-line',
'sun-line',
'team-line',
'tools-line',
'upload-cloud-line',
'user-add-line',
'user-shared-2-line',
]

/**
* @type {[import('@iconify/vue').IconifyJSON, string[]][]}
*/
export const collectionsToFilter = [
[riCollection, riIconNames],
]
1 change: 0 additions & 1 deletion apps/client/src/components/AdminRoleForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { computed, onBeforeMount, ref } from 'vue'
import type { AdminPermsKeys, LettersQuery, SharedZodError, User } from '@cpn-console/shared'
import { ADMIN_PERMS, RoleSchema, adminPermsDetails, shallowEqual } from '@cpn-console/shared'
import pDebounce from 'p-debounce'
// @ts-ignore '@gouvminint/vue-dsfr' missing types
import { getRandomId } from '@gouvminint/vue-dsfr'
import SuggestionInput from './SuggestionInput.vue'
import { useUsersStore } from '@/stores/users.js'
Expand Down
8 changes: 1 addition & 7 deletions apps/client/src/components/ClusterForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -231,14 +231,8 @@ const isConnectionDetailsShown = ref(true)
Informations de connexion (kubeconfig)
</h4>
<v-icon
v-if="isConnectionDetailsShown"
name="ri:arrow-right-s-line"
class="shrink ml-4 rotate-90"
/>
<v-icon
v-else
name="ri:arrow-right-s-line"
class="shrink ml-4"
:class="`shrink ml-4 ${isConnectionDetailsShown ? 'rotate-90' : ''}`"
/>
</div>
<template
Expand Down
1 change: 0 additions & 1 deletion apps/client/src/components/EnvironmentForm.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<script lang="ts" setup>
import { computed, onBeforeMount, ref } from 'vue'
// @ts-ignore '@gouvminint/vue-dsfr' missing types
import { getRandomId } from '@gouvminint/vue-dsfr'
import type {
CleanedCluster,
Expand Down
6 changes: 3 additions & 3 deletions apps/client/src/components/LogsViewer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ async function showLogs(index: number) {
:title="hideLogDetails ? 'Afficher les logs en entier' : 'Masquer les clés non essentielles des logs'"
secondary
icon-only
:icon="hideLogDetails ? 'ri:filter-off-fill' : 'ri:filter-fill'"
:icon="hideLogDetails ? 'ri:filter-off-line' : 'ri:filter-line'"
@click="hideLogDetails = !hideLogDetails"
/>
<DsfrButton
Expand All @@ -86,7 +86,7 @@ async function showLogs(index: number) {
:title="hideLogs ? 'Afficher les logs' : 'Masquer les logs'"
secondary
icon-only
:icon="hideLogs ? 'ri:eye-off-fill' : 'ri:eye-fill'"
:icon="hideLogs ? 'ri:eye-off-line' : 'ri:eye-line'"
@click="hideLogs = !hideLogs"
/>
<DsfrButton
Expand All @@ -96,7 +96,7 @@ async function showLogs(index: number) {
secondary
icon-only
:disabled="isUpdating"
:icon="{ name: 'ri:refresh-fill', animation: isUpdating ? 'spin' : '' }"
:icon="{ name: 'ri:refresh-line', animation: isUpdating ? 'spin' : '' }"
@click="showLogs(page)"
/>
</div>
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/components/PaginationCt.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const currentStart = computed(() => Math.floor(props.page * props.step))
class="flex gap-2"
>
<DsfrButton
icon="ri:arrow-left-double-fill"
icon="ri:arrow-left-double-line"
:icon-only="true"
title="Voir la première page"
:disabled="page <= 0"
Expand Down
118 changes: 118 additions & 0 deletions apps/client/src/components/ProjectBanner.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<script lang="ts" setup>
import type { Project } from '@/utils/project-utils.js'
import { descriptionMaxLength, projectIsLockedInfo } from '@cpn-console/shared'
withDefaults(defineProps<{
project: Project
canEditDescription: boolean
}>(), {
canEditDescription: false,
})
const emits = defineEmits<{
(e: 'update:modelValue'): void
(e: 'saveDescription'): void
}>()
const isEditingDescription = ref(false)
function getDynamicTitle(locked?: Project['locked'], description?: Project['description']) {
if (locked) return projectIsLockedInfo
if (description) return 'Editer la description'
return 'Ajouter une description'
}
const modelValue = defineModel<string>()
function saveDescription() {
emits('saveDescription')
isEditingDescription.value = false
}
</script>

<template>
<div
class="fr-callout"
>
<!-- Section nom -->
<h1
class="fr-callout__title fr-mb-3w"
>
{{ project.name }}<span class="fr-callout__title fr-mb-3w italic inline opacity-70">
({{ project.organization.label }})
</span>
</h1>

<!-- Section description -->
<div
v-if="isEditingDescription"
>
<DsfrInput
v-model="modelValue"
data-testid="descriptionInput"
:is-textarea="true"
:maxlength="descriptionMaxLength"
label="Description du projet"
label-visible
:hint="`Courte description expliquant la finalité du projet (${descriptionMaxLength} caractères maximum).`"
placeholder="Application de réservation de places à l'examen du permis B."
/>
<div
class="flex justify-between"
>
<DsfrButton
data-testid="saveDescriptionBtn"
label="Enregistrer la description"
secondary
:icon="project.operationsInProgress.includes('update')
? { name: 'ri:refresh-line', animation: 'spin' }
: 'ri:send-plane-line'"
:disabled="project.operationsInProgress.includes('update')"
@click="saveDescription"
/>
<DsfrButton
label="Annuler"
primary
@click="isEditingDescription = false"
/>
</div>
</div>
<div
v-else
class="flex gap-4 items-center"
>
<p
v-if="project.description"
data-testid="descriptionP"
>
{{ project.description }}
</p>
<p
v-else
data-testid="descriptionP"
class="disabled"
>
Aucune description pour le moment...
</p>
<DsfrButton
v-if="canEditDescription"
class="fr-mt-0"
icon="ri:pencil-line"
data-testid="setDescriptionBtn"
:title="getDynamicTitle(project.locked, project.description)"
icon-only
secondary
@click="isEditingDescription = true"
/>
</div>

<!-- Section version -->
<div
v-if="project.lastSuccessProvisionningVersion"
title="Version de la console lors du dernier provisionnement réussi du projet"
>
<code
class="fr-text-default--info text-sm"
>Version:&nbsp;{{ project.lastSuccessProvisionningVersion }}</code>
</div>
</div>
</template>
2 changes: 1 addition & 1 deletion apps/client/src/components/ReplayButton.vue
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ async function replayHooks() {
<DsfrButton
data-testid="replayHooksBtn"
label="Reprovisionner le projet"
:icon="{ name: 'ri:refresh-fill', animation: operationsInProgress.includes('replay') ? 'spin' : '' }"
:icon="{ name: 'ri:refresh-line', animation: operationsInProgress.includes('replay') ? 'spin' : '' }"
secondary
:disabled="project.locked || operationsInProgress.includes('replay')"
@click="replayHooks"
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/components/SelectProject.vue
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ function selectProject(id: string) {
:class="`create-project ${projectStore.myProjects.length ? 'w-15' : ''}`"
type="buttonType"
secondary
icon="ri:add-fill"
icon="ri:add-line"
:icon-only="!!projectStore.myProjects.length"
:label="!projectStore.myProjects.length ? 'Créer un nouveau projet' : ''"
small
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/components/SideMenu.vue
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ onMounted(() => {
:active="routeName === 'SystemSettings'"
to="/admin/system-settings"
>
<v-icon name="ri:tools-fill" />
<v-icon name="ri:tools-line" />
Réglages console
</DsfrSideMenuLink>
</DsfrSideMenuListItem>
Expand Down
1 change: 0 additions & 1 deletion apps/client/src/components/TeamCt.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<script lang="ts" setup>
import { computed, onMounted, ref, watch } from 'vue'
// @ts-ignore '@gouvminint/vue-dsfr' missing types
import { getRandomId } from '@gouvminint/vue-dsfr'
import type {
LettersQuery,
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/components/TokenForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ const schema = computed(() => {
label="Enregistrer"
secondary
:icon="isCreatingToken
? { name: 'ri:refresh-fill', animation: 'spin' }
? { name: 'ri:refresh-line', animation: 'spin' }
: 'ri:send-plane-line'"
:disabled="!schema.success || !!invalidExpirationDate || isCreatingToken || (mandatoryExpiration && !newToken.expirationDate)"
class="mr-5"
Expand Down
4 changes: 4 additions & 0 deletions apps/client/src/icon-collections.ts

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions apps/client/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { addCollection } from '@iconify/vue'
import '@gouvfr/dsfr/dist/dsfr.min.css'
import '@gouvfr/dsfr/dist/utility/icons/icons.min.css'
import '@gouvfr/dsfr/dist/utility/utility.main.min.css'
import '@gouvminint/vue-dsfr/styles'
import 'vue3-json-viewer/dist/index.css'
import collections from './icon-collections.js'

// @ts-ignore 'vue3-json-viewer' missing types
import JsonViewer from 'vue3-json-viewer'
Expand All @@ -27,3 +29,7 @@ createApp(App)
.component('VIcon', VIcon)
.use(JsonViewer)
.mount('#app')

for (const collection of collections) {
addCollection(collection)
}
Loading

0 comments on commit 22c1ccd

Please sign in to comment.