mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 04:01:10 -04:00
Compare commits
3 Commits
dark-base-
...
test-uffiz
| Author | SHA1 | Date | |
|---|---|---|---|
| 5a8e30d748 | |||
| e0e9aff6d1 | |||
| abc66dd768 |
9
.github/workflows/uffizzi-build.yml
vendored
9
.github/workflows/uffizzi-build.yml
vendored
@ -14,8 +14,6 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout git repo
|
- name: Checkout git repo
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Generate UUID image name
|
- name: Generate UUID image name
|
||||||
id: uuid
|
id: uuid
|
||||||
run: echo "UUID_TAG_APP=$(uuidgen)" >> $GITHUB_ENV
|
run: echo "UUID_TAG_APP=$(uuidgen)" >> $GITHUB_ENV
|
||||||
@ -33,11 +31,10 @@ jobs:
|
|||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
file: ./uffizzi/Dockerfile
|
file: ./uffizzi/Dockerfile
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
|
|
||||||
build-nginx:
|
build-nginx:
|
||||||
|
needs:
|
||||||
|
- build-application
|
||||||
name: Build and Push `nginx`
|
name: Build and Push `nginx`
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
||||||
@ -65,6 +62,8 @@ jobs:
|
|||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
file: ./uffizzi/nginx/Dockerfile
|
file: ./uffizzi/nginx/Dockerfile
|
||||||
|
build-args: |
|
||||||
|
BASE_IMAGE=${{ needs.build-application.outputs.tags }}
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,8 @@
|
|||||||
class="h-screen h-screen-ios overflow-y-auto md:pl-56 xl:pl-64 min-h-0"
|
class="h-screen h-screen-ios overflow-y-auto md:pl-56 xl:pl-64 min-h-0"
|
||||||
>
|
>
|
||||||
<div class="pt-16 pb-16">
|
<div class="pt-16 pb-16">
|
||||||
|
<h1>Testing</h1>
|
||||||
|
|
||||||
<router-view />
|
<router-view />
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="h-screen overflow-y-auto text-base">
|
<div class="h-screen overflow-y-auto text-base">
|
||||||
|
<h1>Testing</h1>
|
||||||
<NotificationRoot />
|
<NotificationRoot />
|
||||||
|
|
||||||
<div class="container mx-auto px-4">
|
<div class="container mx-auto px-4">
|
||||||
|
|||||||
@ -93,6 +93,9 @@
|
|||||||
>
|
>
|
||||||
{{ pageHeading }}
|
{{ pageHeading }}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
|
<h1>Testing</h1>
|
||||||
|
|
||||||
<p
|
<p
|
||||||
class="
|
class="
|
||||||
hidden
|
hidden
|
||||||
|
|||||||
@ -15,13 +15,6 @@
|
|||||||
bg-gradient-to-r
|
bg-gradient-to-r
|
||||||
from-primary-500
|
from-primary-500
|
||||||
to-primary-400
|
to-primary-400
|
||||||
dark:from-gray-700/70 dark:to-gray-800/70
|
|
||||||
bg-primary-500
|
|
||||||
dark:bg-transparent
|
|
||||||
dark:backdrop-blur-xl
|
|
||||||
dark:shadow-glass
|
|
||||||
dark:border
|
|
||||||
dark:border-white/10
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<router-link
|
<router-link
|
||||||
@ -60,7 +53,6 @@
|
|||||||
cursor-pointer
|
cursor-pointer
|
||||||
md:hidden md:ml-0
|
md:hidden md:ml-0
|
||||||
hover:bg-gray-100
|
hover:bg-gray-100
|
||||||
dark:bg-gray-800 dark:border-gray-500 dark:border
|
|
||||||
"
|
"
|
||||||
@click.prevent="onToggle"
|
@click.prevent="onToggle"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -15,9 +15,7 @@
|
|||||||
leave-from="opacity-100"
|
leave-from="opacity-100"
|
||||||
leave-to="opacity-0"
|
leave-to="opacity-0"
|
||||||
>
|
>
|
||||||
<DialogOverlay
|
<DialogOverlay class="fixed inset-0 bg-gray-600 bg-opacity-75" />
|
||||||
class="fixed inset-0 bg-gray-600 bg-opacity-75 dark:bg-gray-900/90"
|
|
||||||
/>
|
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
@ -29,9 +27,7 @@
|
|||||||
leave-from="translate-x-0"
|
leave-from="translate-x-0"
|
||||||
leave-to="-translate-x-full"
|
leave-to="-translate-x-full"
|
||||||
>
|
>
|
||||||
<div
|
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white">
|
||||||
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
|
|
||||||
>
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
as="template"
|
as="template"
|
||||||
enter="ease-in-out duration-300"
|
enter="ease-in-out duration-300"
|
||||||
@ -44,17 +40,18 @@
|
|||||||
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
||||||
<button
|
<button
|
||||||
class="
|
class="
|
||||||
flex
|
flex
|
||||||
items-center
|
items-center
|
||||||
justify-center
|
justify-center
|
||||||
w-10
|
w-10
|
||||||
h-10
|
h-10
|
||||||
ml-1
|
ml-1
|
||||||
rounded-full
|
rounded-full
|
||||||
focus:outline-none
|
focus:outline-none
|
||||||
focus:ring-2
|
focus:ring-2
|
||||||
focus:ring-inset
|
focus:ring-inset
|
||||||
focus:ring-white"
|
focus:ring-white
|
||||||
|
"
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
>
|
>
|
||||||
<span class="sr-only">Close sidebar</span>
|
<span class="sr-only">Close sidebar</span>
|
||||||
@ -85,8 +82,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||||
: 'text-black dark:text-gray-300',
|
: 'text-black',
|
||||||
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
@ -103,10 +100,6 @@
|
|||||||
/>
|
/>
|
||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
<LightDarkSwitch
|
|
||||||
:show-label="false"
|
|
||||||
class="absolute right-6 top-6 !w-auto"
|
|
||||||
/>
|
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -120,16 +113,17 @@
|
|||||||
<!-- DESKTOP MENU -->
|
<!-- DESKTOP MENU -->
|
||||||
<div
|
<div
|
||||||
class="
|
class="
|
||||||
hidden
|
hidden
|
||||||
w-56
|
w-56
|
||||||
h-screen
|
h-screen
|
||||||
bg-white
|
pb-32
|
||||||
border-r border-gray-200 border-solid
|
overflow-y-auto
|
||||||
xl:w-64
|
bg-white
|
||||||
md:fixed md:flex md:flex-col md:inset-y-0
|
border-r border-gray-200 border-solid
|
||||||
pt-16
|
xl:w-64
|
||||||
dark:border-gray-800
|
md:fixed md:flex md:flex-col md:inset-y-0
|
||||||
dark:bg-gray-800/80"
|
pt-16
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="menu in globalStore.menuGroups"
|
v-for="menu in globalStore.menuGroups"
|
||||||
@ -142,8 +136,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:border-primary-400 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||||
: 'text-black dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
|
: 'text-black',
|
||||||
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
@ -151,8 +145,8 @@
|
|||||||
:name="item.icon"
|
:name="item.icon"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
|
? 'text-primary-500 group-hover:text-primary-500 '
|
||||||
: 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
|
: 'text-gray-400 group-hover:text-black',
|
||||||
'mr-4 shrink-0 h-5 w-5 ',
|
'mr-4 shrink-0 h-5 w-5 ',
|
||||||
]"
|
]"
|
||||||
/>
|
/>
|
||||||
@ -160,9 +154,6 @@
|
|||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<LightDarkSwitch
|
|
||||||
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -178,7 +169,6 @@ import {
|
|||||||
|
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
|
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const globalStore = useGlobalStore()
|
const globalStore = useGlobalStore()
|
||||||
|
|||||||
@ -34,7 +34,6 @@ export const useGlobalStore = (useWindow = false) => {
|
|||||||
isAppLoaded: false,
|
isAppLoaded: false,
|
||||||
isSidebarOpen: false,
|
isSidebarOpen: false,
|
||||||
areCurrenciesLoading: false,
|
areCurrenciesLoading: false,
|
||||||
isDarkModeOn: false,
|
|
||||||
|
|
||||||
downloadReport: null,
|
downloadReport: null,
|
||||||
}),
|
}),
|
||||||
@ -71,8 +70,8 @@ export const useGlobalStore = (useWindow = false) => {
|
|||||||
moduleStore.apiToken = response.data.global_settings.api_token
|
moduleStore.apiToken = response.data.global_settings.api_token
|
||||||
moduleStore.enableModules = response.data.modules
|
moduleStore.enableModules = response.data.modules
|
||||||
|
|
||||||
// company store
|
// company store
|
||||||
companyStore.companies = response.data.companies
|
companyStore.companies = response.data.companies
|
||||||
companyStore.selectedCompany = response.data.current_company
|
companyStore.selectedCompany = response.data.current_company
|
||||||
companyStore.setSelectedCompany(response.data.current_company)
|
companyStore.setSelectedCompany(response.data.current_company)
|
||||||
companyStore.selectedCompanySettings =
|
companyStore.selectedCompanySettings =
|
||||||
|
|||||||
@ -1,101 +0,0 @@
|
|||||||
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { Switch, SwitchGroup, SwitchLabel } from '@headlessui/vue'
|
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
|
||||||
import { computed, ref } from 'vue'
|
|
||||||
defineProps({
|
|
||||||
showLabel: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
vertical: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const globalStore = useGlobalStore()
|
|
||||||
|
|
||||||
const enabled = ref(
|
|
||||||
localStorage.getItem('theme') === 'dark' ||
|
|
||||||
document.documentElement.classList.contains('dark')
|
|
||||||
)
|
|
||||||
|
|
||||||
globalStore.isDarkModeOn = enabled
|
|
||||||
|
|
||||||
function onChange(val) {
|
|
||||||
if (val) {
|
|
||||||
localStorage.theme = 'dark'
|
|
||||||
document.documentElement.classList.add('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'dark')
|
|
||||||
globalStore.isDarkModeOn = true
|
|
||||||
} else {
|
|
||||||
localStorage.theme = 'light'
|
|
||||||
document.documentElement.classList.remove('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'light')
|
|
||||||
globalStore.isDarkModeOn = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="w-full flex justify-center">
|
|
||||||
<SwitchGroup
|
|
||||||
as="div"
|
|
||||||
class="flex items-center"
|
|
||||||
:class="vertical ? 'flex-col justify-center' : 'flex-row'"
|
|
||||||
>
|
|
||||||
<Switch
|
|
||||||
v-model="enabled"
|
|
||||||
class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:ring-offset-gray-700"
|
|
||||||
:class="[enabled ? 'bg-primary-600' : 'bg-gray-200']"
|
|
||||||
@update:modelValue="onChange"
|
|
||||||
>
|
|
||||||
<span class="sr-only">Use setting</span>
|
|
||||||
<span
|
|
||||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"
|
|
||||||
:class="[enabled ? 'translate-x-5' : 'translate-x-0']"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
|
||||||
:class="[
|
|
||||||
enabled
|
|
||||||
? 'opacity-0 ease-out duration-100'
|
|
||||||
: 'opacity-100 ease-in duration-200',
|
|
||||||
]"
|
|
||||||
aria-hidden="true"
|
|
||||||
>
|
|
||||||
<BaseIcon class="h-3 w-3 text-yellow-500" name="SunIcon" />
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
|
||||||
:class="[
|
|
||||||
enabled
|
|
||||||
? 'opacity-100 ease-in duration-200'
|
|
||||||
: 'opacity-0 ease-out duration-100',
|
|
||||||
]"
|
|
||||||
aria-hidden="true"
|
|
||||||
>
|
|
||||||
<BaseIcon class="h-3 w-3 text-primary-500" name="MoonIcon" />
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
</Switch>
|
|
||||||
<SwitchLabel
|
|
||||||
v-if="showLabel"
|
|
||||||
as="span"
|
|
||||||
class="cursor-pointer"
|
|
||||||
:class="vertical ? 'px-1 text-center mt-2' : 'ml-3'"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
v-if="enabled"
|
|
||||||
class="text-sm font-medium text-gray-500 dark:text-gray-400"
|
|
||||||
>
|
|
||||||
Dark Mode
|
|
||||||
</span>
|
|
||||||
<span v-else class="text-sm font-medium text-gray-500">
|
|
||||||
Light Mode
|
|
||||||
</span>
|
|
||||||
</SwitchLabel>
|
|
||||||
</SwitchGroup>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@ -7,18 +7,11 @@
|
|||||||
relative
|
relative
|
||||||
overflow-hidden
|
overflow-hidden
|
||||||
bg-white
|
bg-white
|
||||||
border-b
|
border-b border-gray-200
|
||||||
border-gray-200
|
|
||||||
shadow
|
shadow
|
||||||
sm:rounded-lg
|
sm:rounded-lg
|
||||||
dark:shadow-glass
|
"
|
||||||
dark:border
|
|
||||||
dark:border-white/10
|
|
||||||
dark:bg-gray-800/70
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<BaseDarkHighlight v-if="darkHighlight" class="z-[-1]" />
|
|
||||||
|
|
||||||
<slot name="header" />
|
<slot name="header" />
|
||||||
<table :class="tableClass">
|
<table :class="tableClass">
|
||||||
<thead :class="theadClass">
|
<thead :class="theadClass">
|
||||||
@ -58,11 +51,7 @@
|
|||||||
<tr
|
<tr
|
||||||
v-for="placeRow in placeholderCount"
|
v-for="placeRow in placeholderCount"
|
||||||
:key="placeRow"
|
:key="placeRow"
|
||||||
:class="
|
:class="placeRow % 2 === 0 ? 'bg-white' : 'bg-gray-50'"
|
||||||
placeRow % 2 === 0
|
|
||||||
? 'bg-white dark:bg-gray-800'
|
|
||||||
: 'bg-gray-50 dark:bg-gray-800'
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<td
|
<td
|
||||||
v-for="column in columns"
|
v-for="column in columns"
|
||||||
@ -86,11 +75,7 @@
|
|||||||
<tr
|
<tr
|
||||||
v-for="(row, index) in sortedRows"
|
v-for="(row, index) in sortedRows"
|
||||||
:key="index"
|
:key="index"
|
||||||
:class="
|
:class="index % 2 === 0 ? 'bg-white' : 'bg-gray-50'"
|
||||||
index % 2 === 0
|
|
||||||
? 'bg-white dark:bg-transparent'
|
|
||||||
: 'bg-gray-50 dark:bg-gray-700/20 dark:border-y dark:border-gray-600'
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<td
|
<td
|
||||||
v-for="column in columns"
|
v-for="column in columns"
|
||||||
@ -118,10 +103,7 @@
|
|||||||
justify-center
|
justify-center
|
||||||
w-full
|
w-full
|
||||||
h-full
|
h-full
|
||||||
bg-white
|
bg-white bg-opacity-60
|
||||||
bg-opacity-60
|
|
||||||
dark:bg-gray-700
|
|
||||||
dark:bg-opacity-60
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<SpinnerIcon class="w-10 h-10 text-primary-500" />
|
<SpinnerIcon class="w-10 h-10 text-primary-500" />
|
||||||
@ -181,12 +163,9 @@ const props = defineProps({
|
|||||||
sortOrder: { type: String, default: '' },
|
sortOrder: { type: String, default: '' },
|
||||||
tableClass: {
|
tableClass: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'min-w-full divide-y divide-gray-200 dark:divide-gray-600',
|
default: 'min-w-full divide-y divide-gray-200',
|
||||||
},
|
|
||||||
theadClass: {
|
|
||||||
type: String,
|
|
||||||
default: 'bg-gray-50 dark:bg-gray-800 dark:text-white',
|
|
||||||
},
|
},
|
||||||
|
theadClass: { type: String, default: 'bg-gray-50' },
|
||||||
tbodyClass: { type: String, default: '' },
|
tbodyClass: { type: String, default: '' },
|
||||||
noResultsMessage: {
|
noResultsMessage: {
|
||||||
type: String,
|
type: String,
|
||||||
@ -207,10 +186,6 @@ const props = defineProps({
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 3,
|
default: 3,
|
||||||
},
|
},
|
||||||
darkHighlight: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
let rows = reactive([])
|
let rows = reactive([])
|
||||||
@ -261,7 +236,7 @@ function getColumn(columnName) {
|
|||||||
|
|
||||||
function getThClass(column) {
|
function getThClass(column) {
|
||||||
let classes =
|
let classes =
|
||||||
'whitespace-nowrap px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider dark:text-white'
|
'whitespace-nowrap px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider'
|
||||||
|
|
||||||
if (column.defaultThClass) {
|
if (column.defaultThClass) {
|
||||||
classes = column.defaultThClass
|
classes = column.defaultThClass
|
||||||
@ -281,8 +256,7 @@ function getThClass(column) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getTdClass(column) {
|
function getTdClass(column) {
|
||||||
let classes =
|
let classes = 'px-6 py-4 text-sm text-gray-500 whitespace-nowrap'
|
||||||
'px-6 py-4 text-sm text-gray-500 whitespace-nowrap dark:text-gray-300'
|
|
||||||
|
|
||||||
if (column.defaultTdClass) {
|
if (column.defaultTdClass) {
|
||||||
classes = column.defaultTdClass
|
classes = column.defaultTdClass
|
||||||
@ -335,7 +309,6 @@ function changeSorting(column) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!usesLocalData.value) {
|
if (!usesLocalData.value) {
|
||||||
if (pagination.value) pagination.value.currentPage = 1
|
|
||||||
mapDataToRows()
|
mapDataToRows()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,9 +326,7 @@ async function pageChange(page) {
|
|||||||
await mapDataToRows()
|
await mapDataToRows()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function refresh(isPreservePage = false) {
|
async function refresh() {
|
||||||
if (pagination.value && !isPreservePage) pagination.value.currentPage = 1
|
|
||||||
|
|
||||||
await mapDataToRows()
|
await mapDataToRows()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||||
|
|
||||||
<!-- Module Styles -->
|
<!-- Module Styles -->
|
||||||
@foreach (\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
|
@foreach(\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
|
||||||
<link rel="stylesheet" href="/modules/styles/{{ $name }}">
|
<link rel="stylesheet" href="/modules/styles/{{ $name }}">
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
@ -25,8 +25,8 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body
|
<body
|
||||||
class="h-full overflow-hidden bg-gray-100 dark:bg-gray-900 dark:text-white font-base
|
class="h-full overflow-hidden bg-gray-100 font-base
|
||||||
@if (isset($current_theme)) theme-{{ $current_theme }} @else theme-{{ get_app_setting('admin_portal_theme') ?? 'crater' }} @endif ">
|
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'crater'}} @endif ">
|
||||||
|
|
||||||
<!-- Module Scripts -->
|
<!-- Module Scripts -->
|
||||||
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
||||||
@ -38,14 +38,6 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
|
||||||
document.documentElement.classList.add('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'dark');
|
|
||||||
} else {
|
|
||||||
document.documentElement.classList.remove('dark')
|
|
||||||
document.documentElement.style.setProperty('color-scheme', 'light')
|
|
||||||
}
|
|
||||||
|
|
||||||
@if(isset($customer_logo))
|
@if(isset($customer_logo))
|
||||||
|
|
||||||
window.customer_logo = "/storage/{{$customer_logo}}"
|
window.customer_logo = "/storage/{{$customer_logo}}"
|
||||||
|
|||||||
@ -19,7 +19,6 @@ module.exports = {
|
|||||||
'./resources/scripts/**/*.js',
|
'./resources/scripts/**/*.js',
|
||||||
'./resources/scripts/**/*.vue',
|
'./resources/scripts/**/*.vue',
|
||||||
],
|
],
|
||||||
darkMode: 'class',
|
|
||||||
theme: {
|
theme: {
|
||||||
extend: {
|
extend: {
|
||||||
colors: {
|
colors: {
|
||||||
|
|||||||
@ -11,7 +11,8 @@ RUN apt-get update && apt-get install -y \
|
|||||||
unzip \
|
unzip \
|
||||||
libzip-dev \
|
libzip-dev \
|
||||||
libmagickwand-dev \
|
libmagickwand-dev \
|
||||||
mariadb-client
|
mariadb-client \
|
||||||
|
npm
|
||||||
|
|
||||||
# Clear cache
|
# Clear cache
|
||||||
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
|
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||||
@ -45,4 +46,19 @@ RUN chmod -R 775 composer.json composer.lock \
|
|||||||
RUN chown -R $(whoami):$(whoami) /var/log/
|
RUN chown -R $(whoami):$(whoami) /var/log/
|
||||||
RUN chmod -R 775 /var/log
|
RUN chmod -R 775 /var/log
|
||||||
|
|
||||||
|
# Cleanup manually generated build files
|
||||||
|
RUN rm -rf /var/www/public/build
|
||||||
|
RUN npm config set user 0
|
||||||
|
RUN npm config set unsafe-perm true
|
||||||
|
# Frontend bulding
|
||||||
|
RUN sed -i 's/DB_CONNECTION=mysql/DB_CONNECTION=sqlite/g' /var/www/.env
|
||||||
|
RUN sed -i 's/DB_DATABASE=crater/DB_DATABASE=\/tmp\/crater.sqlite/g' /var/www/.env
|
||||||
|
RUN touch /tmp/crater.sqlite
|
||||||
|
RUN composer install --no-interaction --prefer-dist
|
||||||
|
RUN npm i -f
|
||||||
|
RUN npm install --save-dev sass
|
||||||
|
RUN export NODE_OPTIONS="--max-old-space-size=4096" && /usr/bin/npx vite build --target=es2020
|
||||||
|
RUN sed -i 's/DB_CONNECTION=sqlite/DB_CONNECTION=mysql/g' /var/www/.env
|
||||||
|
RUN sed -i 's/DB_DATABASE=\/tmp\/crater.sqlite/DB_DATABASE=crater/g' /var/www/.env
|
||||||
|
|
||||||
USER crater-user
|
USER crater-user
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
|
ARG BASE_IMAGE
|
||||||
|
|
||||||
|
FROM $BASE_IMAGE as build
|
||||||
FROM nginx:1.17-alpine
|
FROM nginx:1.17-alpine
|
||||||
|
|
||||||
RUN rm /etc/nginx/conf.d/default.conf
|
RUN rm /etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
COPY ./ /var/www
|
COPY --from=build /var/www /var/www
|
||||||
COPY ./uffizzi/nginx/nginx /etc/nginx/conf.d/
|
COPY ./uffizzi/nginx/nginx /etc/nginx/conf.d/
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user