Compare commits

...

10 Commits

11 changed files with 6436 additions and 13 deletions
+6146
View File
File diff suppressed because it is too large Load Diff
+33
View File
@@ -0,0 +1,33 @@
{
"name": "fhc-core",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"build": "rollup -c",
"watch": "rollup --watch -c"
},
"dependencies": {
"@vuepic/vue-datepicker": "^7.2.0",
"axios": "^1.6.8",
"primevue": "^3.29.1",
"tabulator-tables": "^5.5.2",
"vue": "^3.3.8",
"vue-router": "^4.1.3"
},
"devDependencies": {
"@rollup/plugin-alias": "^5.1.0",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4",
"babel-plugin-transform-class-properties": "^6.24.1",
"glob": "^10.3.10",
"node-sass": "^9.0.0",
"rollup": "^4.13.2",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-vue": "^6.0.0"
}
}
+2 -2
View File
@@ -1,5 +1,5 @@
import {CoreFilterCmpt} from '../components/Filter.js'; import {CoreFilterCmpt} from '../components/filter/Filter.js';
import {CoreNavigationCmpt} from '../components/Navigation.js'; import {CoreNavigationCmpt} from '../components/navigation/Navigation.js';
import verticalsplit from "../components/verticalsplit/verticalsplit.js"; import verticalsplit from "../components/verticalsplit/verticalsplit.js";
import searchbar from "../components/searchbar/searchbar.js"; import searchbar from "../components/searchbar/searchbar.js";
import fhcapifactory from "./api/fhcapifactory.js"; import fhcapifactory from "./api/fhcapifactory.js";
+3 -2
View File
@@ -1,3 +1,4 @@
import { markRaw, defineAsyncComponent } from 'vue';
import {CoreRESTClient} from '../RESTClient.js'; import {CoreRESTClient} from '../RESTClient.js';
import accessibility from "../directives/accessibility.js"; import accessibility from "../directives/accessibility.js";
@@ -70,7 +71,7 @@ export default {
return console.error('Component missing for ' + key); return console.error('Component missing for ' + key);
tabs[key] = { tabs[key] = {
component: Vue.markRaw(Vue.defineAsyncComponent(() => import(item.component))), component: markRaw(defineAsyncComponent(() => import(item.component))),
title: item.title || key, title: item.title || key,
config: item.config, config: item.config,
key key
@@ -82,7 +83,7 @@ export default {
return console.error('Component missing for ' + key); return console.error('Component missing for ' + key);
tabs[key] = { tabs[key] = {
component: Vue.markRaw(Vue.defineAsyncComponent(() => import(item.component))), component: markRaw(defineAsyncComponent(() => import(item.component))),
title: item.title || key, title: item.title || key,
config: item.config, config: item.config,
key key
+1
View File
@@ -15,6 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { TabulatorFull as Tabulator } from 'tabulator-tables';
import {CoreFilterAPIs} from './API.js'; import {CoreFilterAPIs} from './API.js';
import {CoreRESTClient} from '../../RESTClient.js'; import {CoreRESTClient} from '../../RESTClient.js';
import {CoreFetchCmpt} from '../../components/Fetch.js'; import {CoreFetchCmpt} from '../../components/Fetch.js';
+7 -5
View File
@@ -1,3 +1,5 @@
import { ref, unref, triggerRef } from 'vue';
const categories = {}; const categories = {};
const loadingModules = {}; const loadingModules = {};
@@ -12,8 +14,8 @@ function reloadRefs(category) {
while (loadingModules[category].length) { while (loadingModules[category].length) {
var v = loadingModules[category].pop(); var v = loadingModules[category].pop();
v[0].value = getValueForLoadedPhrase(category, v[1], v[2]); v[0].value = getValueForLoadedPhrase(category, v[1], v[2]);
Vue.triggerRef(v[0]); triggerRef(v[0]);
/*Vue.unref(v);*/ /*unref(v);*/
} }
} }
function loadLazy(category, val, phrase, params) { function loadLazy(category, val, phrase, params) {
@@ -70,16 +72,16 @@ const phrasen = {
if (!categories[category] || Object.keys(categories[category]).length === 0) { if (!categories[category] || Object.keys(categories[category]).length === 0) {
categories[category] = undefined; categories[category] = undefined;
let val = Vue.ref(initialval); let val = ref(initialval);
loadLazy(category, val, phrase, params); loadLazy(category, val, phrase, params);
return val; return val;
} }
} }
var result = getValueForLoadedPhrase(category, phrase, params); var result = getValueForLoadedPhrase(category, phrase, params);
return Vue.ref(result); return ref(result);
}, },
t(category, phrase, params) { t(category, phrase, params) {
return Vue.unref(this.t_ref(category, phrase, params)); return unref(this.t_ref(category, phrase, params));
} }
}; };
+9 -1
View File
@@ -92,16 +92,24 @@
* @param mixed message * @param mixed message
* @return void * @return void
*/ */
/*
import PvConfig from "../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js"; import PvConfig from "../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js";
import PvToast from "../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js"; import PvToast from "../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js";
import PvConfirm from "../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js"; import PvConfirm from "../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js";
import PvConfirmationService from "../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js"; import PvConfirmationService from "../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js";
*/
import { createApp } from 'vue';
import PvConfig from 'primevue/config';
import PvToast from 'primevue/toast';
import PvConfirm from 'primevue/confirmdialog';
import PvConfirmationService from 'primevue/confirmationservice';
import {CoreRESTClient} from '../RESTClient.js'; import {CoreRESTClient} from '../RESTClient.js';
const helperAppContainer = document.createElement('div'); const helperAppContainer = document.createElement('div');
const helperApp = Vue.createApp({ const helperApp = createApp({
components: { components: {
PvToast, PvToast,
PvConfirm PvConfirm
+5 -3
View File
@@ -1,4 +1,6 @@
const categories = Vue.reactive({}); import { reactive, computed } from 'vue';
const categories = reactive({});
const loadingModules = {}; const loadingModules = {};
function extractCategory(obj, category) { function extractCategory(obj, category) {
@@ -35,7 +37,7 @@ const phrasen = {
}, },
t_ref(category, phrase, params) { t_ref(category, phrase, params) {
console.warn('depricated'); console.warn('depricated');
return Vue.computed(() => this.t(category, phrase, params)); return computed(() => this.t(category, phrase, params));
}, },
t(category, phrase, params) { t(category, phrase, params) {
if (params === undefined && ( if (params === undefined && (
@@ -49,7 +51,7 @@ const phrasen = {
console.error('invalid input', category, phrase, params); console.error('invalid input', category, phrase, params);
return ''; return '';
} }
let val = Vue.computed(() => { let val = computed(() => {
if (!categories[category]) if (!categories[category])
return ''; return '';
return getValueForLoadedPhrase(category, phrase, params); return getValueForLoadedPhrase(category, phrase, params);
+25
View File
@@ -0,0 +1,25 @@
***NVM installieren***
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
oder
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
***Node.js installieren***
nvm install --lts
***package.json***
npm install
***Rollup build***
einmalig:
npm run build
als watch bei Änderungen:
npm run watch
+99
View File
@@ -0,0 +1,99 @@
import babel from '@rollup/plugin-babel';
import nodeResolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import vue from "rollup-plugin-vue";
import { globSync } from 'glob';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import postcss from 'rollup-plugin-postcss';
import replace from '@rollup/plugin-replace';
import alias from '@rollup/plugin-alias';
import { existsSync } from 'node:fs';
import terser from '@rollup/plugin-terser';
import json from '@rollup/plugin-json';
function FhcResolver () {
return {
name: 'fhc-resolver', // this name will show up in logs and errors
resolveId ( source, importer, options ) {
if( source.includes('.php') ) {
return false;
}
//console.log('source: ' + source + ' options.isEntry: ' + options.isEntry + ' importer: ' + importer);
if(importer !== undefined && !options.isEntry && !path.isAbsolute(source)) {
let tmp = path.dirname(importer);
if( importer.includes('/application/') ) {
tmp = tmp.replace(/public\/js\//, 'js/').replace(/\/application\//, '/public/');
}
const resolved = path.resolve(tmp, source);
//console.log(resolved);
if( existsSync(resolved) ) {
return resolved
}
}
return null; // other ids should be handled as usually
}
};
}
export default {
input: Object.fromEntries(
globSync('public/**/js/apps/**/*.js', {follow: true, realpath: true}).map(file => {
if( path.dirname(file).includes('/dist/') || path.dirname(file).includes('/apps/vbform') ) {
return null;
}
// This remove `src/` as well as the file extension from each
// file, so e.g. src/nested/foo.js becomes nested/foo
return [path.relative(
'',
file.slice(0, file.length - path.extname(file).length)
).replace(/public\//, 'public/dist/'),
// This expands the relative paths to absolute paths, so e.g.
// src/nested/foo becomes /project/src/nested/foo.js
fileURLToPath(new URL(file, import.meta.url))]
}).filter(Boolean)
),
plugins: [
alias({
entries: {
vue: 'vue/dist/vue.esm-bundler.js'
}
}),
nodeResolve({
preferBuiltins: true,
moduleDirectories: ['node_modules'],
modulePaths: globSync('application/extensions/*/node_modules', {follow: true, realpath: true}).map(file =>
fileURLToPath(new URL(file, import.meta.url))
),
}),
FhcResolver(),
replace({
preventAssignment: true,
'process.env.NODE_ENV': JSON.stringify( 'production' ),
}),
commonjs(),
vue(),
json(),
babel({
babelHelpers: 'bundled',
plugins: ['transform-class-properties']
}),
postcss({
extract: false,
modules: true,
use: ['sass'],
}),
terser()
],
watch: {
buildDelay: 500
},
output: {
preserveModules: false,
sourcemap: true,
format: 'es',
dir: './',
//manualChunks: {}
chunkFileNames: 'public/dist/js/includes/[name]-[hash].js'
}
};
+106
View File
@@ -0,0 +1,106 @@
import babel from '@rollup/plugin-babel';
import nodeResolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import vue from "rollup-plugin-vue";
import { globSync } from 'glob';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import postcss from 'rollup-plugin-postcss';
import replace from '@rollup/plugin-replace';
import alias from '@rollup/plugin-alias';
import { existsSync } from 'node:fs';
import terser from '@rollup/plugin-terser';
import json from '@rollup/plugin-json';
function FhcResolver () {
return {
name: 'fhc-resolver', // this name will show up in logs and errors
resolveId ( source, importer, options ) {
if( source.includes('.php') ) {
return false;
}
//console.log('source: ' + source + ' options.isEntry: ' + options.isEntry + ' importer: ' + importer);
if(importer !== undefined && !options.isEntry && !path.isAbsolute(source)) {
let tmp = path.dirname(importer);
if( importer.includes('/application/') ) {
tmp = tmp.replace(/public\/js\//, 'js/').replace(/\/application\//, '/public/');
}
const resolved = path.resolve(tmp, source);
//console.log(resolved);
if( existsSync(resolved) ) {
return resolved
}
}
return null; // other ids should be handled as usually
}
};
}
const useplugins = [
alias({
entries: {
vue: 'vue/dist/vue.esm-bundler.js',
}
}),
commonjs(),
nodeResolve({
module: true,
jsnext: true,
preferBuiltins: true,
browser: true,
moduleDirectories: ['node_modules'],
modulePaths: globSync('application/extensions/*/node_modules', {follow: true, realpath: true}).map(file =>
fileURLToPath(new URL(file, import.meta.url))
),
}),
json({
compact: true
}),
FhcResolver(),
replace({
preventAssignment: true,
'process.env.NODE_ENV': JSON.stringify( 'production' ),
}),
vue(),
babel({
babelHelpers: 'bundled',
plugins: ['transform-class-properties'],
}),
/*
postcss({
extract: false,
modules: true,
use: ['sass'],
}),
*/
terser()
];
export default globSync('public/**/js/apps/**/*.js', {follow: true, realpath: true}).map(file => {
if( path.dirname(file).includes('/dist/') || path.dirname(file).includes('/apps/vbform') ) {
return null;
}
let tmp = fileURLToPath(new URL(file, import.meta.url));
let cssfile = path.basename(tmp.replace(/\.js/, '.css'));
console.log('cssfile: ' + cssfile);
let cssplugin = [
postcss({
extract: cssfile,
minimize: true,
sourceMap: true
})
];
return {
input: tmp,
plugins: [...useplugins, ...cssplugin],
watch: {
buildDelay: 500
},
output: {
preserveModules: false,
sourcemap: true,
format: 'es',
file: tmp.replace(/public\//, 'public/dist/'),
}
}
}).filter(Boolean);